IBM Enterprise Content Management Widgets (ECM Widgets) 是一个基于 mashup 技术的新的 Web 2.0 应用程序。ECM Widgets 是 IBM Agile ECM FileNet® 产品组合的一个重要组件。它提供了一组小部件供业务设计人员、分析师、IT 专家和最终用户使用。ECM Widgets 应用程序高度灵活、易于使用、便于扩展。用户可以快速构建 FileNet 业务流程管理 (BPM) 解决方案,可以通过拖放小部件轻松配置解决方案。ECM Widgets 可以有效降低实现企业业务流程管理的成本。
ECM widgets 遵守 IBM iWidget Specification Version 1.0,并且在 IBM mashup 平台上运行。具体来说,ECM Widgets 4.5.1 在 IBM WebSphere Business Space 6.2 上运行。小部件之间的内部通信是一种重要的功能,支持各种小部件协同工作,从而实现复杂场景并获得更大的业务价值。按照 IBM iWidget 规范,小部件使用事件来通信。ECM Widgets 充分利用了此机制,并提供了一套灵活的接口,从而与第三方小部件进行通信。业务分析师能够创建自己的小部件或使用现有的小部件与 ECM 小部件通信,以满足他们的业务需求。
小部件使用事件进行通信。发送小部件发布一个事件,接收小部件接受并处理事件。事件的负载(payload)承载着在发送小部件和接收小部件之间传送的消息,如图 1 所示。
图 1. 小部件通信
一个负载就是一个承载者,将数据从已发布的事件传送到接收事件,并且由负载定义来确定,例如 payloadDef。一个负载可以:
- 是主要的元素类型,例如字符串或数字。
- 拥有由其它负载组成的复杂结构。
- 像对象一样运行。
- 被声明为 any,表示它可以包含任何数据类型。
事件与负载都在小部件定义 XML 文件中被定义。例如,假设您有两个小部件。Book List Widget 显示了一个书籍清单。 Book Details Widget 根据书籍序列号显示销售趋势和细节或者负载传递的其他信息。Book 负载由其他 3 个简单的 string 类型负载定义组成:sn、名称 和作者。XML 中的示例事件和负载定义如清单 1 和清单 2 所示。请参阅 下载 查看本文所有的清单。
清单 1. Book List Widget
<iw:payloadDef name="Book">
<iw:payloadDef name="sn" type="string" defaultValue=""
description="The serial number of a book"/>
<iw:payloadDef name="name" type="string" defaultValue=""
description="The name of a book"/>
<iw:payloadDef name="author" type="string" defaultValue=""
description="The author name of a book"/>
</iw:payloadDef>
<iw:event id="Send Book Info" published="true"
eventDescName="SendBookInfoDescription"/>
<iw:eventDescription id=" SendBookInfoDescription" payloadType="Book"
description="" lang="en"/>
|
清单 2. Book Details Widget
<iw:payloadDef name="Book">
<iw:payloadDef name="sn" type="string" defaultValue=""
description="The serial number of a book"/>
<iw:payloadDef name="name" type="string" defaultValue=""
description="The name of a book "/>
<iw:payloadDef name="author" type="string" defaultValue=""
description="The author of a book"/>
</iw:payloadDef>
<iw:event id="Receive Book Info" handled="true" onEvent="handleReceiveBookInfo"
eventDescName="ReceiveBookInfoDescription"/>
<iw:eventDescription id="ReceiveBookInfoDescription" payloadType="Book"
description="" lang="en"/>
|
事件定义包含两个部分:事件和 eventDescription。事件可以是已发布事件或接收中的事件,这些事件通过其定义中的已公布 或已处理 的属性来表示。当您定义负载和事件时,事件的 eventDescName 属性引用 eventDescription 的 id 属性。eventDescription 的 payloadType 属性引用 payloadDef 的 name 属性。这些引用将所有的部分连接成一个完整的定义。图 2 展示了负载定义与事件定义之间的关系。
图 2. 小部件事件与负载
接收事件定义它的处理功能。清单 2 中的 Receive Book Info 事件由 handleReceiveBookInfo 处理,后者是一个 JavaScript 函数。该函数必须在小部件代码中定义。
IBM WebSphere® Business Space 在运行时使用一种名为 wiring 的进程,提供了一种相互连接小部件事件的便利方法。图 3 展示了 IBM WebSphere Business Space 6.2 中连接用户界面的屏幕截图。
图 3. IBM WebSphere Business Space 6.2 中小部件的连接界面
当 wiring 进程完成时,已发布的事件和处理事件就被连接在一起。
正如 使用 IBM ECM Widgets 构建 FileNet BPM 应用程序,第 1 部分:IBM Enterprise Content Management Widgets 简介 所描述的,ECM Widgets 提供了包含收文篮、步骤完成、header、附件和工作数据在内的完整小部件套件,用以创建 BPM 解决方案。所有这些小部件都符合 iWidget 规范。每个小部件都可提供进行内部通信或与第三方小部件通信的事件接口。
大部分 ECM Widgets 事件 ID 都遵循一致的命名惯例:已发布事件命名为 Send{Payload Type},而已处理事件命名为 Receive{Payload Type}。 在典型的 BPM 解决方案中,收文篮小部件通过已发布的事件(Send Work Item Id)与步骤完成小部件相连,通过已处理事件(Receive Work Item Id)与 WorkItemId 负载相连。在另一个例子中,步骤完成小部件可能会通过以下已公布事件之一,与工作数据小部件、带有 WorkItem 负载的附件小部件相连:
- Send Work Item
- Send Save Work Item
- Send Close Work Item
使用相应的已处理事件:
- Receive Work Item
- Receive Save Work Item
- Receive Close Work Item
大部分来自 ECM Widgets 的已发布和已处理的事件支持自动连接,这就意味着不需要对这些事件使用手动连接,包括上文中提到的场景。虽然这些事件支持在 ECM Widgets 之间自动连接,但是它们也可以被手动连接到第三方小部件。某些事件专为第三方集成而提供,例如在内容列表小部件中的 Receive Search Values 事件,以及收文篮小部件中的 Receive Role 事件,都可接收来自第三方小部件的负载。
图 4 展示了 ECM Widgets 4.5.1 版本中小部件之间使用事件进行通信,包括已发布的和接收的事件和负载。
图 4. ECM Widgets 4.5.1 的事件框架
此部分展示了如何开发示例小部件并实现示例小部件与 ECM Widgets 的通信。示例小部件包含发布事件和已处理的事件。它通过获得来自收文篮的负载并将它们发送给内容列表,将 ECM Widgets 4.5.1 版本的收文篮小部件和内容列表小部件连接起来。
在 ECM Widgets 4.5.1 中,收文篮小部件有一系列名为 Send {field name} 的已发布事件,它们根据收文篮小部件显示的列动态生成。假设您有一个工作流定义,其字段能够提供例如人员姓名、年份等信息。在工作流启动之后,收文篮小部件就能够在它的列中显示这些字段,然后提供动态事件将每个字段的值发送到一个接收小部件。
内容列表小部件支持您使用 IBM FileNet Content Engine 中的搜索功能来获取文档列表。如果内容列表小部件与另一个小部件的发布事件相连,那么内容列表小部件可通过用户输入的搜索标准来进行搜索。
为了充分利用这些功能,示例小部件被称为 Paper Seeker。该部件有两种功能:
- 获得并显示来自工作流(使用收文篮小部件的发布事件)的人名及年份信息。
- 提供一个按钮,将信息发送到内容列表小部件作为输入。
通常情况下,每个小部件都有 XML 文件和 JavaScript 文件,提供描述其行为的定义。XML 由 4 个重要部分组成:
- 供小部件参考的资源文件
- 负载定义
- 事件与事件描述定义
- 小部件的内容
清单 3 展示了小部件的 XML 编码,包括解释细节的注释(还可参阅 下载)。
清单 3. PaperSeeker.xml
<iw:iwidget name="PaperSeeker" xmlns:iw="http://www.ibm.com/xmlns/prod/iWidget"
iScope="sample.widget.PaperSeeker" allowInstanceContent="true"
supportedModes="view" mode="view">
<!-- Resource references -->
<iw:resource uri="PaperSeeker.js"/>
<!-- Payload definition section -->
<iw:payloadDef name="Author" type="string" defaultValue="" description=""/>
<iw:payloadDef name="PublishYear" type="number" defaultValue=""
description=""/>
<iw:payloadDef name="PaperInfo">
<iw:payloadDef name="Author" type="string" defaultValue="" description=""/>
<iw:payloadDef name="PublishYear" type="number" defaultValue=""
description=""/>
</iw:payloadDef>
<!-- Event definition section -->
<!-- Receive Author is used to wire with in-basket to
get a person's name as an Author. The handleReceiveAuthor method in PaperSeeker.js
will handle the payload passed in.-->
<iw:event id="Receive Author" handled="true"
onEvent="handleReceiveAuthor"
eventDescName="ReceiveAuthorDescription" />
<iw:eventDescription id="ReceiveAuthorDescription"
payloadType="String" description="Receive Author event" lang="en"/>
<!-- Receive Publish Year is used to wire with in-basket to get the year
information to populate Publish Year. The handleReceivePublishYear method in
PaperSeeker.js will handle the payload passed in.-->
<iw:event id="Receive Publish Year" handled="true"
onEvent="handleReceivePublishYear"
eventDescName="ReceivePublishYearDescription" />
<iw:eventDescription id="ReceivePublishYearDescription"
payloadType="String" description="Receive Publish Year event" lang="en"/>
<!-- Send Paper Info is used to wire with Content List to send the
PaperInfo payload as the input -->
<iw:event id="Send Paper Info" published="true"
eventDescName="SendPaperInfoDescription"/>
<iw:eventDescription id="SendPaperInfoDescription"
payloadType="PaperInfo" description="Send PaperInfo event" lang="en"/>
<!-- Initial widget content -->
<!-- _IWID_ is a placeholder to be replaced with the actual ID dynamically to
avoid ID duplication -->
<iw:content mode="view">
<![CDATA[
<div id="_IWID_view">
<div><b>Author: </b><input type="text"
id="_IWID_author"><div>
<div><b>Publish Year: </b><input type="text"
id="_IWID_publishYear"><div>
<input type="button" id="_IWID_seeker" name="seeker" value="Seek Paper"
onclick="iContext.iScope().seekPaper()"/>
</div>
]]>
</iw:content>
</iw:iwidget>
|
JavaScript 文件的功能是定义小部件的行为,包括发布或接收事件。IBM mashup 平台使用的是 dojo class 格式。清单 4 中的 JavaScript 文件展示了这些功能。(还可参阅 下载)。
清单 4. PaperSeeker.js
dojo.provide("sample.widget.PaperSeeker");
dojo.declare("sample.widget.PaperSeeker", null, {
onLoad: function() {
//this.iContext.widgetId is generated by the Mashup container at runtime
this.domID = "_" + this.iContext.widgetId + "_";
},
//to handle Receive Author event
//populate the author field with payload received
handleReceiveAuthor: function(iEvent) {
if(iEvent.payload){
dojo.byId(this.domID + "author").value = iEvent.payload;
}
},
//to handle Receive Publish Year event
//populate the publishYear field with payload received
handleReceivePublishYear: function(iEvent) {
if(iEvent.payload){
dojo.byId(this.domID + "publishYear").value = iEvent.payload;
}
},
//invoke when the button is pressed
//send Paper Info event will be fired with a proper payload
seekPaper: function(){
var author = dojo.byId(this.domID + "author").value;
var publishYear = dojo.byId(this.domID + "publishYear").value;
var payload = [{"name": "Author", "value": author},
{"name": "PublishYear", "value": publishYear}];
this.iContext.iEvents.fireEvent("Send Paper Info", "any", payload);
}
});
|
在 IBM WebSphere Business Space 6.2 中部署并连接小部件
此部分描述如何部署、连接并注册小部件。
要使示例小部件适用于 WebSphere Business Space 6.2 服务器,请完成以下步骤。
- 利用 Business Space 来注册示例小部件,如图 5 所示。
图 5. 注册小部件的定义
- 准备一个清单 5 所示的注册表文件(还可参阅 下载)。
清单 5. 注册表文件 DWSampleWidgets.xml
<tns:BusinessSpaceRegistry xmlns:tns="http://com.ibm.bspace/BusinessSpaceRegistry"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://com.ibm.bspace/BusinessSpaceRegistry
BusinessSpaceRegistry.xsd ">
<tns:Endpoint>
<tns:id>sample.widget.RootId</tns:id>
<tns:type>sample.widget.RootId</tns:type>
<tns:version>1.0.0.0</tns:version>
<tns:url>DWSampleWidgets/</tns:url>
<tns:description></tns:description>
</tns:Endpoint>
<tns:Category>
<tns:id>sample.widget.Category</tns:id>
<tns:name>DW Sample Widgets</tns:name>
<tns:description></tns:description>
<tns:tooltip></tns:tooltip>
<tns:order>99</tns:order>
</tns:Category>
<tns:Widget>
<tns:id>sample.widget.PaperSeeker</tns:id>
<tns:version>1.0.0.0</tns:version>
<tns:name>Paper Seeker</tns:name>
<tns:type>{com.ibm.bspace}iWidget</tns:type>
<tns:description>A widget to seek papers.</tns:description>
<tns:tooltip>Paper Seeker</tns:tooltip>
<tns:categoryId>sample.widget.Category</tns:categoryId>
<tns:widgetEndpointId>sample.widget.RootId</tns:widgetEndpointId>
<tns:url>src/sample/widget/PaperSeeker.xml</tns:url>
<tns:helpUrl></tns:helpUrl>
<tns:iconUrl></tns:iconUrl>
<tns:previewUrl></tns:previewUrl>
<tns:previewThumbnailUrl></tns:previewThumbnailUrl>
<tns:attachable/>
<tns:owner></tns:owner>
<tns:email></tns:email>
<tns:serviceEndpointRef required="true">
<tns:name>serviceUrlRoot</tns:name>
<tns:refId>sample.widget.RootId</tns:refId>
<tns:refVersion>1.0.0.0</tns:refVersion>
</tns:serviceEndpointRef>
</tns:Widget>
</tns:BusinessSpaceRegistry>
|
- 将注册表文件保存到 {Business Space deploy folder}\registryData 文件夹中,如图 6 所示。
图 6. 部署
- 将小部件代码打包到 war 文件,并部署在服务器上。新的小部件可用于 Business Space 环境,如图 7 所示。
图 7. 成功注册小部件
在应用新的小部件之前,您需要配置收文篮小部件和内容列表小部件。请完成以下步骤。
- 使用 Process Designer 来定义一个包含名称和年份字段的工作流。在这里假设您已经为此示例创建了工作流。该工作流包含预定义的字段,如图 8 所示。
图 8. 预定义工作流字段
- 利用 Process Configuration Console 中公开的两个字段来创建收文篮。(请参考 使用 IBM ECM Widgets 构建 FileNet BPM 应用程序,第 2 部分:构建业务流程管理解决方案 了解详细信息)。
- 创建应用程序空间或更新现有的应用程序空间,例如 DefaultApplication,在新的收文篮中定义一个角色。
- 配置 ECM Widgets 收文篮小部件,通过设置应用程序空间名称来显示新的收文篮小部件,如图 9 所示。
图 9. 应用应用程序空间
- 指定您定义的角色,如图 10 所示。
图 10. 应用角色
要对内容列表小部件进行配置,您需要利用 Search Designer 工具计划并定义一个 Workplace XT 存储搜索,并通过 Workplace XT 提供的存储搜索 URL 来配置内容列表小部件。一般来说,一个存储搜索拥有一个或多个搜索标准、结果列和其他设置。内容列表小部件能够利用预定义的搜索标准在存储搜索定义中执行,或者当它与一个发送方小部件相连时,可通过动态地替代可编辑的搜索标准来执行。
为了实现此功能,内容列表小部件提供了一个 Receive Search Values 事件。负载的格式是一系列键值。内容列表对负载进行解析,并使用键值与存储搜索标准进行比较。如果有匹配,内容列表使用键值来代替存储搜索中的预定义值。然后内容列表小部件户使用新的值来进行搜索。
例如,您在示例小部件中有一个已发布的负载:[{"name": "author", "value": "Mike Mahomet"}、{"name": "publishYear", "value": 2000}]。该负载代替了存储搜索中的 author 和
publishYear 搜索标准。
完成下面这些步骤以配置示例内容列表小部件:
- 利用搜索标准在 Search Designer 中定义一个存储搜索,如图 11 所示。
图 11. 存储搜索的定义
- 访问 Workplace XT,并确定存储搜索定义的内容 URL。
- 将超链接复制到内容列表小部件配置面板中,如图 12 所示。
图 12. 配置内容列表小部件
- 保存信息。内容列表小部件现在可以使用默认标准进行搜索。
完成以下步骤将小部件连接到一起。
- 将新的小部件拖放到相同的页面,作为现有的收文篮小部件和内容列表小部件。
- 选择 Widget Wiring,如图 13 所示。
图 13. 小部件连接
- 在 Widget Wiring 窗口,将收文篮的 Send Author
事件与示例的 Receive Author 事件相连,如图 14 所示。
- 将收文篮的 Send PublishYear 事件与示例 Receive Publish Year 事件相连,如图 14 所示。
图 14. 连接 1
- 将示例 Send Paper Info 事件与内容列表的 Receive Search Values 事件相连,如图 15 所示。
图 15. 连接 2
现在小部件已经被连接。
完成以下步骤以运行示例:
- 通过单击操作,在收文篮里选择一个行。您可以看到 Paper Seeker 示例在屏幕上显示 Author 和 PublishYear 值。
- 单击 Seek Paper 按钮。利用 Paper Seeker 输入的值来执行搜索。结果在内容列表小部件中显示,如图 16 所示。
图 16. 运行示例
本文是由三部分组成的介绍 ECM Widgets 的系列文章的最后一部分。在此部分中,您得到了有关事件机制、IBM iWidget 规范以及 ECM Widgets 事件接口的总体概述。您还通过示例了解了如何编写一个小部件,以及如何与 ECM Widgets 相连接以获得更多价值。
感谢以下朋友审校本文:
- Lauren Mayes,ECM Widgets 架构师
- Ming Liang Guo,ECM Widgets 开发团队主管
- Simon Chu,IBM Master Inventor
| 描述 | 名字 | 大小 | 下载方法 |
|---|---|---|---|
| 本文的样例小部件代码 | Sample.zip | 5KB | HTTP |
学习
- 从
IBM ECM Widgets 在线文档 获取更多详细内容。
- 了解更多关于
IBM iWidget Specification 1.0 的信息。
- 从 developerWorks Information Management 专区 了解更多有关 Information Management 的内容。查找技术文档、how-to 文章、培训、下载、产品信息等。
- 随时关注 developerWorks 技术活动和网络广播。
讨论
- 查看
developerWorks
博客 并加入
developerWorks 社区。

