ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 在 Lotus Notes 8 中开发复合应用

在 Lotus Notes 8 中开发复合应用

原创 Linux操作系统 作者:genusBIT 时间:2009-04-13 15:18:39 0 删除 编辑

复合应用的基本定义与 Property Broker 编程模式

那么什么是复合应用(Composite Application)?一个标准的定义如下:复合应用是 为了满足特定的业务目的而被放在一起的一套组件。如果觉得这个定义太抽象,那么下面这个例子可以给大家一个感性认识。


图 1. 复合应用范例
图 1. 复合应用范例

这是一个用 Notes 8 打开的应用(ComAppTest.NSF),你一眼能看出它和过去你所见到 Notes 的帧结构、视图、表单等等这些元素全不相同但又似曾相识。在这个应用中,你看到了左上方展示新闻列表的 Notes 视图,看到了右下方展示每篇新闻内容的 Notes 表单。此外,你还会看到左下方的图片缩略表,和右上方的图片大图展示,但它们都不是 Notes 元素,而是两个 Eclipse 插件。所有这些东西(当然,它们有个正式的名称——组件),为了一个业务目的(展现新闻内容和图片)而组装在一起,这就构成了一个复合应用

不只是组装,组件之间还可以传递消息。还是看上面这个例子,当我们点击左上方新闻列表中的某篇新闻时,会把该新闻的新闻编号传递给其他组件,这样右下方的 Notes 表单组件会根据该编号显示新闻的详细信息,右上方的 Eclipse 组件会根据该编号显示新闻的图片内容。这里我们把所传递这个信息叫做“属性”(Property),把各个组件根据外来属性所做的动作称为“操作”(ActionOperation)。通过 Notes 8 环境中提供的 Property Broker 机制,复合应用可以在不同的组件之间传递属性,执行操作。这种编程模式,我们也称之为 Property Broker 的编程模式。


图 2. Property Broker 编程模型
图 2. Property Broker 编程模型

Property Broker 编程模式的基本设计理念总结如下:

  • 属性是类型化的可交换数据
  • 操作是消费属性的行为
  • 组件定义自身的属性和操作
  • 连接(Wire)将属性和操作相关联

在这种编程模式下,程序的开发很大程度上就是组件的开发。而开发组件首先要定义组件的属性和操作,并把这种定义通过 WSDL 描述出来。然后实现组件属性的发布,以及其他组件如何接收属性并执行对应的操作。开发好组件之后,用户可以把这些组件加入到一个复合应用中去,并通过连接(wire)将类型匹配的属性操作相关联。这样在复合应用运行时,以上图为例,当新闻列表发出了一篇新闻的 News ID 作为属性时,property broker 将通过连接查找到与之相关的组件和操作,并把该 News ID 值传递给相应组件(上例中为缩略图展现组件),由该组件执行缩略图展现操作。

熟悉 IBM WebSphere Portal 开发的人会意识到,这和 Portal 中的点击即动Click To Action 以下简称 C2A)的功能非常类似。事实上,不只是形似,Notes 8 中的复合应用在实现上与 Portal 的 C2A 也有非常紧密的关系。举个例子,为了描述每个组件的属性和操作,需要有一个 WSDL 描述文件,而 Notes 8 中这个文件的格式几乎完全照搬了 C2A。

如果探循的再深一些你会发现,整个复合应用的概念最早正是来自于 IBM WebSphere Portal。所以我们强调一点:复合应用并不是绑定到 Notes 8 的一种应用模式。复合应用有很多种实现载体(Portal,Lotus Expeditor 等等),Notes 8 上的复合应用只是其中一种。

但无论那种模式,复合应用体现了用户前端组件化,标准化的趋势。谁说 SOA 只做企业系统后端的集成?复合应用是对 SOA 前端的一次非常好的诠释。

复合应用的创建

用 Notes 8 可以打开两种形式的复合应用,基于 Portal 的和基于 NSF 的,二者的差别主要在于存放应用文件(XML 格式)的方式不同。这里主要介绍基于 NSF 的复合应用。在 Notes 8 中创建一个复合应用是非常简单的一件事情,因为基于 NSF 的复合应用就是一个 NSF 数据库,在创建时,和一个传统的 NSF 数据库没有什么区别。所不同的是选择模板时必须选择空白组合应用程序模板。


图 3. 在 Notes 8 中创建复合应用
图 3. 在 Notes 8 中创建复合应用

创建之后,你将得到一个空白的复合应用页面。接下来点击 操作 中的 编辑复合应用,Notes 8 会启动 CAE(Composite Application Editor)。通过这个工具,你可以把 NSF 组件或者 Eclipse 组件拖拽到这个复合应用的页面上。此外,通过这个工具,你也可以创建多页面的复合应用。


图 4. 复合应用编辑器
图 4. 复合应用编辑器

创建空白复合应用 NSF,然后填充组件,这就是创建一个复合应用的过程。这个过程本身并不复杂。不过随之而来一个非常关键的问题:这些 NSF 组件和 Eclipse 组件是如何开发的?


Eclipse 组件的开发

当然很多情况下,只依靠 NSF 组件构建 Notes 8 复合应用是不够的。在做报表展现,图形处理,以及一些其他业务应用的时候,传统 Notes 开发会遇到一些瓶颈。在 Notes 8 中,我们可以通过 Eclipse 组件来弥补 NSF 组件功能上的不足。

开发复合应用的 Eclipse 组件需要具有 Eclipse 的插件(plug in)开发技能。关于 Eclipse 插件开发细则以及 Eclipse 组件开发环境的配置,请参考 http://www.eclipse.org 上的相关文档,此处不再赘述。

与 NSF 组件一样,Eclipse 组件的开发同样遵循着 定义属性和操作,属性的发布,操作的实现 三个步骤。

定义属性和操作

ImageView 组件为例,该组件接收 NewsIDChanged 属性(该属性值为新闻号),执行 ShowImage 操作:显示该新闻号对应的新闻的图片。要在 Eclipse 组件中定义该属性和操作,需要执行下列步骤。


图 13. Eclipse 组件——ImageView
图 13. Eclipse 组件——ImageView

首先,创建 WSDL。Eclipse 组件中同样使用 WSDL 来描述组件的属性和操作,并且其格式与 NSF 组件的完全一致。这意味着我们同样可以用前面提到的 Property Broker Editor 这个可视化工具来编写 Eclipse 组件的 WSDL(当你已经熟悉了 Eclipse 中复合应用组件的开发之后,你会更愿意使用文本编辑工具来编辑)。调用 Property Broker Editor 的方法是 \framework\rcp\rcplauncher.exe -config wsdledit


图 14. 利用 Property Broker Editor 定义 Eclipse 组件的属性
图 14. 利用 Property Broker Editor 定义 Eclipse 组件的属性

利用上图的 Property Broker Editor 工具我们得到了一个描述文件 actions.wsdl。接下来,需要把得到的 action.wsdl 导入到 Eclipse 组件中。在 Eclipse 的项目中,新建一个名为 wsdl(该名称不做限定)的文件夹,把 WSDL 文件导入到该文件夹中。下面这步非常关键:在该 Eclipse 插件的扩展中加入 com.ibm.rcp.propertybroker.PropertyBrokerDefinitions,并在该扩展下新建一个 handler。


图 15. 扩展 PropertyBrokerDefinitions
图 15. 扩展 PropertyBrokerDefinitions

在这里,此扩展将会把描述文件 WSDL 与具体实现类相结合。如下图所示。File 属性指定为我们刚刚生成的 actions.WSDL 文件,Type 处选择 SWT_ACTION,Class 属性则选定将会具体实现 Eclipse 组件的操作的类 com.ibm.xna.actions.ImageViewAction


图 16. 扩展详细信息
图 16. 扩展详细信息

保存后在 Eclipse 插件的 plugin.xml 中会多出如下代码:


清单 5. Eclipse 组件的 Plug.xml 片断
                
 
…… 
 
…… 
 			
			

至此,我们就完成了 Eclipse 组件属性和操作的定义工作。需要强调的是,对某些之前没有接触过 Eclipse 插件开发的 Notes 开发者而言,上述内容也许比较陌生,因为要掌握 Eclipse 中的扩展,扩展点等概念通常需要一些时间。但从长远来看,考虑到这门技术在未来给他们带来的价值,这种技术上的投入毫无疑问是值得的。

属性的发布

在 Eclipse 组件中,属性的发布同样也非常简单。这里我们以另一个 Eclipse 组件 SnapshotView 为例,该组件用于展示若干篇新闻的图片缩略图。一方面,它可以接受 ImageNewsList 传递给它的属性,执行缩略图展现的操作;另一方面,当用户点击某篇新闻的缩略图时,它会把该新闻的 NewsID 作为属性发布出去。在这里我们只介绍 SnapshotView 组件中属性发布的实现。


图 17. 扩展详细信息
图 17. 扩展详细信息

在双击某张缩略图时,我们会执行如下的代码:

PropertyBrokerUtil.publishProperty("com.ibm.xna",viewID, "NewsIDChanged", id);

其中 PropertyBrokerUtil.publishProperty 方法是我们自定义的一个函数,通过该函数,SnapshortView(视图号为viewID)将发送名称空间为 com.ibm.xna,名称为 NewsIDChanged 的属性,值为某篇新闻的编号 id

该方法的实现代码如下:


清单 6. 发布属性的 Eclipse 代码
                
public void publishProperty(String namespace,String viewID, 
    String property, String value) { 
    PropertyBroker pb = PropertyBrokerFactory. getBroker ();
    // 获取 PropertyBroker 实例 
    PropertyValue[] values = new PropertyValue[1]; 
    try { 
        Property prop = pb.getProperty(namespace, property);
        // 根据名称空间和属性名获取属性 
        if (prop != null ) { 
            values[0] = PropertyFactory. createPropertyValue (prop, value);
            // 生成属性值 
            pb.changedProperties(values, viewID);// 发布属性 
        } 
    } catch (PropertyBrokerException e) { 
        e.printStackTrace(); 
    } 
}
			

在上面这个函数中,我们首先获取一个 Property Broker 的实例,再通过名称空间和属性名获取 Property 实例。实际用来发布属性的方法是 PropertyBrokerchangedProperties 函数,此函数有两个参数,一个是 PropertyValue 数组,用于存放多个要发布的属性值对;另一个是字符串,用于标志属性变化时的上下文,应该与连接(Wiring)源组件的 EntityID 匹配。本例中,该 viewID 是通过 snapShotView.getViewSite().getId() + ":" + snapShotView.getViewSite().getSecondaryId() 拼接而成的。

如果觉得拼接这个 viewID 麻烦,还有一种做法更加简单。可以使用 SWTHelper (com.ibm.rcp.propertybroker.swt.api.SWTHelper) 类的 changedProperties 函数发布属性。该函数的函数头为:SWTHelper.changedProperties(PropertyValue[] arg0, IViewPart arg1),与 PropertyBroker 的同名函数的不同之处在于,该函数的第二个参数是指向 ViewPart 的指针。如果是在 ViewPart 类内部调用该方法的话,那么很多情况下你只需要简单写一个 this 即可。

操作的实现

回到本节一开始介绍的 ImageView 组件,该组件接收 NewsIDChanged 属性(该属性值为新闻号),执行 ShowImage 操作:显示该新闻号对应的新闻的图片。以它为例,接下来我们看看 Eclipse 组件中操作是如何实现的。

前文提到,在定义 ImageView 的属性和操作时,我们在 Plugin.xml 中指定了 WSDL 操作的实现类 com.ibm.xna.actions.ImageViewAction。该类继承自 org.eclipse.core.commands.AbstractHandler,实现了该类的 excute()方法。

该方法的代码如下:


清单 7. 接收属性并操作的 Eclipse 代码
                
public Object execute(ExecutionEvent ee) throwsExecutionException {
    Object event = ee.getTrigger();
    if (event instanceof PropertyChangeEvent) {
        // 判断是否是属性更改事件
        PropertyChangeEvent e = (PropertyChangeEvent)event;
        PropertyValue propValue = e.getPropertyValue();
        // 获取属性值
        finalString Val = propValue.getValue().toString();
        Wire wire = e.getWireDefinition();
        String targetName = wire.getTargetName();
        // 获取目标操作名
        if (targetName.equalsIgnoreCase("ShowImage")) {
            // 判断操作名是否匹配
            ……
            IViewPart part = SWTHelper.locateView (SAMPLE_VIEW); ImageView view = 
			    ( ImageView ) part; view.setVal(Val );
            // 把属性值传递给对应的新闻展示视图,展示图片。
            ……
        }
    }
returnevent;
}

从上面的代码可以看到,通过处理 PropertyChangeEvent 类的实例,我们可以得到 ShowImage 操作所接收到的属性值,并对该属性值进行相应的处理。

简而言之,只要我们对复合应用的 Property Broker 编程模式有了一个比较清晰的认识,那么实现 Eclipse 组件中的操作将会是非常轻松的一件事。

总的来说,开发 Eclipse 组件对传统的 Notes 开发者是一个全新的挑战,不过作为 Notes 开发者,他们已经习惯于接收种种新鲜事物。举个例子,现在 Notes 开发中常用的 HTML,javascript,Java,Servlet 等技术,在一开始也是和 eclipse 一样,作为一种新技术加入到 Lotus 开发中来的。所以对 Lotus 自身和 Lotus 开发者而言,ND 8 会给他们带来一片新的天地。


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

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

注册时间:2008-07-04

  • 博文量
    233
  • 访问量
    440910