Lotus Expeditor 6.2 中 Generic Container 框架简介

转自developerworks

作者:张 春燕 ([email protected]), 软件工程师, IBM
林 云志 ([email protected]), 软件工程师, IBM

随着市场竞争的加剧,企业越来越需要对不断变化的需求做出快速响应。复合应用通过将一系列已有的松耦合组件利用 Expeditor 所提供的 Wire 机制组合为一个新的应用,从而快速地创建应对新需求的应用程序,缩短了开发周期,对已有的资源实现了重复利用。因此,复合应用作为一个有效地提高组件重用性和企业灵活性的解决方案,受到越来越多地关注。

但是,由于许多已有的组件过于简单,它们或者不能接收来自其它组件的属性,或者不能对外发布属性,这在一定程度上限制了组件的可重用性。如何最大限度地重用组件,并利用它们构建复杂的应用程序,是复合应用开发中所面临的问题,这也正是 Generic Container 所要达到的目标。

Generic Container 的体系结构和相关概念

Generic Container 是 Expeditor 6.2 中新引入的特性。它是一种新型的视图形式,是对一个包含在视图中应用程序的扩展的集合。它不仅能显示一个单页的应用程序,而且对于多页或者具有多种状态的应用程序也能显示。同时,Generic Container 为 Notes 8.5 和 Expeditor 6.2 中的复合应用编辑器 (Composite Application Editor, CAE) 提供了所见即所得的界面接口,并通过 Landmark 来控制复合应用程序的状态,对外发布属性或接收属性,从而实现组件之间的交互。

Generic Container 的体系结构

Lotus Expeditor 基于 Eclipse 平台,并对其进行了大量的扩展,因此它不仅能作为一个 Rich Client 应用程序的基础平台,同时还能够作为 JavaEE 应用程序的基础平台。当前,IBM 众多产品都基于此基础平台进行开发和扩展,比如 Lotus Notes、Lotus Sametime 以及 Symphony 等。

Lotus Expeditor 内部提供了一个具有良好可扩展性的 Container 核心框架,并实现了一个广泛使用的 Browser Container 。同时,其他基于 Expeditor 产品也可基于此核心框架实现满足特定业务需求的 Container,比如 Lotus Notes 实现的 Notes View/PIM Container,Symphony 实现的 Symphony Container 。当然,核心框架的可扩展性使得您能方便地实现一个自定义的 Container 。


图 1. Expeditor 6.2 Generic Container 的架构图

Landmark 的概念

Landmark 是 Container 中的一个重要概念。在一个 Container 内部,通过扩展 Generic Container 中的 LandmarkIdentifier 来定义此 Container 所支持的 Landmark 标识符类型,比如 Web 浏览器容器(Browser Container)能够支持两种类型的 Landmark 标识符:URL 和 title 。

对于同一个 Container,可以定义不同的 Landmark 来表示应用程序的状态。在 Landmark 下,通过增加不同的事件类型来响应各种事件。在 Generic Container 中,默认支持四种事件类型:视图初始化事件、视图关闭事件、数据改变事件和内容完成事件,当然,您可根据业务需求定义自定义的事件类型,比如选择事件。当选择事件后,通过在不同的事件中加入不同的操作,从而使应用程序在当前 Landmark 的状态下能对外发布属性或接收属性。

ContainmentConfiguration 和 LandmarkConfiguration 扩展点的使用

Generic Container 框架中提供了 com.ibm.rcp.composite.container.core.containmentConfigu ration 和 com.ibm.rcp.composite.container.core.landmarkConfiguration 两个有用的扩展点。其中 containmentConfiguration 用于为一个给定的复合应用提供应用程序 Container。每个 Container 都是 Generic Container 的一个实例。通过扩展 Generic Container 中所提供的 AppContainer 来实现一个自定义的 Container。landmarkConfiguration 用于为一个特定的 containmentConfiguration 提供 landmark 的配置信息,定义可用的属性和操作。

Container 与组件的区别与联系

严格来说,我们可以将 Container 看成是一种特殊的组件,它们都是通过 Expeditor/Notes 所提供的 Wire 机制来与其他组件进行交互。而 Container 与组件的最大区别就在于 Landmark 的概念。组件中并没有 Landmark 的概念,因此,对于组件而言,我们就不能定义它的状态,也不能针对不同的状态来定义不同的事件,然后通过定义不同的操作来发布或接收属性。因此,Container 提供了更大程度地可重用性。

Expeditor 6.2 / Notes 8.5 中支持的 Container

当前,Expeditor 6.2/Notes 8.5 中仅支持 Browser Container 。 Browser Container 不仅能对外发布属性,同时也能接收属性。同时,作为一个 Container,您能利用它所提供的两种 Landmark 形式(URL 和页面标题)来处理页面在不同状态的事件触发。

使用 CAE 组装复合应用

本节将会演示如何在 CAE 中新建一个复合应用,以及如何借助 CAE 来使用 Browser Container,其中主要包括它对外发布属性和接收属性功能的演示,并利用一个场景来说明它的使用。

场景描述

百度和 Google 是大家常用的两大搜索引擎,由于它们的搜索实现机制的不同,使用两个搜索引擎出来的结果往往会有很大的区别。很多时候,我们不得不在两个搜索引擎的主页中输入相同的关键字来搜索出更加全面的结果。即使我们可以借助浏览器的一些工具栏,比如 Firefox 的搜索栏来免去输入相同的关键字,但是您也不得不在搜索引擎列表中进行搜索引擎的不断切换,并且当搜索完毕,我们还需要在不同的搜索页面间进行切换来查看不同的搜索结果。那么我们能否在一个页面中输入一次关键字,即可同时完成对多个不同搜索引擎的搜索,并在一个页面中查看到所有的搜索结果?当然,借助 Notes 8.5 中的 Browser Container,设计一个复合应用,即可完成上述的需求。

创建复合应用:Browser Container Demo

Browser Container 在 Expeditor 6.2/Notes 8.5 中均可用,为了便于使用 Notes 8.5 中已有的一些可用的组件,本文将选用 Notes 8.5 作为实验平台。在开始实验之前,您需要保证您本地已经安装 Notes 8.5 。另外,在 Notes 8.5 中提供了一个创建和编辑复合应用的编辑器 (Composite Application Editor, CAE) 。为了使用它,您必须首先确保您在安装 Notes 8.5 时,已经选择安装了 CAE 组件。

首先,您需要在 Notes 中新建一个空的复合应用。通过点击 File-Application-New 菜单,将会弹出一个新建 Application 的对话框,在 Template 栏 , 您需要选择 Blank Composite Application 来创建一个空的复合应用。


图 2. 创建一个新的复合应用


图 3. 选择 Blank Composite Application 作为模板

当您点击 OK 后,Notes 将会打开这个新建的空白复合应用 Browser Container Demo,同时将此复合应用放置于 Workspace 中。然后,我们通过选择菜单 Actions 下的 Edit Application 来打开 Notes 的 CAE 编辑器,编辑此复合应用。这时,您将看到 CAE 编辑器右侧的 Component 库中包含一个 Containers 的分类,它下面就包含了我们将会使用的 Browser Container 。当然,此时的复合应用还未包含任何内容。

配置 Browser Container

针对上述的场景,我们需要两个 Browser Container 。我们从右侧 Component 库中拖拽两个 Browser Container 分别放置于 Browser Container Demo 复合应用的上方和下方中。当然,您可根据您的需求拖拽 Browser Container 进行布局的调整。此时,点击上方 Browser Container 右上角的 Component Preferences(如下图所示),您将会看到一些上下文菜单项,选择其中的 Edit Component Properties 来配置 Browser Container 。


图 4. Component Preferences 的菜单项

在 Edit Component Properties 页面中,选择其中的 Component Settings 将上方的 Browser Container 设置为 Google Container 。


图 5. Edit Component Properties-Component Settings

在 Browser Container 中,初始的 URL 设置为 www.ibm.com,为了显示 Google 的主页,我们进入 Advanced 子页面,将属性 initialURL 的值修改为 www.google.com, 并加入两个可以 Wireable 的属性 searchValue 和 searchValue2 来分别表示主页的搜索域和搜索页面的搜索域,这样,在 Landmarks 域中我们可以配置多个 landmark 来使用不同的属性来对外发布属性值。


图 6. Edit Component Properties-Advanced

Landmark 页面是特定于 Container 存在的,对于一般的 Component 它并不可见。 Browser Container 支持两种类型的 Landmark 标识符,URL 和页面的 title 。这里,我们选用 URL 作为 Landmark 标识符类型。点击右边的 Add Landmark 按钮,您将增加一个新的 Landmark 。既然 Landmark 标识符是 URL,我们输入 http://www.google.cn/ 作为第一个 landmark 。同时,landmark 支持通配符,比如我们增加的第二个 landmark //www.google.cn/search*,它表示任意的搜索页面。配置完 Landmark 之后,您可以通过 Add Event 来加入事件。当前,Browser Container 支持四种事件类型,我们选用 Data Change,即当 Google 搜索域的内容发生改变时,就会触发此事件。基于此事件,我们通过右侧的 Add Operation 按钮加入可用的操作,此操作将会使用之前定义的 searchValue 属性来发布当前 Google 搜索域的内容。而对于页面的 Google 搜索域的表示,我们可以利用域的 ID 来标识,这种方式简单直观,比如一个输入框的 id 为 kw,此时就可设置为 id:kw ;但很多时候,页面中的元素没有设置 id,此时我们可以使用 xpath 来表示。对于如何获取页面元素的 ID 和 xpath,您可以使用 Firefox 中的两个插件 Firebug 和 XPather 。

结合本场景,Google 搜索域没有设置 ID,而主页的搜索域和搜索页面的搜索域,两者的 xpath 值也不相同,因此,这正是本文定义两个 Landmark 和两个属性的原因。在不同的 Landmark 下,我们使用不同的属性来发布不同域的值。而百度的搜索域设置了相同的 ID,因此,我们仅设置一个 Landmark(http://www.baidu.com/*)和一个属性值 searchValue 来接收来自 Google 不同搜索域的值,并将其与百度的搜索域关联起来。


图 7. Google Landmark


图 8. 百度的 Landmark

Wire Browser Container

至此,每个单独的 Browser Container 配置已经完成。为了使两个 Browser Container 之间能够发布和接收属性,我们还需要将两者关联起来。本场景需要将 Google 搜索域的内容发布出来,并自动设置到百度搜索域中,因此我们在 CAE 左边的导航器中右键选择 Google Container 的 Wiring 菜单,进入 Wiring 界面进行属性的关联。从下图可见,我们将前面设置为可 wireable 的两个属性 searchValue 和 searchValue2 关联至 Set searchValue,实现 Google-Browser Container 到 Baidu-Browser Container 的关联。属性关联完毕,点击当前页面右下角的 Apply 来应用当前的设置。


图 9. Wire 两个 Browser Container

运行界面

退出 CAE 编辑界面,保存当前的复合应用,它将在 Notes 中运行。下图是它运行的初始界面。两个 Browser 均显示它的初始 URL 。


图 10. 初始的运行结果

当我们在 Google 的搜索域中输入完“复合应用”,我们将会看到百度的搜索域中自动加入“复合应用”作为关键词。此时点击搜索,我们将会在同一个页面上同时看到两大搜索引擎的结果。因为我们已经在搜索页面中也设置了相应的 landmark 和属性,所以同样地,在 Google 搜索页面的搜索域中输入完关键词后,百度主页或者搜索结果页面中的搜索域中均会被自动地赋予相同的值。


图 11. 主页的运行结果


图 12. 搜索页面的运行结果

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

转载于:http://blog.itpub.net/14751907/viewspace-608427/

你可能感兴趣的:(Lotus Expeditor 6.2 中 Generic Container 框架简介)