为 IBM Lotus Expeditor Property Broker 创建协作组件

获得关于 IBM Lotus Expeditor Property Broker 的介绍,并学习如何创建一个组件,用于此代理所提供的声明式通信。本文将展示如何使用扩展点、IBM WebSphere Portal Wiring Tool 和 Property Broker API 以声明的方式连接组件。

本文将为您介绍 IBM Lotus Expeditor Property Broker。我们将展示如何创建一个组件,以及如何将该组件用于 Property Broker 所提供的声明式通信。Property Broker 的主要任务就是在完全解耦的组件间提供通信。这些组件可以是任何已定义的、恰当地作为可标识属性或操作向 Property Broker 注册的 Java 对象。然后就可以使用扩展点、IBM WebSphere Portal Wiring Tool 或 Property Broker API 将这些组件以声明的方式连接在一起。

本文是为熟悉 Lotus Expeditor(即以前的 IBM WebSphere Everyplace Deployment)的应用程序开发人员撰写的。假定您了解诸如操作、属性等之类的术语。

比较 IBM Lotus Expeditor 和 IBM WebSphere Portal Property Broker

Lotus Expeditor Property Broker 与 WebSphere Portal Property Broker 的功能极其相似。在复合应用程序的环境中使用时,WebSphere Portal 的 XML 可以推动解耦组件的连接和通信。复合应用基础设施(composite application infrastructure,CAI)负责注册和激活连接。开发在 CAI 中使用的组件时,主要关注点是发布属性更改和对于属性更改的操作。如果在 CAI 之外创建组件,则需要考虑连接注册、激活和停用。

由于 Eclipse 平台和 Lotus Expeditor 所提供的多窗口、多任务环境的复杂性,客户端 Property Broker 与同类 WebSphere Portal Broker 之间的最大差异就在于客户端 Property Broker 额外的操作框架。WebSphere Portal 允许不同类型的 portlet 之间进行通信;而客户机 Property Broker 允许您使用 Eclipse 扩展点来为代理创建新扩展。Lotus Expeditor 带有三个与现有代码兼容的操作处理程序扩展。随 Lotus Expeditor 附带的三个开箱即用的操作处理程序是:

  • Eclipse Core Commands
  • 基于 Standard Widget Toolkit(SWT)的操作
  • Abstract Windows Toolkit(AWT)组件

最后,Property Broker 是另一种类型的消息传递系统,因为操作可以通过输入属性更改调用,还可提供任何数量的输出属性更改。实际上这将引起属性更改的连锁反应。图 1 展示了示例执行流。


图 1. 示例执行流
 

正确设计组件架构

若要获得良好的封装和合理的解耦,您的组件应当符合正确的组件模型。这意味着您应将组件定义为可在尚未考虑到的环境中使用,并为设计应用恰当的组件化原则。

以下是一些需要考虑的设计提示:

  1. 出于明确性的考虑,在同一个包中声明视图和操作。这样,即使类在本质上是独立的,它们也是绑在同一个包结构下。一种方法就是使用(包含了所有操作类的)Actions 视图下的子包。
  2. 为简单起见,应为每个操作提供一个 Web Services Description Library(WSDL)文件。虽然 Property Broker 允许在单个 WSDL 中定义多个操作,但是不推荐这种做法,除非您的操作是其他操作的一般容器。
  3. 结合使用 Property Broker 和 CAI 是最简单的方式。如果想使用 Property Broker 和该框架之外的操作,可能需要提供正确启用和禁用操作和连接的代码。还必须提供注册连接的代码;使用 WebSphere Portal 的复合应用程序 XML 时,连接是在 XML 中定义的。
  4. 应认识到,属性名称空间有一个限制,即属性在同一个名称空间中必须是惟一的。如果一个组件有一个名为 URL 的属性,那么与其共享同一名称空间的任何一个组件都不能再有同名属性。考虑到惟一性,您可能需要在属性名前加上一个能够被视图或操作识别的区别符号。
  5. 如果操作的目的是更新 UI 组件,那么通过调用来更新标签或 UI 控件时,请确保正处在 UI 线程中。模板将假定上述情况,并为您提供代码。

示例应用程序

示例应用程序以两个解耦的组件为例,在基本层面上展示了如何创建两个组件,并使用 WebSphere Portal 进行连接。此应用程序有两个组件:左侧的 URL Selector 视图和右侧的 Managed Browser 视图(参见图 2)。两个视图在它们自己的插件中进行开发,彼此之间没有任何依赖关系。

Selector 视图是带有列表控件的简单视图,提供了可供用户选择的 URL。该视图发布了名为 URL From Tree 的属性,其类型为 URL。Browser 视图是带有 Embedded Browser 控件的 SWT 视图。该视图注册了名为 loadURL 的操作,此操作接受名为 URLIn 的单个输入参数。


图 2. URL Selector 视图和 Managed Browser 视图


Selector 视图发布属性时,将检查 Property Broker 的 SWT 操作处理程序以及 ManagedBrowser 插件中的操作。然后此操作使用 SWTHelper 类定位视图实例,并调用视图对象上的 loadURL() 方法。

操作处理程序

要理解 Property Broker 的体系结构,您必须理解什么是操作处理程序。存在操作处理程序扩展点的根本目的在于:允许现有基于事件或消息的系统将操作用于声明式代理模型。如上所述,Lotus Expeditor 附带三个操作处理程序。应根据操作处理程序的要求来使用恰当的操作实现。最终由其中一个处理程序来调用操作。代理将属性更改传递给适用于您操作对象类型的已注册处理程序。表 1 展示了这三个可用的处理程序。


表 1. 可用操作处理程序
插件名称 描述 依赖项
com.ibm.rcp.propertybroker 核心代理、核心处理程序

处理程序类型:COMMAND

操作接口:org.eclipse.core.commands.IHandler

org.eclipse.core.commands
org.eclipse.core.runtime
com.ibm.rcp.propertybroker.swt SWT 处理程序:

处理程序类型:SWT_ACTION

操作接口:org.eclipse.core.commands.IHandler
org.eclipse.core.runtime
org.eclipse.ui
com.ibm.rcp.propertybroker
com.ibm.rcp.propertybroker.portlet JSR 168 Portlet 处理程序

处理程序类型:PORTLET

操作接口:JSR 168 Portlet
org.eclipse.core.runtime
org.eclipse.ui
com.ibm.rcp.propertybroker
com.ibm.rcp.portletcontainer
com.ibm.rcp.propertybroker.awt AWT Action 处理程序

处理程序类型:AWT_ACTION

操作接口:java.awt.Component
org.eclipse.core.runtime
com.ibm.rcp.propertybroker

需要理解的最关键部分是上表中的依赖项列。如果编写了没有头部的操作(即不能有 UI 依赖项的插件或代码),那么在实现操作时应该使用 org.eclipse.core.commands.IHandler 接口。如果组件是基于图形化的组件,例如 SWT 视图,那么应实现 org.eclipse.core.commands.IHandler 接口,但应在创建操作时指定 SWT_ACTION 类型。SWT 操作处理程序消除了启用和禁用页面级连接时的烦恼。显示或隐藏透视图时,将分别适当地启用或禁用在复合应用程序 XML 中定义的任何连接。

如前所述,操作处理程序负责实现与可调用操作兼容的对象,并提供 PropertyChangeEvent 接口,这样属性和连接信息就可为操作所用(参见图 3)。在大多数情况下,仅创建了操作,并没有创建操作处理程序。


图 3. 操作处理程序流

在组件中创建操作

本部分将重点讨论操作的创建。首先,您必须了解操作就是用来实现预定义接口的一段代码。属性值发生更改时、属性被适当地连接到操作组件时,将在这段代码中调用方法。

首先创建 PropertyBrokerDefinitions 扩展点的扩展。为创建该扩展点,必须具有 com.ibm.rcp.propertybroker 包的依赖项。该扩展正确地注册了操作及其输入和输出属性。

若要快速开始,可以使用随 Lotus Expeditor Toolkit 提供的模板之一。Property Broker Definitions 模板将创建扩展、WSDL 文件以及操作 Java 类。有两个可供选择的模板:一个用于基本的 Eclipse 操作,另一个用于 SWT 操作(参见图 4)。


图 4. 选择扩展点


模板将显示一个屏幕,在其中可填写输入和输出属性名以及用于声明它们的名称空间(参见图 5)。应将模板看作是起始点,因为它们创建了仅带有一个输入属性和一个输出属性的操作。您总是可以手动更改 WSDL 文件来包含其他输出参数。

注意:目前 Property Broker 仅支持单个输入属性。

下一个输入屏幕用于定义操作类、该类所在的包,以及用于创建带有输入和输出参数的操作的所有其他元素。

注意:所有这些内容均可在生成时直接在 WSDL 和操作代码中更改。


图 5. 定义模板


现在,您已经创建了发生属性更改时作为入口点的操作类。

图 6 展示了 Eclipse 集成开发环境(IDE)以及模板根据所提供的信息创建的工件。图中位置 1 是用于核心 Eclipse 命令或基于 SWT 的操作的操作 Java 文件;位置 2 是上面输入的功能完备的 WSDL 文件;位置 3 是扩展点;位置 4 是与所生成的 WSDL 的关联。


图 6. Eclipse IDE


最后,当 Property Broker 处理 PropertyBrokerDefinitions 扩展时,它将插件 ID 作为所有者 ID 来注册属性。理解这一点是很重要的,因为 Property Broker 中的一个所有者必须具有惟一的组件。单个的所有者仅能有惟一的属性名和操作名。





回页首


结合使用 SWT 操作和 Property Broker

现在讨论一下如何在 Property Broker 中使用基于 SWT 的组件(即视图)。首先,必须了解操作代码并未直接绑定到任何具体的视图或视图实例。但是,您可以使用 CAI 和传递到操作中的数据的组合来更新特定的视图实例。遗憾的是,这在 SWT 操作中并不容易,但存在可为您提供帮助的 helper API。

在 execute() 方法中调用操作时,必须调用一对 helper 函数来更新特定的视图实例(如果这是操作的目的)。所创建的示例代码与清单 1 类似。

清单 1. 示例代码
public Object execute(ExecutionEvent event) throws ExecutionException {

  final Object eventTrigger = event.getTrigger();
	
  if (eventTrigger instanceof PropertyChangeEvent){
	final PropertyChangeEvent pce = (PropertyChangeEvent)eventTrigger;
			
	final PropertyValue value = pce.getPropertyValue();
			
	Display.getDefault().asyncExec(new Runnable() {
		public void run(){

		Wire def = pce.getWireDefinition();
					
		ViewPart view = SWTHelper.locateView(def.getTargetEntityId());
					
		}
	});
  }
  return null;
}


请注意以粗体突出显示的几行代码。SWTHelper 类拥有一些静态方法,可帮助您识别所处理的特定视图实例。视图 ID 包含在 PropertyChangeEvent 的连接定义对象中。在连接定义中可以引用源视图和连接的目标视图。CAI 负责确保使用正确信息来调用操作。locateView() 调用将返回目标视图实例 IViewPart。应执行 instanceOf 操作来确保它就是正在寻找的视图,然后将其类型转换为适当的视图类。

集成组件与 WebSphere Portal CAI

下一步是向 WebSphere Portal 注册您的组件,以便将其集成到 CAI 中。主要工件是为操作扩展创建的 WSDL 文件。同一 WSDL 文件还必须用在 WebSphere Portal 所定义的 portlet 中。原因在于,该 portlet 要向 WebSphere Portal Property Broker 来注册属性和操作,并允许该 portlet 与其它 portlet 连接(请记住 WebSphere Portal 中的所有组件必须首先是 portlet)。使用基于 Eclipse 的视图作为运行库,只需向 WebSphere Portal 注册 portlet,这样就可以为组件注册属性和操作。实际上,portlet 就是屏幕上的占位符,即您的组件在客户机上的显示位置。

对于本例,我们在 IBM Rational Application Developer 中创建了示例 portlet,并将 WSDL 文件附到该 portlet 上。因为没有将 portlet 用于运行库,所以 portlet 代码不必完成任何任务。这个 portlet 被配置为告知客户端 CAI 使用 SWT 视图而不是 portlet。

创建了 portlet 后,以创建协作 portlet 时所使用的方式为它添加 WSDL。编辑 portlet.xml 文件,并将它指向 WAR 文件中 WSDL 文件所在的位置(参见图 7)。

注意:为简洁起见,应将 portlet 命名为与 Eclipse 视图名类似的名称。将 portlet 放置到页面上时,如果其名称与 SWT 视图的名称相近,会给您带来很大的方便。


图 7. 为 WSDL 位置而编辑 portlet.xml


在图 7 中,可以看到必须指定的 portlet 首选项是 com.ibm.portal.propertybroker.wsdllocation。对于每一个 portlet 和 WSDL 文件,必须将该首选项添加到 portlet.xml 中。

下一步是从 Rational Application Developer 导出 WAR 文件,然后使用 Portlet Management 下的 Portal Admin 工具将该文件导入 WebSphere Portal(参见图 8)。


图 8. 导入 WAR 文件


可以将代表视图的 portlet 打包到一个 WAR 文件中。同样,建议您尽可能地使 WAR 文件和 Eclipse 插件相匹配。

接下来,将 portlet 放置在页面上(参见图 9),并使用 Rich Client 附签来编辑它们的首选项,管理员在 WebSphere Portal 上安装 Network Client Installer(NCI)时会安装此附签。


图 9. Edit Layout 页


将 portlet 放置到屏幕上后,就可以编辑它们的 portlet 实例首选项了(参见图 10)。


图 10. Rich Client 附签


Rich Client 附签将处理设置 portlet 首选项时可能出现的复杂问题。代码将名为 com.ibm.rcp.viewId 的首选项设置为 Eclipse view id 字段中的文本。这应是 SWT 组件的主视图 ID。当 CAI 创建透视图并注册视图时,portlet ID 是视图的第二视图 ID。

配置完组件并将它们插入页面后,可以使用 Wires 附签下的 Portal Wiring Tool 来连接兼容的属性和操作。图 11 展示了连接到 Managed Browser portlet 的 URLSelector portlet。


图 11. Portlet Wiring Tool
 

部署组件以便供应

若要将组件作为 WebSphere Portal 的复合应用程序的一部分进行分发,必须将组件插件部署到 HTTP 服务器上,并将组件指向该服务器。为此,在 portlet 首选项编辑器的 Rich Client 附签中指定 Eclipse 更新站点的 URL。

首先,将插件打包为一项 Eclipse 特性,然后将该特性部署到更新站点。创建了更新站点后,必须将该站点复制到客户机可连接的远程 HTTP 服务器。

图 12 展示了 Rich Client 附签中为 portlet 指定的 URL 和必要条件。请注意,这里指定了特性 ID、版本、匹配规则以及用于检索它的 URL。


图 12. Rich Client 附签的 Portlet feature requirements


通过在 portlet 首选项中指定特性,您就可以告诉 CAI 在启动应用程序之前下载这些特性。因此在启动屏幕之前,首先会下载、安装并激活特性。

使用 OSGi 控制台进行调试

使用 -console 开关启动 Lotus Expeditor 或 Eclipse 平台时,可以使用一些控制台级命令来调用 Property Broker。这些命令仅用于调试。声明式系统在本质上是相当复杂的,因此这些命令可以协助您弄清楚 Property Broker 调用了哪些组件(如果有的话)。

Property Broker 有一套可发布用于协助调试和测试的开放服务网关协议(Open Service Gateway initiative,OSGi)控制台命令。仅当使用 – console 命令启动平台时,这些命令才会出现,在控制台键入 help 可以访问命令列表。下面是 Property Broker 支持的最新命令列表(请注意所有的命令均以 pb 开始):

清单 2. Property Broker 命令
---Property Broker Commands---
	pbsh a - Show all Actions
	pbsh aa - Show all Active Actions
	pbsh p - Show all properties by owner
	pbsh p  - Show all properties for this owner (string owners only)
	pbsh w - Show all enabled wires
	pbsh aw - Show all wires
	pbsh ns - Show registered name spaces
	pbt  - Trace the path for the specified property
	pbut  - UnTrace the specified property, removes the trace
	pblt - Show a list of the currently traced Properties


如前所述,默认情况下,操作和属性的所有者就是在其中创建了扩展的插件 ID。对于连接,用于 CAI 时连接的所有者是透视图 ID。当 CAI 注册连接时,将自动指定透视图 ID 作为连接所有者。切换透视图时,CAI 将自动适当地启用和禁用连接。如果使用 API 或 Extension Point 手动注册连接,您就要负责启用、禁用及取消注册连接。

调试技巧

下面是调试过程中可能出现的问题和应对技巧:

  • 跟踪属性
    如果您不能确定组件未接受属性更改的原因,可以使用 Property Broker 跟踪命令 pbt 来跟踪那个属性。此命令将向控制台和日志打印调试信息,实际上也就是跟踪所更改的属性的路径。如果没有显示任何输出,那么可能是键入了错误的属性名,也有可能是源组件从未发布过该属性,例如:

    osgi> pbt mypropery
    osgi> pbt “my property with spaces”

  • 连接不工作
    如果组件似乎没有工作或没有接受任何属性更改,那么请确保启用了连接和操作。可以使用 pbsh w 命令来显示所有活动的连接,使用 pbsh aa 命令来显示所有活动的操作。
  • 您的 WSDL 注册
    使用属性和操作的基本显示命令来确保正确地向 Property Broker 注册了 WSDL 文件。pbsh ppbsh p 命令会列出所有已注册的属性。对于操作,可以使用 pbsh a 命令来获取所有已注册操作的列表。

调试 WebSphere Portal 拓扑结构

您可能拥有很多 WebSphere Portal 应用程序,每个应用程序中可能有很多页面,而每个页面中又可能有很多组件。客户端拓扑管理器从 WebSphere Portal 获取复合应用程序 XML,并动态地为 Eclipse 创建透视图、布局及视图。拓扑处理程序还提供了透视图和视图的数据模型,并将 Eclipse 活动关联到页面。

下面是可用于调试的 OSGi 命令列表(回想一下,通过在 OSGi 控制台键入 help 也可以显示该列表):

清单 3. 用于调试的 OSGi 命令
---Topology Handler UI Commands---
thuish desc - Show all Perspective Descriptors
thuish del  - Delete a Perspective Descriptor
thuish lp Show all Launcher Item IDs
thuish cd Show Current Perspective Descriptor
thuish ea Show Current Enabled Activities
thuish a  Show Activity State

---Topology Handler Commands--- thsh n - Show all navigation elements thsh p - Show all Pages thsh l - Show all Labels thsh f - Show all topology files thsh apps - Show all application GUIDs thsh e - Show all registered extensions under the given namespace thsh dp - Show all dirty pages thsh nattr - Show all navigation preferences

结束语

复合应用程序是一个强大的概念。就无缝、一致地集成多种不同的组件和技术而言,运行时架构的开放性带来了多种可能性。本文在基础层面上讨论了如何构建复合应用程序再将其聚合到单个用户界面中。

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

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

你可能感兴趣的:(为 IBM Lotus Expeditor Property Broker 创建协作组件)