首页> 中国专利> 服务组合实现方法及系统、服务组合编译方法及编译器

服务组合实现方法及系统、服务组合编译方法及编译器

摘要

本发明实施例涉及一种服务组合实现方法及系统、服务组合编译方法及编译器,其中服务组合实现方法包括:用户界面UI引擎客户端根据UI组件产生的事件生成UI交互消息;UI引擎服务器根据所述UI交互消息中的与所述事件相对应的待调用的组合应用的名称以及所述UI组件的操作名称生成组合引擎调用消息;组合引擎根据所述组合引擎调用消息包括的所述组合应用的名称以及所述UI组件的操作名称,调用由所述组合应用实现的所述UI组件的操作。本发明实施例中,UI组件为带有用户界面的Web应用,在Web应用开发时,由于通过组合引擎实现了对带有用户界面的Web应用的组合处理,从而提高了Web应用开发的效率。

著录项

  • 公开/公告号CN102158516A

    专利类型发明专利

  • 公开/公告日2011-08-17

    原文格式PDF

  • 申请/专利权人 华为技术有限公司;

    申请/专利号CN201010260782.4

  • 申请日2010-08-19

  • 分类号H04L29/08(20060101);G06F9/44(20060101);G06F9/45(20060101);

  • 代理机构11205 北京同立钧成知识产权代理有限公司;

  • 代理人刘芳

  • 地址 518129 广东省深圳市龙岗区坂田华为总部办公楼

  • 入库时间 2023-12-18 03:00:25

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2013-08-07

    授权

    授权

  • 2011-09-28

    实质审查的生效 IPC(主分类):H04L29/08 申请日:20100819

    实质审查的生效

  • 2011-08-17

    公开

    公开

说明书

技术领域

本发明实施例涉及服务计算技术领域,尤其是一种服务组合实现方法及系统、服务组合编译方法及编译器。

背景技术

随着服务计算技术的发展,服务计算逐渐成为开放异构环境中的主流计算模式。在利用服务实现系统的功能时,单个服务往往无法完成全部需求,必须依靠一组服务相互之间的协作才能达到目的,服务组合作为实现灵活、快速集成的重要方法,为企业间的应用集成提供了有效支持。不断丰富的Web服务使通过组合已有服务提供新的增值服务成为一种具有重要价值的应用构造模式,服务组合技术成为服务计算中的核心技术之一。

从Web服务组合的技术维度来看,Web服务组合主要包括工作流技术和人工智能技术;其中,工作流技术通常需要在设计阶段预先定义组合流程和流程中的服务节点,运行阶段根据设计阶段预先定义的流程进行合成服务,属于静态服务组合类型;人工智能技术通常不需要预先描述好合成的流程,而是通过预设的规划方法,分析用户的需求选择合适的服务,从而动态地合成服务。从Web服务组合的业务维度来看,Web服务组合从顶向下可以分为UI组合、业务逻辑组合和业务数据组合三个层面,其中,UI组合描述了面向用户的、可视的、不同服务界面之间的集成关系,业务逻辑组合描述了服务之间的控制依赖关系,业务数据组合描述了服务之间的数据依赖关系。

现有技术主要集中于业务逻辑组合,例如:通过商业流程执行语言(Business Process Execution Language,简称:BPEL)只能够组合不带用户界面的Web服务,对于具有用户界面的互联网上数量众多的各种Web应用,采用BPEL无法进行组合。

发明内容

本发明实施例的目的在于提供一种服务组合实现方法及系统、服务组合编译方法及编译器,通过对用户界面的重用提高Web应用开发的效率。

本发明实施例提供一种服务组合实现方法,包括:

用户界面UI引擎客户端根据UI组件产生的事件生成UI交互消息,所述UI交互消息包括与所述事件相对应的待调用的组合应用的名称以及所述UI组件的操作名称;

UI引擎服务器根据所述UI交互消息中的与所述事件相对应的待调用的组合应用的名称以及所述UI组件的操作名称生成组合引擎调用消息,所述组合引擎调用消息包括所述组合应用的名称以及所述UI组件的操作名称;

组合引擎根据所述组合引擎调用消息包括的所述组合应用的名称以及所述UI组件的操作名称,调用由所述组合应用实现的所述UI组件的操作。

本发明实施例提供一种服务组合实现方法,包括:

组合引擎上执行的组合应用向UI引擎服务器发出UI调用消息,以调用所述UI引擎服务器实现的UI组件的操作;

所述UI引擎服务器将所述UI调用消息转换为UI交互消息;

所述UI引擎客户端获取所述UI交互消息,根据所述UI交互消息触发所述UI组件的操作,实现调用所述UI组件对应的函数。

本发明实施例提供一种服务组合编译方法,包括:

基于Web服务的WSDL描述和UI组件的UI描述,统一组合描述编译器对统一组合描述进行编译,生成UI交互描述、生成常规业务流程执行语言组合描述和生成UI引擎配置;

统一组合描述编译器将生成的UI交互描述部署到UI引擎客户端,使所述UI引擎客户端基于所述UI交互描述进行执行;

统一组合描述编译器将生成的常规业务流程执行语言组合描述部署到组合引擎,使所述组合引擎基于所述常规业务流程执行语言组合描述进行组合应用执行;

统一组合描述编译器将生成的UI引擎配置部署到UI引擎服务器上,使所述UI引擎服务器基于所述UI引擎配置进行配置,实现所述UI引擎客户端与所述组合引擎之间的通信交互。

本发明实施例提供一种服务组合实现系统,包括:

UI引擎客户端,用于根据UI组件产生的事件生成UI交互消息,所述UI交互消息包括与所述事件相对应的待调用的组合应用的名称以及所述UI组件的操作名称;

UI引擎服务器,用于根据所述UI交互消息中的与所述事件相对应的待调用的组合应用的名称以及所述UI组件的操作名称生成组合引擎调用消息,所述组合引擎调用消息包括所述组合应用的名称以及所述UI组件的操作名称;

组合引擎,用于根据所述组合引擎调用消息包括的所述组合应用的名称以及所述UI组件的操作名称,调用由所述组合应用实现的所述UI组件的操作。

本发明实施例提供一种统一组合描述编译器,包括:

统一处理模块,用于基于Web服务的WSDL描述和UI组件的UI描述,对统一组合描述进行编译,生成UI交互描述、生成常规业务流程执行语言组合描述和生成UI引擎配置;

第一部署模块,用于将生成的UI交互描述部署到UI引擎客户端,使所述UI引擎客户端基于所述UI交互描述进行执行;

第二部署模块,用于将生成的常规业务流程执行语言组合描述部署到组合引擎,使所述组合引擎基于所述常规业务流程执行语言组合描述进行组合应用执行;

第三部署模块,用于将生成的UI引擎配置部署到UI引擎服务器上,使所述UI引擎服务器基于所述UI引擎配置进行配置,实现所述UI引擎客户端与所述组合引擎之间的通信交互。

本发明实施例中,根据UI组件产生的事件生成UI交互消息,根据该UI交互消息生成组合引擎调用消息,由于组合引擎调用消息包括组合应用的名称以及UI组件的操作名称,从而使得组合引擎能够根据组合应用的名称以及UI组件的操作名称调用组合应用实现的UI组件的操作。UI组件为带有用户界面的Web应用,在Web应用开发时,由于通过组合引擎实现了对带有用户界面的Web应用的组合处理,从而提高了Web应用开发的效率。

附图说明

为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本发明服务组合实现方法一个实施例的流程示意图;

图2为图1所示实施例的信令流程图;

图3为本发明服务组合实现方法又一个实施例的流程示意图;

图4为图3所示实施例的信令流程图;

图5为本发明服务组合编译方法实施例的流程示意图;

图6为本发明服务组合实现系统实施例的结构示意图;

图7为本发明统一组合描述编译器实施例的结构示意图;

图8为本发明所适用系统的架构示意图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

图1为本发明服务组合实现方法一个实施例的流程示意图,如图1所示,本实施例包括如下步骤:

步骤101、UI引擎客户端根据UI组件产生的事件生成UI交互消息,其中,UI交互消息包括与该事件相对应的待调用的组合应用的名称以及该UI组件的操作名称;

步骤102、UI引擎服务器根据该UI交互消息中的与该事件相对应的待调用的组合应用的名称以及该UI组件的操作名称生成组合引擎调用消息,其中,组合引擎调用消息包括组合应用的名称以及该UI组件的操作名称;

步骤103、组合引擎根据该组合引擎调用消息包括的该组合应用的名称以及该UI组件的操作名称,调用由该组合应用实现的所述UI组件的操作。

本发明实施例提供的服务组合实现方法,UI引擎客户端根据UI组件产生的事件生成UI交互消息,UI引擎服务器根据该UI交互消息生成组合引擎调用消息,由于组合引擎调用消息包括组合应用的名称以及该UI组件的操作名称,从而使得组合引擎能够根据组合应用的名称以及该UI组件的操作名称调用该组合应用实现的该UI组件的操作,实现了组合应用与UI组件的交互。UI组件为带有用户界面的Web应用,在Web应用开发时,由于通过组合引擎实现了对带有用户界面的Web应用的组合处理,无需再单独开发用户界面部分,从而提高了Web应用开发的效率。

为了更清楚地说明本发明实施例所述的技术方案,下面对图2所示实施例进行详细描述。图2为图1所示实施例的信令流程图,如图2所示,本实施例包括如下步骤:

步骤201、UI引擎客户端获取UI组件产生的事件;

其中,本实施例中所述的事件具体可以是在UI组件的状态发生改变时产生的事件,该事件被UI引擎客户端(Client)获取到,进一步地,本发明实施例所述的UI组件的状态发生改变具体可以为:通过函数执行改变UI组件的界面内容或者UI组件接收用户输入;

步骤202、UI引擎客户端将该事件转换为UI交互消息,并将该UI交互消息发送给UI引擎服务器;

具体地,UI引擎客户端接收到该事件后,可以通过设置在事件总线上的监听器获取与UI组件产生的事件相对应的待调用的组合应用的名称,并获取该UI组件的操作名称,从而进一步根据组合应用的名称与UI组件的操作名称将该UI组件产生的事件进行转换生成UI交互消息,其中,UI交互消息包括组合应用的名称以及UI组件的操作名称等信息;该UI交互消息的参数与UI组件产生的事件的参数相同;该UI交互消息可以通过UI引擎客户端中的接口模块发送给UI引擎服务器。

步骤203、UI引擎服务器从UI交互消息中获取组合应用的名称以及该UI组件的操作名称,根据该组合应用的名称以及UI组件的操作名称将UI交互消息进行转换生成组合引擎调用消息,将该组合引擎调用消息发送给组合引擎;

其中,UI引擎服务器(Server)协助UI组件与运行于组合引擎上的组合应用之间实现通信交互。具体为:通过UI引擎服务器的数据发送模块发送数据到UI引擎客户端(Client)的接口模块,以及接收来自UI引擎客户端(Client)的数据,并为UI组件向组合应用发送数据,从而实现消息数据的正确交换;进一步地,可以通过UI引擎服务器的数据发送模块将该UI交互消息转换为组合引擎调用消息,该组合引擎调用消息的参数与UI交互消息的参数相同,并将该组合引擎调用消息发送给组合引擎。

步骤204、组合引擎根据组合引擎调用消息包括的组合应用的名称以及该UI组件的操作名称,调用该组合应用实现的UI组件的操作;

具体地,组合应用基于常规业务流程执行语言组合描述在该组合引擎上执行,组合引擎根据组合引擎调用消息调用由组合应用实现的该UI组件的接收端口类型的操作;组合引擎发出Web服务调用消息或者UI调用消息,从而实现调用相应的Web服务或者UI组件。

本发明实施例提供的服务组合实现方法,根据UI组件产生的事件生成UI交互消息,根据该UI交互消息生成组合引擎调用消息,由于组合引擎调用消息包括组合应用的名称以及该UI组件的操作名称,从而使得组合引擎能够根据组合应用的名称以及该UI组件的操作名称调用该组合应用实现的该UI组件的操作,实现了组合应用与UI组件的交互。UI组件为带有用户界面的Web应用,在Web应用开发时,由于通过组合引擎实现了对带有用户界面的Web应用的组合处理,无需再单独开发用户界面部分,从而提高了Web应用开发的效率。

图3为本发明服务组合实现方法又一个实施例的流程示意图,如图3所示,本发明实施例包括如下步骤:

步骤301、组合引擎上执行的组合应用向UI引擎服务器发出UI调用消息,以调用UI引擎服务器实现的UI组件的操作;

步骤302、UI引擎服务器将该UI调用消息转换为UI交互消息;

步骤303、UI引擎客户端获取该UI交互消息,根据该UI交互消息触发该UI组件的操作,实现调用该UI组件对应的函数。

本发明实施例提供的服务组合实现方法,由于UI交互消息包括该事件,从而使得UI引擎客户端能够根据该事件调用该UI组件的函数,实现了组合应用与UI组件的交互。UI组件为带有用户界面的Web应用,在Web应用开发时,由于通过组合引擎实现了对带有用户界面的Web应用的组合处理,无需再单独开发用户界面部分,从而提高了Web应用开发的效率。

为了更清楚地说明本发明实施例所述的技术方案,下面对图3所示实施例进行详细描述,图4为图3所示实施例的信令流程图,本实施例对组合应用如何调用UI组件的函数进行示例性说明;如图4所示,本实施例包括如下步骤:

步骤401、UI引擎服务器接收组合引擎上执行的组合应用发送的UI调用消息,该UI调用消息包括组合应用的名称,该UI组件的名称以及该UI组件的操作名称;

步骤402、UI引擎服务器将该UI调用消息转换为事件,事件的名称为该UI组件的操作名称,而事件发送者为该组合应用;然后向UI引擎客户端发送UI交互消息,其中,该UI交互消息包括该事件、该事件的名称以及事件发送者的名称;

其中,UI引擎暴露接口将该UI调用消息转换为事件,该事件的参数与UI调用消息的参数相同;此外,该事件还可以被UI引擎服务器存储到存储模块中;UI引擎服务器的数据发送模块将该事件转换为UI交互消息发送给UI引擎客户端(Client)。

步骤403、UI引擎客户端根据该UI交互消息触发UI组件的操作。

其中,UI引擎客户端的接口模块接收到该UI交互消息,根据该UI交互消息包括的事件的名称,以及事件发送者的名称,基于在事件总线中执行的监听器,通过该UI交互消息包括的事件触发UI组件的操作,即调用该UI组件的函数,其中,该UI组件的函数的输入参数与该事件的参数相同。

通过上述实施例,组合引擎执行组合应用,产生UI调用消息,UI引擎服务器将UI调用消息转换成事件,并将事件转换成UI交互消息,使得UI引擎客户端根据UI交互消息触发UI组件的操作。组合引擎、UI引擎客户端、UI引擎服务器相互之间的交互协调实现了业务逻辑和用户界面的统一执行,在开发Web应用时,能够同时组合业务逻辑与用户界面,即同时实现了业务逻辑和用户界面的重用,无需再手工开发最终应用的用户界面,从而提高了Web应用开发的效率。

图5为本发明服务组合编译方法实施例的流程示意图,如图5所示,本发明实施例包括如下步骤:

步骤501、基于Web服务的WSDL描述和UI组件的UI描述,统一组合描述编译器对统一组合描述进行编译,生成UI交互描述、生成常规业务流程执行语言组合描述和生成UI引擎配置;

步骤502、统一组合描述编译器将生成的UI交互描述部署到UI引擎客户端,使所述UI引擎客户端基于所述UI交互描述进行执行;

步骤503、统一组合描述编译器将生成的常规业务流程执行语言组合描述部署到组合引擎,使组合引擎基于所述常规业务流程执行语言组合描述进行组合应用执行;

步骤504、统一组合描述编译器将生成的UI引擎配置部署到UI引擎服务器上,使所述UI引擎服务器基于所述UI引擎配置进行配置,实现所述UI引擎客户端与所述组合引擎之间的通信交互。

本发明实施例提供的服务组合编译方法,统一组合描述编译器通过编译统一组合描述分别生成UI交互描述并部署到UI引擎客户端的UI交互描述库,生成常规业务流程执行语言组合描述并部署到组合引擎,生成UI引擎配置并部署到UI引擎服务器的UI引擎配置库。随后,UI引擎客户端基于该UI交互描述进行执行,组合引擎基于该常规业务流程执行语言组合描述进行组合应用执行,而UI引擎服务器则基于该UI引擎配置进行相关的配置,实现UI引擎客户端和组合引擎之间的通信交互。

进一步地,在上述图5所示实施例的基础上,

对于统一组合描述中UI组件相关的组合流程,统一组合描述编译器将其分解为UI交互描述。UI交互描述由UI引擎客户端执行,用于确定UI引擎客户端上UI组件对外的交互关系;统一组合描述编译器将为参与统一组合应用交互的每个UI引擎客户端分别编译生成各自独立的UI交互描述。

首先分析参与交互的组件,对于一个UI引擎客户端,UI交互描述中将包括执行于其上的属于该统一组合应用的UI组件;如果需要与执行于组合引擎的组合应用交互,则还包括该组合应用。对于UI组件,还将分析客户端布局,转换统一组合描述中的位置指定定义,指定UI组件在客户端的具体页面,和/或在页面中的具体位置。

基于统一组合描述的具体的统一组合流程,分析UI组件的交互关系,交互机制基于事件总线,采用监听器关联组件之间的事件与操作:对应UI组件发出事件,转换为组合引擎调用消息传递到组合引擎,调用由组合应用实现的接收端口类型的操作的流程,通过监听器将该UI组件的该事件与该组合应用的该操作进行关联;对应组合应用发出UI调用消息,转换为事件传递到UI引擎客户端,触发UI组件的操作的流程,通过监听器将该组合应用的该事件与该UI组件的该操作进行关联;对应通过组合应用的中介作用,实现了同一UI引擎客户端上两个UI组件之间交互的中介流程,即前一UI组件发出事件,通过转换传递到组合引擎,再由组合应用经过转换最终被传递回UI引擎客户端,触发后一UI组件的操作的流程。分解该中介流程,通过监听器将该前一UI组件的该事件与该后一UI组件的该操作进行关联。

在编译了UI交互描述之后,因为统一组合描述在形式上是基于业务流程执行语言的,统一组合描述编译器只需将其中特定于UI交互描述的内容进行删除即可生成常规业务流程执行语言组合描述。包括删除指定被组合的组件为UI组件还是Web服务的描述,用于指定UI组件客户端布局的位置指定定义相关的描述。然后,若在编译UI交互描述时存在对中介流程的分解,将中介流程转换为UI组件之间在UI引擎客户端上的直接交互,则还可以删除该中介流程。通过将这样的中介流程分解,将简化常规业务流程执行语言组合描述的组合流程。

对于每个需要与组合应用交互的UI组件,统一组合描述编译器将产生对应的UI引擎配置并部署到UI引擎服务器中的UI引擎配置库,用于配置UI引擎暴露接口、存储模块、数据发送模块,实现UI引擎客户端和组合引擎之间的通信交互。基于UI引擎配置,UI引擎服务器的UI引擎暴露接口将实现每个UI组件的调用端口类型,用于在UI引擎服务器中为该UI组件向组合引擎暴露调用接口,以及接收组合引擎发出的UI调用消息,将该UI调用消息转换为事件。为此,统一组合描述编译器将在该UI组件的UI描述中增加对应的实现该调用端口类型的绑定定义,用于常规业务流程执行语言组合描述对该调用端口类型的实现引用。

为了更清楚的理解本发明实施例所述的技术方案,下面通过将一个Web服务和两个UI组件进行组合对本发明实施例进行例举说明;其中,Web服务具体为YaSearch,UI组件具体为LocalSearch与GoMap,UI组件LocalSearch与UI组件GoMap执行于同一个UI引擎客户端,也即位于同一个Web客户端。

Web服务YaSearch的接口描述包括一个“YaSearchService”的端口类型(portType),其中,具有一个搜索(Search)操作,实现对指定地理位置指定内容的查询功能,例如:查询设定地区的电影院,具体的调用接口采用简单对象访问协议(Simple Object Access Protocol,简称:SOAP)绑定。为了在统一组合应用中将该Web服务YaSearch、UI组件LocalSearch、UI组件GoMap进行组合,定义Web服务YaSearch的伙伴链接类型为:YaSearchpartnerLinkType,该Web服务YaSearch的伙伴链接类型包括一个服务(Service)角色(role),服务(Service)的端口类型(portType)为YaSearchService,在统一组合应用中将由YaSearch这个Web服务来实现。Web服务YaSearch的接口描述“YaSearch YaSearchService.WSDL”如下所示:

<?xml version=″1.0″encoding=″UTF-8″standalone=″no″?>

<wsdl:definitions xmlns:soap=″http://schemas.xmlsoap.org/wsdl/soap/″

xmlns:tns=″http://www.unitn.it/WS/YaSearchService/″

xmlns:wsdl=″http://schemas.xmlsoap.org/wsdl/″

xmlns:xsd=″http://www.w3.org/2001/XMLSchema″name=″YaSearchService″

targetNamespace=″http://www.unitn.it/WS/YaSearchService/″>

<wsdl:types>

<xsd:schema targetNamespace=″http://www.unitn.it/WS/YaSearchService/″>

<xsd:element name=″SearchRequest″>

<xsd:complexType>

<xsd:sequence>

<xsd:element name=″Query″type=″xsd:string″></xsd:element>

<xsd:element name=″Location″type=″xsd:string″/>

</xsd:sequence>

</xsd:complexType>

</xsd:element>

<xsd:element name=″SearchResponse″>

<xsd:complexType>

<xsd:sequence>

<xsd:element name=″resultXML″type=″xsd:string″/>

</xsd:sequence>

</xsd:complexType>

</xsd:element>

</xsd:schema>

</wsdl:types>

<wsdl:message name=″SearchRequest″>

<wsdl:part element=″tns:SearchRequest″name=″SearchQuery″/>

</wsdl:message>

<wsdl:message name=″SearchResponse″>

<wsdl:part element=″tns:SearchResponse″name=″SearchResult″/>

</wsdl:message>

<wsdl:portType name=″YaSearchService″>  //YaSearchService端口类型

<wsdl:operation name=″Search″>    //Search操作

<wsdl:input message=″tns:SearchRequest″/>

<wsdl:output message=″tns:SearchResponse″/>

</wsdl:operation>

</wsdl:portType>

<plnk:partnerLinkType name=″YaSearch″>  //YaSearch的伙伴链接类型

<plnk:role name=″Service″portType=″tns:YaSearchService″/>  //服务角色

</plnk:partnerLinkType>

<wsdl:binding name=″YaSearchServiceSOAP″type=″tns:YaSearchService″>

<soap:binding style=″document″

transport=″http://schemas.xmlsoap.org/soap/http″/>

<wsdl:operation  name=″Search″>

<soap:operation soapAction=″http://www.unitn.it/WS/YaSearchService/Search″/>

<wsdl:input>

<soap:body use=″literal″/>

</wsdl:input>

<wsdl:output>

<soap:body use=″literal″/>

</wsdl:output>

</wsdl:operation>

</wsdl:binding>

<wsdl:service name=″YaSearchService″>

<wsdl:port binding=″tns:YaSearchServiceSOAP″name=″YaSearchServiceSOAP″>

<soap:address location=″http://www.unitn.it/WS/YaSearchService″/>

</wsdl:port>

</wsdl:service>

</wsdl:definitions>

UI组件LocalSearch为浏览器端JavaScript用户界面程序,为用户提供搜索输入框和结果显示列表的用户界面。LocalSearch具有三个函数:更新(update)函数、搜索(search)函数、被选项(itemSelected)函数,其中,更新(update)函数用于显示搜索结果,搜索(search)函数用于接收用户的搜索输入,被选项(itemSelected)函数用于接收用户对搜索结果的选择。UI引擎客户端基于接收的事件将调用更新(update)函数。而搜索(search)函数和被选项(itemSelected)函数执行之后将向UI引擎客户端(Client)发出事件,其中,事件名(search)与函数名(search)相同。具体的JavaScript代码如下所示:function searchPos(id,divId,constrParams){

this.id=id;

this.divId=divId;

this.load=function(){

var mydiv=document.getElementById(this.divId);

mydiv.innerHTML=″<br><FORM id=′searchForm′><span width=′90%′>″

+″what<input type=′text′name=′what′>″

+″where<input type=′text′name=′where′>″

+″<input type=′button′value=′Search′

onClick=′MashArt.FW.execute(\″″+this.id+″\″,\″search\″,[this.form.what.value,this.form.where.val

ue]);′></INPUT></FORM></span>″

+″<hr><DIV id=′searchListDiv′></DIV>″;

}

this.update=function(inputArray){  //更新函数

var results=inputArray[resultXML];

this.printResults(results);

}

this.search=function(what,where){  //搜索函数

var searchListDiv=document.getElementById(this.divId).lastChild;

searchListDiv.innerHTML=″<br><blink>Loading...</blink>″;

var outputArray=new Array();

outputArray[″what″]=what;

outputArray[″where″]=where;

FW.raiseEvent(id,″search″,outputArray);

}

this.itemSelected=function(lat,lng){  //被选项函数

var outputArray=new Array();

outputArray[″latitude″]=parseFloat(lat);

outputArray[″longitude″]=parseFloat(lng);

FW.raiseEvent(id,″itemSelected″,outputArray);

}

this.printResults(results){

...

}

}

FW.addComponent();

基于扩展WSDL对UI组件LocalSearch进行描述,生成的UI描述包括调用端口类型LocalSearchPortTypeINVOKE和接收端口类型LocalSearchPortTypeRECEIVE两个端口类型(portType)。LocalSearchPortTypeINVOKE对应所有能被UI引擎客户端调用的LocalSearchUI组件的函数,即update函数,则形式上将包括一个对应的更新(Update)的操作(operation),其输入(input)对应UI引擎客户端(Client)接收到的触发该函数调用的事件,而函数的输入参数与该事件的参数相同。LocalSearchPortTypeRECEIVE对应所有能向UI引擎客户端发出事件的函数,即search函数和itemSelected函数,则形式上将包括两个对应的搜索(Search)和被选项(ItemSelected)的操作(operation),Search和ItemSelected两个操作的输入(input)分别对应search和itemSelected这两个函数向UI引擎客户端(Client)发出的与函数同名的搜索(search)事件和被选项(itemSelected)事件;通过将UI组件发出的事件转换成组合引擎调用消息后发送到执行于组合引擎上的BPEL组合应用,实际上接收端口类型LocalSearchPortTypeRECEIVE将由BPEL组合应用提供。定义UI组件LocalSearch的伙伴链接类型为:LocalSearch partnerLinkType,该UI组件LocalSearch的伙伴链接类型包括接收(Receive)和调用(Invoke)两个角色(role),接收(Receive)角色的端口类型(portType)为LocalSearchPortTypeRECEIVE,在统一组合应用中将由BPEL组合应用实现。调用(Invoke)角色的端口类型(portType)为LocalSearchPortTypeINVOKE,在统一组合应用中将由UI组件LocalSearch实现。绑定(Binding)部分通过支持JavaScript绑定扩展,表示LocalSearchPortTypeINVOKE端口类型(portType)的更新(Update)操作(operation)具体将与JavaScript更新(update)函数对应,而LocalSearchPortTypeRECEIVE端口类型(portType)的搜索(Search)和被选项(ItemSelected)两个操作(operation)分别与JavaScript搜索(search)函数和被选项(itemSelected)函数对应,实际上是对应上述两个函数向UI引擎客户端(Client)发出的与上述函数同名的搜索(search)事件和被选项

(itemSelected)事件。UI组件LocalSearch的UI描述具体如下所示:

<?xml version=″1.0″encoding=″UTF-8″standalone=″no″?>

<wsdl:definitions xmlns:tns=″http://www.unitnt.it/JS/LocalSearch″

xmlns:wsdl=″http://schemas.xmlsoap.org/wsdl/″xmlns:xsd=″http://www.w3.org/2001/XMLSchema″

name=″LocalSearch″targetNamespace=″http://www.unitnt.it/JS/LocalSearch″

xmlns:soap=″http://schemas.xmlsoap.org/wsdl/soap/″

xmlns:uijs=″http://www.unitn.it/UI/js″>

<wsdl:types>

<xsd:schema xmlns:xsd=″http://www.w3.org/2001/XMLSchema″

targetNamespace=″http://www.unitnt.it/JS/LocalSearch″>

<xsd:element name=″SearchElement″>

<xsd:compl exType>

<xsd:sequence>

<xsd:element name=″what″type=″xsd:string″></xsd:element>

<xsd:element name=″where″type=″xsd:string″></xsd:element>

<xsd:element name=″id_correlation″type=″xsd:string″></xsd:element>

</xsd:sequence>

</xsd:complexType>

</xsd:element>

<xsd:element name=″UpdateElement″>

<xsd:complexType>

<xsd:sequence>

<xsd:element name=″resultXML″type=″xsd:string″></xsd:element>

<xsd:element name=″id_correlation″type=″xsd:string″></xsd:element>

</xsd:sequence>

</xsd:complexType>

</xsd:element>

<xsd:element name=″ItemSelectedElement″>

<xsd:complexType>

<xsd:sequence>

<xsd:element name=″latitude″type=″xsd:string″></xsd:element>

<xsd:element name=″longitude″type=″xsd:string″></xsd:element>

<xsd:element name=″id_correlation″type=″xsd:stri ng″></xsd:element>

</xsd:sequence>

</xsd:complexType>

</xsd:element>

</xsd:schema>

</wsdl:types>

<wsdl:message name=″SearchMessage″>

<wsdl:part name=″SearchPart″element=″tns:SearchElement″></wsdl:part>

</wsdl:message>

<wsdl:message name=″UpdateMessage″>

<wsdl:part name=″UpdatePart″element=″tns:UpdateElement″></wsdl:part>

</wsdl:message>

<wsdl:message name=″ItemSelectedMessage″>

<wsdl:part name=″ItemSelectedPart″element=″tns:ItemSelectedElement″></wsdl:part>

</wsdl:message>

<wsdl:portType name=″LocalSearchPortTypeRECEIVE″>  //接收端口类型LocalSearchPortTypeRECEIVE

<wsdl:operation name=″Search″>  //搜索操作

<wsdl:input message=″tns:SearchMessage″></wsdl:input>

</wsdl:operation>

<wsdl:operation name=″ItemSelected″>  //被选项操作

<wsdl:input message=″tns:ItemSelectedMessage″></wsdl:input>

</wsdl:operation>

</wsdl:portType>

<wsdl:portType name=″LocalSearchPortTypeINVOKE″>  //调用端口类型LocalSearchPortTypeINVOKE

<wsdl:operation name=″Update″>  //更新操作

<wsdl:input message=″tns:UpdateMessage″></wsdl:input>

</wsdl:operation>

</wsdl:portType>

<plnk:partnerLinkType name=″LocalSearch″>  //LocalSearch伙伴链接类型

<plnk:role name=″Receive″portType=″tns:LocalSearchPortTypeRECEIVE″/>  //接收角色

<plnk:role name=″Invoke″portType=″tns:LocalSearchPortTypeINVOKE″/>    //调用角色

</plnk:partnerLinkType>

<wsdl:binding name=″LocalSearchJS1″type=″tns:LocalSearchPortTypeINVOKE″>

<uijs:binding version=″″/>

<wsdl:operation name=″update″>  //更新操作与JavaScript更新函数对应

<uijs:operation jsFunction=″update″/>

</wsdl:operation>

</wsdl:binding>

<wsdl:binding name=″LocalSearchJS2″type=″tns:LocalSearchPortTypeRECEIVE″>

<uijs:binding version=″″/>

<wsdl:operation name=″Search″>  //搜索操作与JavaScript搜索函数对应

<uijs:event jsFunction=″search″/>

</wsdl:operation>

<wsdl:operation name=″TtemSelected″>  //被选项操作与JavaScript被选项函数对应

<uijs:event jsFunction=″itemSelected″/>

</wsdl:operation>

</wsdl:binding>

<wsdl:service name=″LocalSearch″>

<wsdl:port name=″LocalSearchJS″binding=″tns:LocalSearchJS″>

<soap:address location=″http://www.unitnt.it/JS/LocalSearch.js″/>

</wsdl:port>

</wsdl:service>

</wsdl:definitions>

UI组件GoMap为浏览器端JavaScript用户界面程序,提供具体的地图信息。GoMap具有显示点(showPoint)函数,用于依据经度、纬度和缩放大小进行地图显示。对于UI引擎客户端(Client),基于接收的事件,将调用显示点(showPoint)函数。而本实施例中,GoMap不会向UI引擎客户端(Client)发出事件。GoMap的部分JavaScript代码如下所示:

function GoMap(id,divId,constrParams){

this._map;

this._divId=divId;

this._constrParams=constrParams;

//priviliged method

this.load=function(){

if(GBrowserIsCompatible()){

this.setMap(new GMap2(document.getElementById(this._divId)));

var map=this._map;

var params=this._constrParams;

var lat=parseFloat(params[′Latitude′]);

var lng=parseFloat(params[′Longitude′]);

var zoom=parseInt(params[′Zoom level′]);

map.setCenter(new GLatLng(lat,lng),zoom);

map.setUITopefault();

}

}

this.showPoint=function(inputArray){  //显示点函数

var lat=inputArray[″latitude″];

var lng=inputArray[″longitude″];

var zoom=15;

var map=this._map;

map.clearOverlays();

map.setCenter(new GLatLng(lat,lng));

var marker=new GMarker(new GLatLng(lat,lng));

map.addOverlay(marker);

}

}

FW.addComponent();

基于扩展WSDL对UI组件GoMap进行描述,包括调用端口类型GoMapPortTypeINVOKE这个端口类型(portType)。GoMapPortTypeINVOKE对应所有能被UI引擎客户端(Client)调用的GoMap的函数,即显示点(showPoint)函数,则形式上将包括一个对应的显示点(ShowPoint)的操作(operation),显示点操作的输入(input)对应UI引擎客户端(Client)接收到的触发该函数调用的事件,而函数的输入参数与该事件的参数相同。定义UI组件GoMap的伙伴链接类型为:GMaps partnerLinkType,包括一个调用(Invoke)角色(role),调用(Invoke)的端口类型(portType)为GoMapPortTypeINVOKE,在统一组合应用中将由UI组件GoMap实现。绑定(Binding)部分通过支持JavaScript绑定扩展,表示GoMapPortTypeINVOKE这个端口类型(portType)具体将由JavaScript函数showPoint提供。基于扩展WSDL对UI组件GoMap进行描述,生成UI描述GoMap.WSDL如下所示:

<?xml version=″1.0″encoding=″UTF-8″standalone=″no″?>

<wsdl:definitions xmlns:tns=″http://www.unitn.it/UI/GoMap/″

xmlns:wsdl=″http://schemas.xmlsoap.org/wsdl/″xmlns:xsd=″http://www.w3.org/2001/XMLSchema″

name=″GoMap″targetNamespace=″http://www.unitn.it/UI/GoMap/″

xmlns:soap=″http://schemas.xmlsoap.org/wsdl/soap/″xmlns:uijs=″http://www.unitn.it/UI/js″>

<wsdl:types>

<xsd:schema xmlns:xsd=″http://www.w3.org/2001/XMLSchema″

targetNamespace=″http://www.unitn.it/UI/GoMap/″>

<xsd:element name=″ShowPointPart″>

<xsd:complexType>

<xsd:sequence>

<xsd:element name=″latitude″type=″xsd:string″></xsd:element>

<xsd:element name=″longitude″type=″xsd:string″></xsd:element>

<xsd:element name=″id_correlation″type=″xsd:string″></xsd:element>

</xsd:sequence>

</xsd:complexType>

</xsd:element>

</xsd:schema>

</wsdl:types>

<wsdl:message name=″ShowPointMessage″>

<wsdl:part name=″ShowPointPart″element=″tns:ShowPointPart″></wsdl:part>

</wsdl:message>

<wsdl:portType name=″GoMapPortTypeINVOKE″>  //调用端口类型GoMapPortTypeINVOKE

<wsdl:operation name=″ShowPoint″>  //显示点操作

<wsdl:input message=″tns:ShowPointMessage″></wsdl:input>

</wsdl:operation>

</wsdl:portType>

<plnk:partnerLinkType name=″GMaps″>  //GMaps伙伴链接类型

<plnk:role name=″Invoke″portType=″tns:GoMapPortTypeINVOKE″/>  //调用角色

</plnk:partnerLinkType>

<wsdl:binding name=″GoMapJS″type=″tns:GoMapPortTypeINVOKE″>

<uijs:binding version=″″/>

<wsdl:operation name=″ShowPoint″>  //显示点操作与JavaScript显示点函数对应

<uijs:operation jsFunction=″showPoint″/>

</wsdl:operation>

</wsdl:binding>

<wsdl:service name=″GoMap″>

<wsdl:port name=″GoMapPortJS″binding=″tns:GoMapJS″>

<soap:addresslocation=″http://www.unitn.it/UI/gmap.js″/>

</wsdl:port>

</wsdl:service>

</wsdl:definitions>

基于扩展BPEL语言,将Web服务YaSearch、UI组件LocalSearch和UI组件GoMap组合为统一组合应用,生成统一组合描述如下所示:

<bpel:process name=″FindIt″

targetNamespace=″www.unitn.it/bpelui/example″

suppressJoinFailure=″yes″

xmlns:tns=″www.unitn.it/bpelui/example″

xmlns:bpel=″http://docs.oasis-open.org/wsbpel/2.0/process/executable″

xmlns:xmlns:ns=″http://www.unitnt.it/JS/LocalSearch″

xmlns:ns0=″http://www.unitn.it/WS/YaSearchService/″xmlns:ns2=″http://www.unitn.it/UI/GoMap/″>

<containers>  //定义master UI引擎客户端

<container name=″Master″htmlLayoutURL=″http://www.unitn.it/BPELLayout/masterLayout.html″

UIEngine=″FindItEngine″/>

</containers>

<bpel:import namespace=″http://www.unitn.it/UI/GoMap/″location=″GoMap.wsdl″

importType=″http://schemas.xmlsoap.org/wsdl/″></bpel:import>

<bpel:import namespace=″http://www.unitn.it/WS/YaSearchService/″

location=″YaSearchService.wsdl″importType=″http://schemas.xmlsoap.org/wsdl/″></bpel:import>

<bpel:import namespace=″http://www.unitnt.it/JS/LocalSearch″location=″LocalSearch.wsdl″

importType=″http://schemas.xmlsoap.org/wsdl/″></bpel:import>

<bpel:partnerLinks>

//UI组件LocalSearch

<bpel:partnerLink name=″LocalSearch″partnerLinkType=″ns:LocalSearch″myRole=″Receive″

partnerRole=″Invoke″uiComponent=″yes″container=″Master″

uiLayoutPlaceHolder=″bpel4ui_search″></bpel:partnerLink>

//web服务YaSearch

<bpel:partnerLink name=″YaSearch″uiComponent=″no″partnerLinkType=″ns0:YaSearch″

partnerRole=″Service″></bpel:partnerLink>

//UI组件GoMap

<bpel:partnerLink name=″GoMaps″partnerLinkType=″ns2:GMaps″partnerRole=″Invoke″

uiComponent=″yes″container=″Master″uiLayoutPlaceHolder=″bpel4ui_gmaps″>

<property name=″Latitude″type=″xsd:double″>46.0667</property>

<property name=″Longitude″type=″xsd:double″>11.1333</property>

<property name=″Zoom level″type=″xsd:int″>13</property>

</bpel:partnerLink>

</bpel:partnerLinks>

<bpel:variables>

<bpel:variable name=″LocalSearch″messageType=″ns:SearchMessage″></bpel:variable>

<bpel:variable name=″YaSearchResponse″messageType=″ns0:SearchResponse″></bpel:variable>

<bpel:variable name=″YaSearchRequest″messageType=″ns0:SearchRequest″></bpel:variable>

<bpel:variable name=″UpdateLocalSearch″messageType=″ns:UpdateMessage″></bpel:variable>

<bpel:variable name=″ItemSelected″messageType=″ns:ItemSelectedMessage″></bpel:variable>

<bpel:variable name=″ShowPointGMaps″messageType=″ns2:ShowPointMessage″></bpel:variable>

</bpel:variables>

<bpel:sequence>

<bpel:flow name=″Flow″>

<bpel:sequence name=″Sequence″>

//步骤11

<bpel:receive name=″Receive″partnerLink=″LocalSearch″operation=″Search″

portType=″ns:Local SearchPortTypeRECEIVE″variable=″LocalSearch″createInstance=″yes″>

</bpel:receive>

//步骤12

<bpel:assign validate=″no″name=″InitSearchLocation″>

<bpel:copy>

<bpel:from>

<bpel:literal xml:space=″preserve″>

<tns:SearchRequest xmlns:tns=″http://www.unitn.it/WS/YaSearchService/″

xmlns:xsi=″http://www.w3.org/2001/XMLSchema-instance″>

<Query></Query>

<Location></Location>

</tns:SearchRequest>

</bpel:literal>

</bpel:from>

<bpel:to variable=″YaSearchRequest″part=″SearchQuery″></bpel:to>

</bpel:copy>

<bpel:copy>

<bpel:from part=″SearchPart″variable=″LocalSearch″>

<bpel:query

queryLanguage=″urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0″><![CDATA[what]]></bpel:query>

</bpel:from>

<bpel:to part=″SearchQuery″variable=″YaSearchRequest″>

<bpel:query

queryLanguage=″urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0″><![CDATA[Query]]></bpel:query>

</bpel:to>

</bpel:copy>

<bpel:copy>

<bpel:from part=″SearchPart″variable=″LocalSearch″>

<bpel:query

queryLanguage=″urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0″><![CDATA[where]]></bpel:query>

</bpel:from>

<bpel:to part=″SearchQuery″variable=″YaSearchRequest″>

<bpel:query

queryLanguage=″urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0″><![CDATA[Location]]></bpel:query>

</bpel:to>

</bpel:copy>

</bpel:assign>

//步骤13

<bpel:invoke name=″SearchLocations″partnerLink=″YaSearch″operation=″Search″

portType=″ns0:YaSearchService″inputVariable=″YaSearchRequest″

outputVariable=″YaSearchResponse″></bpel:invoke>

//步骤14

<bpel:assign validate=″no″name=″InitUpdate″>

<bpel:copy>

<bpel:from>

<bpel:literal xml:space=″preserve″><tns:UpdateElement

xmlns:tns=″http://www.unitnt.it/JS/LocalSearch″

xmlns:xsi=″http://www.w3.org/2001/XMLSchema-instance″>

<resultXML></resultXML>

<id_correlation></id_correlation>

</tns:UpdateElement>

</bpel:literal>

</bpel:from>

<bpel:to variable=″UpdateLocalSearch″part=″UpdatePart″></bpel:to>

</bpel:copy>

<bpel:copy>

<bpel:from part=″SearchResult″variable=″YaSearchResponse″>

<bpel:query

queryLanguage=″urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0″><![CDATA[resultXML]]></bpel:query

>

</bpel:from>

<bpel:to part=″UpdatePart″variable=″UpdateLocalSearch″>

<bpel:query

queryLanguage=″urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0″><![CDATA[resultXML]]></bpel:query

>

</bpel:to>

</bpel:copy>

<bpel:copy>

<bpel:from part=″SearchPart″variable=″LocalSearch″>

<bpel:query

queryLanguage=″urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0″><![CDATA[id_correlation]]></bpel:

query>

</bpel:from>

<bpel:to part=″UpdatePart″variable=″UpdateLocalSearch″>

<bpel:query

queryLanguage=″urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0″><![CDATA[id_correlation]]></bpel:

query>

</bpel:to>

</bpel:copy>

</bpel:assign>

//步骤15

<bpel:invoke name=″Update″partnerLink=″LocalSearch″operation=″Update″

portType=″ns:LocalSearchPortTypeINVOKE″inputVariable=″UpdateLocalSearch″></bpel:invoke>

</bpel:sequence>

//步骤16

<bpel:pick name=″Selected″createInstance=″yes″><bpel:onMessage

partnerLink=″LocalSearch″operation=″ItemSelected″portType=″ns:LocalSearchPortTypeRECEIVE″

variable=″ItemSelected″>

<bpel:sequence>

//步骤17

<bpel:assign validate=″no″name=″Init″>

<bpel:copy>

<bpel:from>

<bpel:literal xml:space=″preserve″><tns:ShowPointPart

xmlns:tns=″http://www.unitn.it/UI/GoMap/″xmlns:xsi=″http://www.w3.org/2001/XMLSchema-instance″>

<latitude></latitude>

<longitude></longitude>

<id_correlation></id_correlation>

</tns:ShowPointPart>

</bpel:literal>

</bpel:from>

<bpel:to variable=″ShowPointGMaps″part=″ShowPointPart″></bpel:to>

</bpel:copy>

<bpel:copy>

<bpel:from part=″ItemSelectedPart″variable=″ItemSelected″>

<bpel:query

queryLanguage=″urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0″><![CDATA[latitude]]></bpel:query>

</bpel:from>

<bpel:to part=″ShowPointPart″variable=″ShowPointGMaps″>

<bpel:query

queryLanguage=″urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0″><![CDATA[latitude]]></bpel:query>

</bpel:to>

</bpel:copy>

<bpel:copy>

<bpel:from part=″ItemSelectedPart″variable=″ItemSelected″>

<bpel:query

queryLanguage=″urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0″><![CDATA[longitude]]></bpel:query

>

</bpel:from>

<bpel:to part=″ShowPointPart″variable=″ShowPointGMaps″>

<bpel:query

queryLanguage=″urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0″><![CDATA[longitude]]></bpel:query

>

</bpel:to>

</bpel:copy>

<bpel:copy>

<bpel:from part=″ItemSelectedPart″variable=″TtemSelected″>

<bpel:query

queryLanguage=″urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0″><![CDATA[id_correlation]]></bpel:

query>

</bpel:from>

<bpel:to part=″ShowPointPart″variable=″ShowPointGMaps″>

<bpel:query

queryLanguage=″urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0″><![CDATA[id_correlation]]></bpel:

query>

</bpel:to>

</bpel:copy>

</bpel:assign>

//步骤18

<bpel:invoke name=″ShowPoint″partnerLink=″GoMaps″operation=″ShowPoint″

portType=″ns2:GoMapPortTypeINVOKE″inputvariable=″ShowPointGMaps″></bpel:invoke>

</bpel:sequence></ppel:onMessage>

</bpel:pick>

</bpel:flow>

</bpel:sequence>

</bpel:process>

位置指定定义中,容器(containers)定义表示参与统一组合应用的UI引擎客户端(Client),由htmlLayoutURL属性指定其页面布局。UI组件(uiComponent)属性指定被组合的组件是否为UI组件。对于UI组件,容器(container)属性指定该UI组件所在的UI引擎客户端(Client),uiLayoutPlaceHolder属性指定该UI组件在该UI引擎客户端(Client)中的具体页面位置。本实施例中,容器(containers)定义表示统一组合应用包括Master一个UI引擎客户端(Client),由htmlLayoutURL属性指定它的页面布局为masterLayout.html。在伙伴链接(partnerLinks)定义中,YaSearch、LocalSearch和GoMap为三个伙伴链接(partnerLink)。UI组件LocalSearch通过容器(container)属性被指定到主机(Master)UI引擎客户端(Client),uiLayoutPlaceHolder属性则指定其在该UI引擎客户端(Client)中的具体页面位置为bpel4ui_search,bpel4ui_search为布局单元,例如通过<div id=″bpel4ui_search″>定义的HTML div元素。UI组件GoMap通过container属性被指定到主机(Master)UI引擎客户端,uiLayoutPlaceHolder属性则指定其在该UI引擎客户端(Client)中的具体页面位置为bpel4ui_gmaps,bpel4ui_gmaps为布局单元,例如通过<div id=″bpel4ui_gmaps″>定义的HTML div元素。

具体的组合流程包括如下步骤:

步骤11、BPEL组合应用FindIt通过receive活动,接收到对UI组件LocalSearch这个伙伴链接的Search操作的调用消息,对应于用户在界面的搜索输入参数;

步骤12、通过assign活动转换为YaSearchRequest变量;

步骤13、以YaSearchRequest变量作为输入,通过invoke活动调用Web服务YaSearch这个伙伴链接的Search操作,得到搜索结果存储到YaSearchResponse变量;

步骤14、通过assign活动将YaSearchResponse变量转换为UpdateLocalSearch变量;

步骤15、以UpdateLocalSearch变量作为输入,通过invoke活动调用UI组件LocalSearch这个伙伴链接的Update操作,实现在LocalSearch中显示Web服务YaSearch的搜索结果;

步骤16、BPEL组合应用FindIt通过pick活动,接收到对UI组件LocalSearch这个伙伴链接的ItemSelected操作的调用消息,对应于用户在界面中对搜索结果进行选择;

步骤17、通过assign活动转换为ShowPointGMaps变量;

步骤18、以ShowPointGMaps变量作为输入,通过invoke活动调用UI组件GoMaps这个伙伴链接的ShowPoint操作,即在GoMaps的地图中显示被选择的地点。

基于YaSearch的WSDL描述,LocalSearch和GoMap的UI描述,统一组合描述编译器对上述统一组合描述进行编译。

首先分析参与交互的组件,如UI交互描述的组件定义所示,本实施例中,将包括统一组合描述中由uiComponent属性指定的LocalSearch和GoMap两个UI组件。此外,为了被统一组合应用所组合,还将与BPEL组合应用FindIt交互。对于UI组件,还将分析客户端布局,转换统一组合描述中的位置指定定义,将uiLayoutPlaceHolder属性转换到组件定义,指定该UI组件在UI引擎客户端中的具体页面位置。本实施例中,UI组件LocalSearch位于Master UI引擎客户端的bpel4ui_search布局单元,UI组件GoMap位于Master UI引擎客户端的bpel4ui_gmaps布局单元。

然后分析UI组件的交互关系,交互机制基于事件总线,采用监听器关联组件之间的事件与操作。如UI交互描述的监听器定义所示,本实施例UI交互描述具体包括三个监听器:第一监听器(l1)、第二监听器(l2)、第三监听器(l3)。

第一监听器:组合流程中步骤11实际上表示UI组件LocalSearch将发出search事件,UI引擎客户端将该事件传递到UI引擎服务器,由UI引擎服务器转换为组合引擎调用消息发送到执行于组合引擎的BPEL组合应用FindIt,调用由FindIt实现的LocalSearchPortTypeRECEIVE这个端口类型(portType)的Search操作。则对应的有第一监听器,将UI组件LocalSearch的search事件与BPEL组合应用FindIt的Search操作进行关联;

第二监听器:组合流程中步骤15实际上表示BPEL组合应用FindIt将发出UI调用消息,调用UI引擎服务器上的UI引擎暴露接口实现的UI组件LocalSearch的Update操作。UI引擎服务器将该UI调用消息转换为update事件传递到UI引擎客户端,触发UI组件LocalSearch的Update操作,即update函数。则对应的有第二监听器,将BPEL组合应用FindIt的update事件与UI组件LocalSearch的Update操作进行关联;

第三监听器:组合流程中步骤16、步骤17、步骤18实际上表示通过BPEL组合应用FindIt的中介流程,UI组件LocalSearch与UI组件GoMaps之间的交互。因为这两个UI组件位于同一个UI引擎客户端,则可以分解FindIt的中介流程,在UI交互描述中表示为这两个UI组件之间在UI引擎客户端的直接交互,即UI组件LocalSearch将发出itemSelected事件,由UI引擎客户端触发UI组件GoMaps的ShowPoint操作,即showPoint函数。则对应的有第三监听器,将UI组件LocalSearch的itemSelected事件与UI组件GoMap的ShowPoint操作进行关联。通过将这样的中介流程分解,实现了简化常规业务流程执行语言组合描述的组合流程。生成的UI交互描述如下所示:

<?xml version=″1.0″encoding=″utf-8″?>

<uicl version=″0.1″>

<components>

<component id=″FindIt″process=″FindIt.bpel″/>  //BPEL组合应用FindIt

<component id=″LocalSearch″uiLayoutPlaceHolder=″bpel4ui_search″/>  //UI组件LocalSearch

<component id=″GoMaps″uiLayoutPlaceHolder=″bpel4ui_gmaps″>  //UI组件GoMaps

<property name=″Latitude″type=″xsd:double″>46.0667</input>

<property name=″Longitude″type=″xsd:double″>11.1333</input>

<property name=″Zoom level″type=″xsd:int″>13</input>

</component>

</components>

//第一监听器将UI组件LocalSearch的search事件与BPEL组合应用FindIt的Search操作进行关联

<listener id=″l1″>

<event id=″e1″component=″LocalSearch″name=″search″/>

<operation id=″o1″component=″FindIt″name=″Search″>

<input name=″where″src_id=″e1″src_name=″where″/>

<input name=″what″src_id=″e1″src_name=″what″/>

</operation>

</listener>

//第二监听器将BPEL组合应用FindIt的update事件与UI组件LocalSearch的Update操作进行关联

<listener id=″l2″>

<event id=″e2″component=″FindIt″name=″update″>

<operation id=″o2″component=″LocalSearch″name=″Update″>

<input name=″resultXML″src_id=″e2″src_name=″resultXML″/>

</operation>

</listener>

//第三监听器将UI组件LocalSearch的itemSelected事件与UI组件GoMap的ShowPoint操作进行关联

<listener id=″l3″>

<event id=″e3″component=″LocalSearch″name=″itemSelected″/>

<operation id=″o3″component=″GoMaps″name=″ShowPoint″>

<input name=″latitude″src_id=″e3″src_name=″latitude″/>

<input name=″longitude″src_id=″e3″src_name=″longitude″/>

</operation>

</listener>

</uicl>

在编译了UI交互描述之后,因为统一组合描述在形式上是基于BPEL语言的,统一组合描述编译器只需将其中特定于UI交互描述的内容进行删除即可得到常规业务流程执行语言组合描述。首先删除用于指定UI组件客户端布局的内容,包括containers定义,以及partnerLinks定义中的uiComponent,container,uiLayoutPlaceHolder等属性。然后,将被转换为UI交互描述中UI组件之间在UI引擎客户端的直接交互的对应中介流程删除。在本实施例中,即组合流程中的步骤16、步骤17、步骤18。经过这样的调整之后,组合流程中不再涉及UI组件GoMaps,则删除其对应的partnerLink定义。本实施例常规业务流程执行语言组合描述如下:

<bpel:process name=″FindIt″

targetNamespace=″www.unitn.it/bpelui/example″

suppressJoinFailure=″yes″

xmlns:tns=″www.unitn.it/bpelui/example″

xmlns:bpel=″http://docs.oasis-open.org/wsbpel/2.0/process/executable″

xmlns:ns=″http://www.unitnt.it/JS/LocalSearch″

xmlns:ns0=″http://www.unitn.it/WS/YaSearchService/″>

<bpel:import namespace=″http://www.unitn.it/WS/YaSearchService/″

location=″YaSearchService.wsdl″importType=″http://schemas.xmlsoap.org/wsdl/″></bpel:import>

<bpel:import namespace=″http://www.unitnt.it/JS/LocalSearch″location=″LocalSearch.wsdl″

importType=″http://schemas.xmlsoap.org/wsdl/″></bpel:import>

<bpel:partnerLinks>

//UI组件LocalSearch

<bpel:partnerLink name=″LocalSearch″partnerLinkType=″ns:LocalSearch″myRole=″Receive″

partnerRole=″Invoke″></bpel:partnerLink>

//web服务YaSearch

<bpel:partnerLink name=″YaSearch″partnerLinkType=″ns0:YaSearch″partnerRole=″Service″

></bpel:partnerLink>

</bpel:partnerLinks>

<bpel:variables>

<bpel:variable name=″LocalSearch″messageType=″ns:SearchMessage″></bpel:variable>

<bpel:variable name=″YaSearchResponse″messageType=″ns0:SearchResponse″></bpel:variable>

<bpel:variable name=″YaSearchRequest″messageType=″ns0:SearchRequest″></bpel:variable>

<bpel:variable name=″UpdateLocalSearch″messageType=″ns:UpdateMessage″></bpel:variable>

</bpel:variables>

<bpel:sequence>

//步骤11

<bpel:receive name=″Receive″partnerLink=″LocalSearch″operation=″Search″

variable=″LocalSearch″></bpel:receive>

//步骤12

<bpel:assign validate=″no″name=″Assign″>

<bpel:copy>

<bpel:from>

<bpel:literal xml:space=″preserve″>

<tns:SearchRequest xmlns:tns=″http://www.unitn.it/WS/YaSearchService/″

xmlns:xsi=″http://www.w3.org/2001/XMLSchema-instance″>

<Query></Query>

<Location></Location>

</tns:SearchRequest>

</bpel:literal>

</bpel:from>

<bpel:to variable=″YaSearchRequest″part=″SearchQuery″></bpel:to>

</bpel:copy>

<bpel:copy>

<bpel:from part=″SearchPart″variable=″LocalSearch″>

<bpel:query

queryLanguage=″urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0″><![CDATA[what]]></bpel:query>

</bpel:from>

<bpel:to part=″SearchQuery″variable=″YaSearchRequest″>

<bpel:query

queryLanguage=″urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0″><![CDATA[Query]]></bpel:query>

</bpel:to>

</bpel:copy>

<bpel:copy>

<bpel:from part=″SearchPart″variabl e=″LocalSearch″>

<bpel:query

queryLanguage=″urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0″><![CDATA[where]]></bpel:query>

</bpel:from>

<bpel:to part=″SearchQuery″variable=″YaSearchRequest″>

<bpel:query

queryLanguage=″urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0″><![CDATA[Location]]></bpel:query>

</bpel:to>

</bpel:copy>

</bpel:assign>

//步骤13

<bpel:invoke name=″SearchLocations″partnerLink=″YaSearch″operation=″Search″

inputVariable=″YaSearchRequest″outputVariable=″YaSearchResponse″></bpel:invoke>

//步骤14

<bpel:assign validate=″no″name=″Assign1″>

<bpel:copy>

<bpel:from>

<bpel:literal xml:space=″preserve″>

<tns:UpdateElement xmlns:tns=″http://www.unitnt.it/JS/LocalSearch″

xmlns:xsi=″http://www.w3.org/2001/XMLSchema-instance″>

<resultXML></resultXML>

<id_correlation></id_correlation>

</tns:UpdateElement>

</bpel:literal>

</bpel:from>

<bpel:to variable=″UpdateLocalSearch″part=″UpdatePart″></bpel:to>

</bpel:copy>

<bpel:copy>

<bpel:from part=″SearchResult″variable=″YaSearchResponse″>

<bpel:query

queryLanguage=″urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0″><![CDATA[resultXML]]></bpel:query

>

</bpel:from>

<bpel:to part=″UpdatePart″variable=″UpdateLocalSearch″>

<bpel:query

queryLanguage=″urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0″><![CDATA[resultXML]]></bpel:query

>

</bpel:to>

</bpel:copy>

<bpel:copy>

<bpel:from part=″SearchPart″variable=″LocalSearch″>

<bpel:query

queryLanguage=″urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0″><![CDATA[id_correlation]]></bpel:

query>

</bpel:from>

<bpel:to part=″UpdatePart″variable=″UpdateLocalSearch″>

<bpel:query

queryLanguage=″urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0″><![CDATA[id_correlation]]></bpel:

query>

</bpel:to>

</bpel:copy>

</bpel:assign>

//步骤15

<bpel:invoke name=″Update″partnerLink=″LocalSearch″operation=″Update″

portType=″ns:LocalSearchPortTypeINVOKE″inputVariable=″UpdateLocalSearch″></bpel:invoke>

</bpel:sequence>

</bpel:process>

对于每个需要与BPEL组合应用FindIt交互的UI组件,统一组合描述编译器将产生对应的UI引擎配置并部署到UI引擎服务器中的UI引擎配置库,用于配置UI引擎暴露接口、存储模块、数据发送模块,实现UI引擎客户端和组合引擎之间的通信交互。本实施例中,UI组件LocalSearch需要与FindIt交互。基于UI引擎配置,UI引擎服务器的UI引擎暴露接口将通过SOAP协议实现UI组件LocalSearch的LocalSearchPortTypeINVOKE这个端口类型(portType),用于在UI引擎服务器中为UI组件LocalSearch向组合引擎暴露调用接口,接收组合引擎发出的调用Update操作的UI调用消息,将该UI调用消息转换为update事件。本质上,LocalSearchPortTypeINVOKE这个端口类型(portType)对应所有能被UI引擎客户端调用的UI组件LocalSearch的函数,即update函数。对应的,统一组合描述编译器将在UI描述LocalSearch.WSDL中增加如下的SOAP绑定定义,用于常规业务流程执行语言组合描述对该端口类型(portType)的实现引用。

//SOAP绑定定义

<wsdl:binding name=″LocalSearchPortTypeINVOKEBindingSOAP″type=″tns:LocalSearchPortTypeINVOKE″>

<soap:binding style=″document″transport=″http://schemas.xmlsoap.org/soap/http″/>

<wsdl:operation  name=″Update″>

<wsdl:input>

<soap:body use=″literal″/>

</wsdl:input>

</wsdl:operation>

</wsdl:binding>

UI组件到组合引擎的交互流程如下步骤:

步骤21、UI组件LocalSearch向UI引擎客户端发出search事件,事件参数对应用户的搜索输入;

步骤22、依据第一监听器,UI引擎客户端将search事件转换为UI交互消息,发送到UI引擎服务器。UI交互消息中包括search事件,要调用的BPEL组合应用的名称FindIt和UI组件LocalSearch的操作名称Search;

步骤23、UI引擎服务器中的数据发送模块将该UI交互消息转换为组合引擎调用消息,发送到组合引擎,调用由BPEL组合应用FindIt实现的UI组件LocalSearch的LocalSearchPortTypeRECEIVE这个端口类型(portType)的Search操作。

组合引擎到UI组件的交互流程如下步骤:

步骤31、BPEL组合应用FindIt发出UI调用消息,调用UI引擎服务器上UI引擎暴露接口实现的UI组件LocalSearch的Update操作。该UI调用消息包括BPEL组合应用的名称为FindIt,UI组件的名称为LocalSearch,UI组件LocalSearch的操作名称为Update;

步骤32、UI引擎服务器的UI引擎暴露接口将该UI调用消息转换为事件,事件参数与UI调用消息的参数相同,事件名称为update,发送者为BPEL组合应用FindIt。该update事件被存储到存储模块;

步骤33、UI引擎客户端周期性的向UI引擎服务器查询事件更新;

步骤34、UI引擎服务器的数据发送模块从存储模块获得update事件,然后将该update事件转换为UI交互消息发送给UI引擎客户端,UI交互消息中包括update事件,事件名称update,发送者BPEL组合应用的名称FindIt;

步骤35、UI引擎客户端接收到该UI交互消息,根据该UI交互消息包括的update事件,事件名称update,发送者BPEL组合应用的名称FindIt,依据第二监听器,UI引擎客户端触发UI组件LocalSearch的Update操作,即update函数,函数的输入参数与update事件的参数相同。

UI组件到UI组件的交互流程如下步骤:

步骤41、UI组件LocalSearch向UI引擎客户端发出itemSelected事件,事件参数对应用户在搜索结果中做的选择;

步骤42、接收到UI组件LocalSearch发出的itemSelected事件,依据第三监听器l3,UI引擎客户端触发UI组件GoMap的ShowPoint操作,即showPoint函数,函数的输入参数与itemSelected事件的参数相同。

为了更清楚的理解本发明实施例所述的技术方案,下面通过将一个Web服务和两个UI组件进行组合对本发明实施例进行例举说明;与上述一个Web服务和两个UI组件进行组合的实施例的差别在于,UI组件LocalSearch和UI组件GoMap分别执行于不同的UI引擎客户端,即分布于两个Web客户端,能够实现多个用户的协同工作。因此,Web服务YaSearch的WSDL描述,UI组件LocalSearch和GoMap的UI描述,以及统一组合应用的统一组合描述的具体组合流程步骤与上述一个Web服务和两个UI组件进行组合的实施例完全相同。而因为具有两个UI引擎客户端,其统一组合应用的统一组合描述的位置指定定义,编译过程和执行过程存在差异。下面主要描述本实施例与上述一个Web服务和两个UI组件进行组合的实施例相差异的内容,没有描述的内容表示与上述一个Web服务和两个UI组件进行组合的实施例相似,可以具体参考上述一个Web服务和两个UI组件进行组合的实施例,这里只做简略介绍。另外,假定UI组件LocalSearch执行于UI引擎客户端主机(Master),而UI组件GoMap执行于UI引擎客户端从机(Slave)。

本实施例中,容器(containers)定义表示统一组合应用包括主机(Master)和从机(Slave)两个UI引擎客户端,由htmlLayoutURL属性分别指定它们的页面布局为masterLayout.html和slaveLayout.html。在partnerLinks定义中,UI组件LocalSearch通过container属性被指定到主机(Master)UI引擎客户端,uiLayoutPlaceHolder属性则指定其在该UI引擎客户端中的具体页面位置为bpel4ui_search。UI组件GoMap通过container属性被指定到从机(Slave)UI引擎客户端,uiLayoutPlaceHolder属性则指定其在该UI引擎客户端中的具体页面位置为bpel4ui_gmaps。通过将UI组件指定到不同的UI引擎客户端,能够实现将统一组合应用的用户界面进行分布化。统一组合描述的位置指定定义相关部分如下。

<bpel:process name=″FindIt″

targetNamespace=″www.unitn.it/bpelui/example″

suppressJoinFailure=″yes″

xmlns:tns=″www.unitn.it/bpelui/example″

xmlns:bpel=″http://docs.oasis-open.org/wsbpel/2.0/process/executable″

xmlns:xmlns:ns=″http://www.unitnt.it/JS/LocalSearch″

xmlns:ns0=″http://www.unitn.it/WS/YaSearchService/″xmlns:ns2=″http://www.unitn.it/UI/GoMap/″>

<containers>  //定义master和Slave两个UI引擎客户端

<container name=″Master″htmlLayoutURL=″http://www.unitn.it/BPELLayout/masterLayout.html″

UIEngine=″FindItEngine″/>

<container name=″Slave″htmlLayoutURL=″http://www.unitn.it/BPELLayout/slaveLayout.html″

UIEngine=″FindItEngine″/>

</containers>

<bpel:import namespace=″http://www.unitn.it/UI/GoMap/″location=″GoMap.wsdl″

importType=″http://schemas.xmlsoap.org/wsdl/″></bpel:import>

<bpel:import namespace=″http://www.unitn.it/WS/YaSearchService/″

location=″YaSearchService.wsdl″importType=″http://schemas.xmlsoap.org/wsdl/″></bpel:import>

<bpel:import namespace=″http://www.unitnt.it/JS/LocalSearch″location=″LocalSearch.wsdl″

importType=″http://schemas.xmlsoap.org/wsdl/″></bpel:import>

<bpel:partnerLinks>

//UI组件LocalSearch

<bpel:partnerLink name=″LocalSearch″partnerLinkType=″ns:LocalSearch″myRole=″Receive″

partnerRole=″Invoke″uiComponent=″yes″container=″Master″

uiLayoutPlaceHolder=″bpel4ui_search″></bpel:partnerLink>

//web服务YaSearch

<bpel:partnerLink name=″YaSearch″uicomponent=″no″partnerLinkType=″ns0:YaSearch″

partnerRole=″Service″></bpel:partnerLink>

//UI组件GoMaps

<bpel:partnerLink name=″GoMaps″partnerLinkType=″ns2:GMaps″partnerRole=″Invoke″

uiComponent=″yes″container=″Slave″uiLayoutPlaceHolder=″bpel4ui_gmaps″>

<property name=″Latitude″type=″xsd:double″>46.0667</property>

<property name=″Longitude″type=″xsd:double″>11.1333</property>

<property name=″Zoom level″type=″xsd:int″>13</property>

</bpel:partnerLink>

</bpel:partnerLinks>

......

</bpel:process>

统一组合描述的具体组合流程步骤部分与上述一个Web服务和两个UI组件进行组合的实施例相同,在此不再赘述,在代码中用省略号表示。

因为UI组件LocalSearch和GoMap分别执行于UI引擎客户端主机(Master)和从机(Slave),统一组合描述编译器将分别为这两个UI引擎客户端编译生成第一UI交互描述和第二UI交互描述。

首先分析参与交互的组件,如UI交互描述的组件定义所示,本实施例中,第一UI交互描述将包括UI组件LocalSearch和BPEL组合应用FindIt,指定UI组件LocalSearch位于UI引擎客户端主机(Master)的页面的bpel4ui_search布局单元。第二UI交互描述将包括UI组件GoMap和BPEL组合应用FindIt,UI组件GoMap位于UI引擎客户端从机(Slave)的页面的bpel4ui_gmaps布局单元。两个UI组件分别在各自的UI引擎客户端与组合引擎交互。

然后分析UI组件的交互关系,与上述一个Web服务和两个UI组件进行组合的实施例不同,UI组件LocalSearch和GoMap不会在同一UI引擎客户端直接进行交互。如UI交互描述的监听器定义所示,本实施例第一UI交互描述包括三个监听器:第一监听器(l1)、第二监听器(l2)、第三监听器(l3)。

第一监听器:与上述一个Web服务和两个UI组件进行组合的实施例相同,在此不再赘述;

第二监听器:与上述一个Web服务和两个UI组件进行组合的实施例相同,在此不再赘述;

第三监听器:组合流程中上述步骤16实际上表示UI组件LocalSearch将发出itemSelected事件,UI引擎客户端将该事件传递到UI引擎服务器,由UI引擎服务器转换为组合引擎调用消息发送到执行于组合引擎的BPEL组合应用FindIt,调用由FindIt实现的LocalSearchPortTypeRECEIVE这个portType的ItemSelected操作。则对应的有第三监听器,将UI组件LocalSearch的itemSelected事件与BPEL组合应用FindIt的ItemSelected操作进行关联;

<?xml version=″1.0″encoding=″utf-8″?>

<uicl versinn=″0.1″>

<components>

<component id=″FindIt″process=″FindIt.bpel″/>  //BPEL组合应用FindIt

<component id=″LocalSearch″uiLayoutPlaceHolder=″bpel4ui_search″/>  //UI组件LocalSearch

</components>

//第一监听器将UI组件LocalSearch的search事件与BPEL组合应用FindIt的Search操作进行关联

<listener id=″l1″>

<event id=″e1″component=″LocalSearch″name=″search″/>

<operation id=″o1″component=″FindIt″name=″Search″>

<input name=″where″src_id=″e1″src_name=″where″/>

<input name=″what″src_id=″e1″src_name=″what″/>

</operation>

</listener>

//第二监听器将BPEL组合应用FindIt的update事件与UI组件LocalSearch的Update操作进行关联

<listener id=″l2″>

<event id=″e2″component=″FindIt″name=″update″>

<operation id=″o2″component=″LocalSearch″name=″Update″>

<input name=″resultxML″src_id=″e2″src_name=″resultxML″/>

</operation>

</listener>

//第三监听器将将UI组件LocalSearch的itemSelected事件与BPEL组合应用FindIt的ItemSelected操作进行关联

<listener id=″l3″>

<event id=″e3″component=″LocalSearch″name=″itemSelected″/>

<operation id=″o3″component=″FindIt″name=″ItemSelected″>

<input name=″latitude″src_id=″e3″src_name=″latitude″/>

<input name=″longitude″src_id=″e3″src_name=″longitude″/>

</operation>

</listener>

</uicl>

本实施例中的第二UI交互描述包括一个监听器:第四监听器(la);该第四监听器:组合流程中上述步骤18实际上表示BPEL组合应用FindIt将发出UI调用消息,调用UI引擎服务器上的UI引擎暴露接口实现的UI组件GoMaps的ShowPoint操作。UI引擎服务器将该UI调用消息转换为showPoint事件传递到UI引擎客户端,触发UI组件GoMaps的ShowPoint操作,即showPoint函数。则对应的有第四监听器,将BPEL组合应用FindIt的showPoint事件与UI组件GoMaps的ShowPoint操作进行关联;

<?xml version=″1.0″encoding=″utf-8″?>

<uicl version=″0.1″>

<components>

<component id=″FindIt″process=″FindIt.bpel″/>  //BPEL组合应用FindIt

<component id=″GoMaps″uiLayoutPlaceHolder=″bpel4ui_gmaps″>  //UI组件GoMaps

<property name=″Latitude″type=″xsd:double″>46.0667</input>

<property name=″Longitude″type=″xsd:double″>11.1333</input>

<property name=″Zoom level″type=″xsd:int″>13</input>

</component>

</components>

//第四监听器将BPEL组合应用FindIt的showPoint事件与UI组件GoMaps的ShowPoint操作进行关联

<listener id=″la″>

<event id=″e3″component=″FindIt″name=″showPoint″/>

<operation id=″o3″component=″GoMaps″name=″ShowPoint″>

<input name=″latitude″src_id=″e3″src_name=″latitude″/>

<input name=″longitude″src_id=″e3″src_name=″longitude″/>

</operation>

</listener>

</uicl>

不同于上述一个Web服务和两个UI组件进行组合的实施例,本实施例中,UI组件LocalSearch和GoMap不会在同一UI引擎客户端直接进行交互,因此本实施例中上述中介流程即步骤16、步骤17、步骤18不能被分解删除,而组合流程中仍然包括UI组件GoMaps。本实施例常规业务流程执行语言组合描述如下:

<bpel:process name=″FindIt″

targetNamespace=″www.unitn.it/bpelui/example″

suppressJoinFailure=″yes″

xmlns:tns=″www.unitn.it/bpelui/example″

xmlns:bpel=″http://docs.oasis-open.org/wsbpel/2.0/process/executable″

xmlns:xmlns:ns=″http://www.unitnt.it/JS/LocalSearch″

xmlns:ns0=″http://www.unitn.it/WS/YaSearchService/″xmlns:ns2=″http://www.unitn.it/UI/GoMap/″>

<bpel:import namespace=″http://www.unitn.it/UI/GoMap/″location=″GoMap.wsdl″

importType=″http://schemas.xmlsoap.org/wsdl/″></bpel:import>

<bpel:import namespace=″http://www.unitn.it/WS/YaSearchService/″

location=″YaSearchService.wsdl″importType=″http://schemas.xmlsoap.org/wsdl/″></bpel:import>

<bpel:import namespace=″http://www.unitnt.it/JS/LocalSearch″location=″LocalSearch.wsdl″

importType=″http://schemas.xmlsoap.org/wsdl/″></bpel:import>

<bpel:partnerLinks>

//UI组件LocalSearch

<bpel:partnerLink name=″LocalSearch″partnerLinkType=″ns:LocalSearch″myRole=″Receive″

partnerRole=″Invoke″></bpel:partnerLink>

//web服务YaSearch

<bpel:partnerLink name=″YaSearch″partnerLinkType=″ns0:YaSearch″

partnerRole=″Service″></bpel:partnerLink>

//UI组件GoMaps

<bpel:partnerLink name=″GoMaps″partnerLinkType=″ns2:GMaps″partnerRole=″Invoke″>

<property name=″Latitude″type=″xsd:double″>46.0667</property>

<property name=″Longitude″type=″xsd:double″>11.1333</property>

<property name=″Zoom level″type=″xsd:int″>13</property>

</bpel:partnerLink>

</bpel:partnerLinks>

<bpel:variables>

<bpel:variable name=″LocalSearch″messageType=″ns:SearchMessage″></bpel:variable>

<bpel:variable name=″YaSearchResponse″messageType=″ns0:SearchResponse″></bpel:variable>

<bpel:variable name=″YaSearchRequest″messageType=″ns0:SearchRequest″></bpel:variable>

<bpel:variable name=″UpdateLocalSearch″messageType=″ns:UpdateMessage″></bpel:variable>

<bpel:variable name=″ItemSelected″messageType=″ns:ItemSelectedMessage″></bpel:variable>

<bpel:variable name=″ShowPointGMaps″messageType=″ns2:ShowPointMessage″></bpel:variable>

</bpel:variables>

<bpel:sequence>

<bpel:flow name=″Flow″>

<bpel:sequence name=″Sequence″>

//步骤11

<bpel:receive name=″Receive″partnerLink=″LocalSearch″operation=″Search″

portType=″ns:LocalSearchPortTypeRECEIVE″variable=″LocalSearch″createInstance=″yes″>

</bpel:receive>

//步骤12

<bpel:assign validate=″no″name=″InitSearchLocation″>

<bpel:copy>

<bpel:from>

<bpel:literal  xml:space=″preserve″>

<tns:SearchRequest xmlns:tns=″http://www.unitn.it/WS/YaSearchService/″

xmlns:xsi=″http://www.w3.org/2001/XMLSchema-instance″>

<Query></Query>

<Location></Location>

</tns:SearchRequest>

</bpel:literal>

</bpel:from>

<bpel:to variable=″YaSearchRequest″part=″SearchQuery″></bpel:to>

</bpel:copy>

<bpel:copy>

<bpel:from part=″SearchPart″variable=″LocalSearch″>

<bpel:query

queryLanguage=″urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0″><![CDATA[what]]></bpel:query>

</bpel:from>

<bpel:to part=″SearchQuery″variable=″YaSearchRequest″>

<bpel:query

queryLanguage=″urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0″><![CDATA[Query]]></bpel:query>

</bpel:to>

</bpel:copy>

<bpel:copy>

<bpel:from part=″SearchPart″variable=″Local Search″>

<bpel:query

queryLanguage=″urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0″><![CDATA[where]]></bpel:query>

</bpel:from>

<bpel:to part=″SearchQuery″variable=″yaSearchRequest″>

<bpel:query

queryLanguage=″urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0″><![CDATA[Location]]></bpel:query>

</bpel:to>

</bpel:copy>

</bpel:assign>

//步骤13

<bpel:invoke name=″SearchLocations″partnerLink=″YaSearch″operation=″Search″

portType=″ns0:YaSearchService″inputVariable=″YaSearchRequest″

outputVariable=″YaSearchResponse″></bpel:invoke>

//步骤14

<bpel:assign validate=″no″name=″InitUpdate″>

<bpel:copy>

<bpel:from>

<bpel:literalxml:space=″preserve″><tns:UpdateElement

xmlns:tns=″http://www.unitnt.it/JS/LocalSearch″

xmlns:xsi=″http://www.w3.org/2001/XMLSchema-instance″>

<resultXML></resultXML>

<id_correlation></id_correlation>

</tns:UpdateElement>

</bpel:literal>

</bpel:from>

<bpel:to variable=″UpdateLocalSearch″part=″UpdatePart″></bpel:to>

</bpel:copy>

<bpel:copy>

<bpel:from part=″SearchResult″variable=″YaSearchResponse″>

<bpel:query

queryLanguage=″urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0″><![CDATA[resultXML]]></bpel:query

>

</bpel:from>

<bpel:to part=″UpdatePart″variable=″UpdateLocalSearch″>

<bpel:query

queryLanguage=″urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0″><![CDATA[resultXML]]></bpel:query

>

</bpel:to>

</bpel:copy>

<bpel:copy>

<bpel:from part=″SearchPart″variable=″LocalSearch″>

<bpel:query

queryLanguage=″urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0″><![CDATA[id_correlation]]></bpel:

query>

</bpel:from>

<bpel:to part=″UpdatePart″variable=″UpdateLocalSearch″>

<bpel:query

queryLanguage=″urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0″><![CDATA[id_correlation]]></bpel:

query>

</bpel:to>

</bpel:copy>

</bpel:assign>

//步骤15

<bpel:invoke name=″Update″partnerLink=″LocalSearch″operation=″Update″

portType=″ns:LocalSearchPortTypeINVOKE″inputVariable=″UpdateLocalSearch″></bpel:invoke>

</bpel:sequence>

////步骤16

<bpel:pick name=″Selected″createInstance=″yes″><bpel:onMessage partnerLink=″LocalSearch″

operation=″ItemSelected″portType=″ns:LocalSearchPortTypeRECEIVE″variable=″ItemSelected″>

<bpel:sequence>

//步骤17

<bpel:assign validate=″no″name=″Init″>

<bpel:copy>

<bpel:from>

<bpel:literalxml:space=″preserve″><tns:ShowPointPart

xmlns:tns=″http://www.unitn.it/UI/GoMap/″xmlns:xsi=″http://www.w3.org/2001/XMLSchema-instance″>

<latitude></latitude>

<longitude></longitude>

<id_correlation></id_correlation>

</tns:ShowPointPart>

</bpel:literal>

</bpel:from>

<bpel:to variable=″ShowPointGMaps″part=″ShowPointPart″></bpel:to>

</bpel:copy>

<bpel:copy>

<bpel:from part=″ItemSelectedPart″variable=″ItemSelected″>

<bpel:query

queryLanguage=″urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0″><![CDATA[latitude]]></bpel:query>

</bpel:from>

<bpel:to part=″ShowPointPart″variable=″ShowPointGMaps″>

<bpel:query

queryLanguage=″urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0″><![CDATA[latitude]]></bpel:query>

</bpel:to>

</bpel:copy>

<bpel:copy>

<bpel:from part=″ItemSelectedPart″variable=″ItemSelected″>

<bpel:query

queryLanguage=″urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0″><![CDATA[longitude]]></bpel:query

>

</bpel:from>

<bpel:to part=″ShowPointPart″variable=″ShowPointGMaps″>

<bpel:query

queryLanguage=″urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0″><![CDATA[longitude]]></bpel:query

>

</bpel:to>

</bpel:copy>

<bpel:copy>

<bpel:from part=″ItemSelectedPart″variable=″ItemSelected″>

<bpel:query

queryLanguage=″urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0″><![CDATA[id_correlation]]></bpel:

query>

</bpel:from>

<bpel:to part=″ShowPointPart″variable=″ShowPointGMaps″>

<bpel:query

queryLanguage=″urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0″><![CDATA[id_correlation]]></bpel:

query>

</bpel:to>

</bpel:copy>

</bpel:assign>

//步骤18

<bpel:invoke name=″ShowPoint″partnerLink=″GoMaps″operation=″ShowPoint″

portType=″ns2:GoMapPortTypeINVOKE″inputVariable=″ShowpointGMaps″></bpel:invoke>

</bpel:sequence></bpel:onMessage>

</bpel:pick>

</bpel:flow>

</bpel:sequence>

</bpel:process>

本实施例中,UI组件LocalSearch和GoMap分别通过UI引擎客户端主机(Master)和从机(Slave)与BPEL组合应用FindIt交互。统一组合描述编译器将产生对应的UI引擎配置并部署到UI引擎服务器中的UI引擎配置库,用于配置UI引擎暴露接口,存储模块,数据发送模块,实现主机(Master)和组合引擎之间,以及从机(Slave)和组合引擎之间的通信交互。

基于UI引擎配置,UI引擎服务器的UI引擎暴露接口将通过SOAP协议实现UI组件LocalSearch的LocalSearchPortTypeINVOKE这个端口类型(portType),用于在UI引擎服务器中为UI组件LocalSearch向组合引擎暴露调用接口,接收组合引擎发出的调用Update操作的UI调用消息,将该UI调用消息转换为update事件。对应的,统一组合描述编译器将在UI描述LocalSearch.WSDL中增加如下的SOAP绑定定义1,用于常规业务流程执行语言组合描述对该端口类型(portType)的实现引用。

//SOAP绑定定义1

<wsdl:binding name=″LocalSearchPortTypeINVOKEBindingSOAP″type=″tns:LocalSearchPortTypeINVOKE″>

<soap:binding style=″document″transport=″http://schemas.xmlsoap.org/soap/http″/>

<wsdl:operation name=″Update″>

<wsdl:input>

<soap:body use=″literal″/>

</wsdl:input>

</wsdl:operation>

</wsdl:binding>

本实施例中,UI引擎服务器的UI引擎暴露接口还将通过SOAP协议实现UI组件GoMap的GoMapPortTypeINVOKE这个端口类型(portType),用于在UI引擎服务器中为UI组件GoMap向组合引擎暴露调用接口,接收组合引擎发出的调用ShowPoint操作的UI调用消息,将该UI调用消息转换为showPoint事件。对应的,统一组合描述编译器将在UI描述GoMap.WSDL中增加如下的SOAP绑定定义2,用于常规业务流程执行语言组合描述对该端口类型(portType)的实现引用。

//SOAP绑定定义2

<wsdl:binding name=″GoMapPortTypeINVOKEBindingSOAP″type=″tns:GoMapPortTypeINVOKE″>

<soap:binding style=″document″transport=″http://schemas.xmlsoap.org/soap/http″/>

<wsdl:operation name=″ShowPoint″>

<wsdl:input>

<soap:body use=″literal″/>

</wsdl:input>

</wsdl:operation>

</wsdl:binding>

UI组件LocalSearch到组合引擎的交互流程如下步骤:

步骤51、UI组件LocalSearch向UI引擎客户端主机(Master)发出search或itemSelected事件;

步骤52、依据第一监听器或第三监听器,主机(Master)将search或itemSelected事件转换为UI交互消息,发送到UI引擎服务器。UI交互消息中包括search或itemSelected事件,要调用的BPEL组合应用的名称FindIt和UI组件LocalSearch的操作名称Search或ItemSelected;

步骤53、UI引擎服务器中的数据发送模块将该UI交互消息转换为组合引擎调用消息,发送到组合引擎,调用由BPEL组合应用FindIt实现的UI组件LocalSearch的LocalSearchPortTypeRECEIVE这个端口类型(portType)的Search或ItemSelected操作。

组合引擎到UI组件LocalSearch的交互流程与上述一个Web服务和两个UI组件进行组合的实施例中“组合引擎到UI组件的交互流程”相同,在此不再赘述。

组合引擎到UI组件GoMap的交互流程如下步骤:

步骤61、BPEL组合应用FindIt发出UI调用消息,调用UI引擎服务器上UI引擎暴露接口实现的UI组件GoMap的ShowPoint操作。该UI调用消息包括BPEL组合应用的名称FindIt,UI组件的名称GoMap,UI组件GoMap的操作名称ShowPoint;

步骤62、UI引擎服务器的UI引擎暴露接口将该UI调用消息转换为事件,事件参数与UI调用消息的参数相同,事件名称为showPoint,发送者为BPEL组合应用FindIt。该showPoint事件被存储到存储模块;

步骤63、UI引擎客户端从机(Slave)周期性的向UI引擎服务器查询事件更新;

步骤64、UI引擎服务器的数据发送模块从存储模块获得showPoint事件,然后将该showPoint事件转换为UI交互消息发送给从机(Slave),UI交互消息中包括showPoint事件,事件名称showPoint,发送者BPEL组合应用的名称FindIt;

步骤65、UI引擎客户端从机(Slave)接收到该UI交互消息,根据该UI交互消息包括的showPoint事件,事件名称showPoint,发送者BPEL组合应用的名称FindIt,依据第四监听器,从机(Slave)触发UI组件GoMap的ShowPoint操作,即showPoint函数,函数的输入参数与showPoint事件的参数相同。

图6为本发明服务组合实现系统实施例的结构示意图,如图6所示,本实施例包括:UI引擎客户端601、UI引擎服务器602、组合引擎603;

UI引擎客户端601,用于根据UI组件产生的事件生成UI交互消息,所述UI交互消息包括与所述事件相对应的待调用的组合应用的名称以及所述UI组件的操作名称;

UI引擎服务器602,用于获取所述UI交互消息,根据与所述事件相对应的待调用的组合应用的名称以及所述UI组件的操作名称生成组合引擎调用消息,所述组合引擎调用消息包括所述组合应用的名称以及所述UI组件的操作名称;

组合引擎603,用于获取所述组合引擎调用消息,根据所述组合引擎调用消息包括的所述组合应用的名称以及所述UI组件的操作名称,调用所述组合应用实现的所述UI组件的操作。

本发明实施例提供的服务组合实现系统,通过UI引擎客户端601根据UI组件产生的事件生成UI交互消息,UI引擎服务器602根据该UI交互消息生成组合引擎调用消息,由于组合引擎调用消息包括组合应用的名称以及该UI组件的操作名称,从而使得组合引擎603能够根据组合应用的名称以及该UI组件的操作名称调用该组合应用实现的该UI组件的操作,实现了组合应用与UI组件的交互。UI组件为带有用户界面的Web应用,在Web应用开发时,由于通过组合引擎实现了对带有用户界面的Web应用的组合处理,无需再单独开发用户界面部分,从而提高了Web应用开发的效率。

进一步地,在上述图6所示实施例的基础上,还包括:所述组合引擎上执行的组合应用,还用于向UI引擎服务器发出UI调用消息,以调用所述UI引擎服务器实现的UI组件的操作;

所述UI引擎服务器,还用于获取所述UI调用消息,将所述UI调用消息转换为UI交互消息;

所述UI引擎客户端,还用于获取所述UI交互消息,根据所述UI交互消息触发所述UI组件的操作,实现调用所述UI组件对应的函数。

图7为本发明统一组合描述编译器实施例的结构示意图,如图7所示,本实施例包括:统一处理模块71、第一部署模块72、第二部署模块73、第三部署模块74;

统一处理模块71,用于基于Web服务的WSDL描述和UI组件的UI描述,对统一组合描述进行编译,生成UI交互描述、生成常规业务流程执行语言组合描述和生成UI引擎配置;

第一部署模块72,用于将生成的UI交互描述部署到UI引擎客户端,使所述UI引擎客户端基于所述UI交互描述进行执行;

第二部署模块73,用于将生成的常规业务流程执行语言组合描述部署到组合引擎,使所述组合引擎基于所述常规业务流程执行语言组合描述进行组合应用执行;

第三部署模块74,用于将生成的UI引擎配置部署到UI引擎服务器上,使基于所述UI引擎配置对所述UI引擎服务器进行配置,实现所述UI引擎客户端与所述组合引擎之间的通信交互。

本发明实施例提供的统一组合描述编译器,基于Web服务的WSDL描述和UI组件的UI描述,通过统一处理模块71编译统一组合描述分别生成UI交互描述,常规业务流程执行语言组合描述和UI引擎配置,通过第一部署模块72将生成的UI交互描述部署到UI引擎客户端的UI交互描述库,通过第二部署模块73将生成的常规业务流程执行语言组合描述部署到组合引擎,通过第三部署模块74将生成的UI引擎配置部署到UI引擎服务器的UI引擎配置库。随后,UI引擎客户端基于该UI交互描述进行执行,组合引擎基于该常规业务流程执行语言组合描述进行组合应用执行,而UI引擎服务器则基于该UI引擎配置进行相关的配置,实现UI引擎客户端和组合引擎之间的通信交互。

图8为本发明实施例所适用系统架构的结构示意图,如图8所示,包括如下的主要功能模块和/或相关实体:Web服务81、UI组件82,统一组合描述编译器83、UI引擎客户端84、UI引擎服务器85、组合引擎86;

其中,Web服务81符合标准的Web Services规范,采用标准WSDL(Web Service Description Language)语言进行接口描述。通常采用SOAP(Simple Obiect Access Protocol)协议作为接口调用承载协议。

UI组件82为具有用户界面的Web应用,具体可以为动态脚本程序,例如:基于JavaScript语言;UI组件82能够在常规的Web客户端中被展现,例如:作为HTML网页中的一个动态组成部分;UI组件82在UI引擎客户端84的UI容器上运行;通过函数执行以改变界面内容或者接收用户输入等可以使得UI组件82内部状态发生改变;UI组件82可以根据状态变化产生事件并发送到事件总线。UI组件82也可以接收来自事件总线的事件以触发操作调用,进行相应的内部状态改变,例如:调用相关函数以显示界面内容等。本发明实施例可以通过扩展WSDL对UI组件进行描述,并为UI组件82定义调用端口类型和/或接收端口类型(portType)。调用端口类型对应所有能被UI引擎客户端84调用的UI组件82的函数,每个函数将对应为该调用端口类型的一个操作(operation),其输入(input)对应UI引擎客户端84接收到的触发该函数调用的事件,而函数的输入参数与该事件的参数相同。调用端口类型将由UI组件82提供。接收端口类型对应所有能向UI引擎客户端84发出事件的UI组件82的函数,每个函数同样对应为该接收端口类型的一个操作(operation),其输入(input)对应函数向UI引擎客户端84发出的事件,事件可以与函数同名。UI组件82发出的事件通过转换都能被发送到组合引擎86,实际上接收端口类型将由执行于组合引擎上的组合应用提供。为了基于BPEL对UI组件82进行组合,为该UI组件82定义伙伴链接类型(partnerLinkType),该伙伴链接类型包括一个对应调用端口类型的角色(role)和/或一个对应接收端口类型的角色(role)。在WSDL描述中定义脚本语言绑定以支持对UI组件82的脚本语言接口描述,在该脚本语言绑定中,定义调用端口类型和/或接收端口类型的操作与UI组件82的脚本语言函数的对应关系。对于接收端口类型,实际上是操作与脚本语言函数发出事件的对应关系。对UI组件基于扩展WSDL形式的接口描述称为UI描述。对于UI描述中的抽象描述部分,包括数据类型(data type)、消息(message)、端口类型(porttype)等定义,完全采用标准WSDL机制,只是增加相应的可扩展标记语言(Extensible Markup Language,简称:XML)结构用于将抽象的端口类型绑定到具体的脚本语言函数。

本发明扩展标准BPEL以支持对Web服务和UI组件的统一组合,最终产生的组合应用称为统一组合应用。基于扩展BPEL形式对组件(Web服务和/或UI组件)之间组合进行描述称为统一组合描述。为了组合UI组件,统一组合描述中指定被组合的组件为UI组件还是Web服务,例如以属性的形式。对于UI组件,统一组合描述还将进行位置指定定义,指定该UI组件所在的UI引擎客户端84,和在该UI引擎客户端84中的具体页面位置。通过这样的位置指定定义,能够实现用户界面的分布化,有利于多个用户的协同工作。因为UI组件已经通过WSDL扩展被描述为UI描述,其函数被映射为操作(operation),在统一组合描述中,基于其伙伴链接类型定义,以常规业务流程执行语言组合描述兼容的方式对统一组合流程进行描述。

统一组合描述编译器83的作用是对统一组合应用的统一组合描述进行解析,解析过程基于Web服务的WSDL描述,UI组件的UI描述,将统一组合描述转换生成相关的几个实体,分别在UI引擎客户端84,UI引擎服务器85和组合引擎86上执行:

对于统一组合描述中UI组件相关的组合流程,统一组合描述编译器83将其分解为UI交互描述,由UI引擎客户端84执行,用于确定UI引擎客户端84上的多个UI组件82之间的交互关系,以及UI引擎客户端84上UI组件82与UI引擎服务器85之间的交互关系。交互机制基于事件总线,即事件总线接收到前一个实体的某个事件,然后触发后一个实体的某个操作,实现UI组件对外的交互。统一组合描述编译器83将为参与统一组合应用交互的每个UI引擎客户端84分别编译生成各自独立的UI交互描述。UI交互描述首先连同相关的UI引擎配置被传递到UI引擎服务器85,再由对应的UI引擎客户端84从该UI引擎服务器85获取。

对于每个需要与组合应用交互的UI组件82,统一组合描述编译器83将产生对应的UI引擎配置并部署到UI引擎服务器85中,用于配置UI引擎暴露接口,存储模块,数据发送模块,实现UI引擎客户端84和组合引擎86之间的通信交互。

统一组合描述编译器83将统一组合描述中特定于UI交互描述的内容进行删除,产生一个常规的BPEL组合逻辑,称为常规业务流程执行语言组合描述,在组合引擎上执行。该常规业务流程执行语言组合描述表示了原统一组合描述中的Web服务,以及UI组件在UI引擎服务器85中对应的UI引擎暴露接口之间的组合交互关系。

UI引擎客户端84为能够处理事件的Web客户端,例如:执行了脚本语言插件的Web浏览器,可以实现UI组件的实例化,在HTML页面中进行界面内容展现;UI引擎客户端84提供UI容器作为运行环境以供UI组件82运行。UI引擎客户端84的UI交互描述库用于存储UI交互描述。UI引擎客户端84依据UI交互描述进行执行,实现UI组件对外的交互。UI组件的通信交互基于事件总线方式,基于UI交互描述,在事件总线中执行相关的监听器,将一个UI组件或Web服务产生的事件与另外一个UI组件或Web服务的操作进行关联。UI引擎客户端84负责触发UI组件的操作,即调用UI组件对应的函数。UI引擎客户端84通过接口模块与UI引擎服务器85进行交互。

UI引擎服务器85实现UI组件与执行于组合引擎86的组合应用之间的通信交互,通过数据发送模块发送数据到UI引擎客户端84的接口模块,以及接收来自UI引擎客户端84的数据,然后为UI组件向组合应用发送数据,最终实现消息数据的正确交换。通过存储模块缓存发送到UI组件的数据。通过UI引擎暴露接口为UI组件向组合引擎86暴露调用接口并接收调用数据。UI引擎服务器85的UI引擎配置库用于存储UI引擎配置。

组合引擎86具体可以为常规的BPEL引擎,执行由统一组合描述分解产生的常规业务流程执行语言组合描述,即执行组合应用,实现Web服务与Web服务之间的交互,以及Web服务与UI组件之间的交互。

上述本发明实施例,在进行Web应用开发时能够同时组合业务逻辑和用户界面,并且最终统一组合应用的用户界面无需手工开发,完全基于被组合的Web应用的用户界面组合而成,实现了业务逻辑和用户界面的重用,极大地提高了Web应用开发的效率;此外,通过将UI组件指定到多个不同的页面,以及在页面中的不同位置,能够实现将统一组合应用的用户界面分布到多个Web客户端,有利于多个用户的协同工作。

所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统、设备、模块和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。

本领域普通技术人员可以理解:实现上述实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。

最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号