生成屏幕组件的系统和方法

文档序号:6567846阅读:520来源:国知局
专利名称:生成屏幕组件的系统和方法
技术领域
本申请涉及基于组件的应用程序的开发和它们在网络上的可用性。
背景技术
当今使用中的终端和移动装置的数量在不断地增加,例如,智能电话,
带有无限通信功能的PDA,个人计算机,自助式电话亭,和双向寻呼机/
通信装置。运行时在这些装置上的软件应用程序增加了它们的实用性。例
如,智能电话可以包括用来检索一定城市范围内的天气的应用程序,或PDA 可以包括使得用户可以购买食品杂货的应用程序。这些软件应用程序利用 了对网络的连接性,以向用户提供及时和有用的服务。但是,由于某些装 置的资源受到限制,和向装置传送大量数据的复杂性,使得开发和维护适 用于各种类型的装置的软件应用程序仍然是一项困难和耗时的工作。
当今,配置移动通信装置以通过基于因特网的浏览器和/或本地应用 程序与Web Services (全球网服务)通信。浏览器具有可以在各种不同的 装置的跨平台基础上操作的优点,但是,具有妨碍包含在屏幕中的数据的 持久性的,从Web Services请求页面(以HTML编写的屏幕定义)的缺点。 浏览器的另一个缺点是,屏幕是在运行时表现的,这可能造成资源紧张。 本地应用程序具有是专门为移动装置类型开发的,从而能够为每个运行时 环境提供相对最佳应用程序程序的优点。但是,本地应用程序具有不是平 台独立的,从而需要为同一应用程序开发多个版本,以及尺寸相对较大, 从而占用较大的移动装置的存储资源的缺点。此外,应用程序的开发人员 需要具有诸如Java和〔++之类的编程语言的经验以构造这些硬编码本地 应用程序。需要有能够在具有它们各自的运行时环境的选定装置和终端的 应用程序的开发中提供帮助,以及能够帮助从各种不同后端数据源中选择 的应用程序开发环境。此外,无线应用程序的能力存在于对各种数据源(例 如,数据库,Web Services,等等)的通信能力,和向这些数据源往来传
送复杂数据结构的能力。但是,设计具有互动屏幕以说明数据结构的复杂 无线应用程序需要无线应用程序开发人员进行大量的开发工作。

发明内容
这里披露的系统和方法提供了一种基于组件的应用程序开发环境,以 消除或减少至少一些上述缺点。
当前的软件应用程序利用了对网络的连接性,以向用户提供及时和有 用的服务。但是,由于一些装置的受限资源,和向装置传送大量数据的复 杂性,开发和维护适用于各种装置的软件应用程序仍然是困难和费时的工 作。当前的应用程序产生环境不是基于有利于运行时在具有各种运行时环 境的客户机上的应用程序的生成的组件应用程序构架。本地应用程序是当 前应用程序的一个例子,其具有下列缺点非平台独立,从而需要开发和 后续产生同一应用程序的多个版本,以及尺寸相对较大,从而占用移动装 置较大的存储资源。
与当前应用程序生成环境相反,提供了一种用于生成配置以在装置的 图形用户界面上的显示屏幕中显现数据结构的屏幕组件的系统和方法。屏 幕组件包括在装置上执行的应用程序中,并且具有以定义数据结构的显现 的结构化定义语言表达的定义。显现的数据结构涉及与通过网络在装置与 数据源之间通信的消息相关的数据内容。该系统和方法包括分析器模块, 用于分析一组用结构化定义语言表达的预定义消息和数据定义,以识别对 应的数据结构和与该消息有关的消息细节,预定义的消息和数据定义包括 在应用程序中;屏幕模板,用于提供要在图形用户界面上显示的屏幕的代 表实例;和屏幕组件生成模块,用于将预定义的消息和数据细节应用到屏 幕模板,以产生屏幕组件;其中预定义的消息和数据定义以及屏幕组件被
随后组装在应用程序中。
因此,提供了一种系统以生成配置以将数据结构显现在装置的图形用 户界面的显示屏幕上的屏幕组件,该屏幕组件用于包括在装置上执行的应 用程序中,并且具有以用于定义数据结构的显现的结构化定义语言表达的 定义,显现的数据结构与通过网络在装置与数据源之间通信的消息关联的
数据内容有关,该系统包括分析器模块,用于分析一组预定义消息和用
结构化定义语言表达的数据定义,以识别对应的数据结构和与消息有关的 消息细节,预定义消息和数据定义用于包括在应用程序中;屏幕模板,用
于提供要在图形用户界面上显示的代表实例;和屏幕组件生成模块,用于 将预定义消息和数据细节应用到屏幕模板上以生成屏幕组件;其中预定义 消息和数据定义以及屏幕组件被随后组装到应用程序中。
还披露了一种用于产生配置以将数据结构显现在装置的图形用户界 面的显示屏幕中的屏幕组件的方法,屏幕组件用于包括在装置上执行的应 用程序中并且具有以定义数据结构的显现的结构化定义语言表达的定义, 显现的数据结构与通过网络在装置与数据源之间通信的消息相关联的数 据内容有关,该方法包括步骤分析一组预定义消息和用结构化定义语言
表达的数据定义,以识别对应的数据结构和有关消息的消息细节,预定义
消息和数据定义包括在应用程序中;访问用于提供要在图形用户界面上显 示的屏幕的代表实例的屏幕模板;和将预定义消息和数据细节应用到屏幕 模板以生成屏幕组件;其中预定义消息和数据定义以及屏幕组件被随后组 装到应用程序中。
还披露了一种用于生成配置以将数据结构显现在装置的图形用户界 面的显示屏幕中的屏幕组件的计算机程序产品,屏幕组件用于包括在装置 上执行的应用程序中并且具有以定义数据结构的显现的结构化定义语言 表达的定义,显现的数据结构与通过网络在装置与数据源之间通信的消息 相关联的数据内容有关,该计算机程序产品包括计算机可读介质;存储 在计算机可读介质上的分析器模块,用于分析一组预定义消息和用结构化 定义语言表达的数据定义,以识别对应的数据结构和有关消息的消息细 节,预定义消息和数据定义用于包括在应用程序中;屏幕模板模块计算机 可读介质,用于提供要在图形用户界面上显示的屏幕的代表实例;和耦合 于模板模块的屏幕组件生成模块,用于将预定义消息和数据细节应用到屏 幕模板以生成屏幕组件;其中预定义消息和数据定义以及屏幕组件被随后 组装到应用程序中。


通过参考附图阅读以下本发明的详细说明,可以对这些和其他特征有
更清楚的了解,其中
图l是通信网络系统的方框图2是用于开发和生成图1的应用程序的工具的方框图3是图1的组件应用程序包的方框图4是说明图3的应用程序的示例组件的方框图5示出了图3的样本组件应用程序的示例屏幕和工作流;
图6是图2的工具架构的方框图7示出了图6的工具的编辑器;
图8示出了图6的工具的阅读器;
图9示出了利用图6的工具的应用程序确认方法;
图10示出了利用图6的工具的应用程序生成方法;
图11示出了利用图10的应用程序建立可展开应用程序的方法;
图12示出了展开图11的应用程序的方法;
图13示出了图6的工具的向导;
图14示出了图13的向导图案的示例操作;
图15是图14的操作的又一个实施例;
图16是图13的图案的示例屏幕;
图17是图16的屏幕的又一个实施例;
图18是图16的屏幕的又一个实施例;和
图19a和19b是图4的应用程序的消息级映射的示例;
图20a和20b是图4的应用程序的字段级映射的示例;
图21a和21b是图4的应用程序的复杂映射的示例;
图22是图116的工具的又一个实施例;
图23示出了图22的屏幕组件生成器的进一步的细节;
图24a, b, c示出了图4的应用程序的预定义组件的示例细节;
图25示出了图23的屏幕组件生成器生成的屏幕的示例工作流;
图26a, b, c, d, e示出了图23的屏幕组件生成器生成的屏幕组件
的示例屏幕;
图27是图23的生成器的示例操作;和
图28示出了图23中给出的屏幕创建的处理过程的进一步的细节。
具体实施方式
网络系统
参考图1,网络系统10包括用于经过耦合到应用网关AG与一个或更 多后端数据源106 (例如,诸如环球网服务之类的基于模式的服务或提供 应用105使用的企业服务的数据库)互动的移动通信装置100;装置100 是诸如,但不限于,移动电话、PDA、双向寻呼机、双模通信装置之类的 装置。网络10也可以具有通过局域网119耦合的台式计算机117。为了简 便,以后将装置100和台式计算机117称为装置100。如现有技术中已知 的,应用网关AG和数据源106可以经过外部网(例如,互联网)禾口/或内 部网链接。应用网关AG处理应用105始发的请求/回答消息,以及从数据 源10发送到装置100的预约通知。应用网关AG可以发挥在装置100上的 客户运行时RE与数据源106的后端服务器之间中介消息收发的数据映射 服务器的功能。运行时环境RE是执行应用105组件的和提供应用105的 执行所需的普通服务的智能容器。网关AG可以为应用105提供异步消息 收发,和与传统后端数据源106结合和通信。如下面要进一步说明的,在 与数据源106通信时,装置100发送和接收无线组件应用技术或无线组件 应用105,以及发送/接收与应用105的操作相关的消息收发。装置100 可以在应用105提供在装置100的对应运行时环境RE上时,通过执行应 用105作为数据源106的网络客户机操作。
为了满足与应用105相关的适当消息收发,在把应用105提供到装置 100上时,应用网关AG通过各种协议(例如,但不限于,HTTP, SQL,和 组件API)与数据源106通信,以向应用105揭示有关事务逻辑(方法)。 应用105同样可以利用数据源106的事务逻辑以调用有关对象(或功能) 的方法。应当认识到,可以经过网络102和应用网关AG将有关数据源106 的应用105直接下载/上载到装置100。例如,可以将应用网关AG耦合到 供应服务器108和发现服务器110,以提供一种针对应用105的优化无线 供给的机构,包括如列在UDDI (例如)注册器112中那样从装置100发现 应用105的能力。注册器112可以是服务器110实现的发现服务的部件, 并且注册器112用于公布应用105。注册器112中的应用105信息可以包 含,例如,但不限于,展开描述符DD (包含诸如应用105的名称,版本、
和说明之类的信息),以及这个应用105在应用系统信息中心库114中的 定位。
再次参考图1,为了初始化运行时环境RE, RE接收网关AGURL和MDS 115维修手册中的网关AG公共密钥。运行时环境RE利用这种信息连接到 网关AG,以进行最初的握手(信息交换)。装置100供应或BES 113 (根 据域)将MDS 115维修手册提供到装置100。应当认识到,如果需要,网 络10中可以有一个以上的网关AG。 一旦被初始化,装置100可以经过网 关AG以通信方式直接从应用系统信息中心库114直接存取(例如,下载/ 上载)应用105,禾tV或与数据源106结合直接接入(未示出)系统信息中 心库114。
示例数据源106
例如,数据源106可以利用WSDL (Web Services说明语言)来说明, 从而作为一种一般称为环球网服务的服务提供到网络上。例如,用XML将 WSDL写为用于说明Web Services和定位Web Services的XML文件,即, XML文件可以指定Web Services的位置和服务提供到网络(例如,互联网) 的操作(或方法)。WSDL文件利用主要元素定义环球网服务,例如,但不 限于〈portType〉是环球网服务执行的操作(可以将每个操作比为以传统 编程语言写的函数,以便使该函数能够驻留在环球网服务本身上); 〈message〉是环球网服务使用的消息格式;〈types〉是环球网服务使用的数 据类型,并且一般是消息本身的一部分;和〈binding〉是环球网服务用于 在环球网服务与应用网关AG之间通信的通信协议。此外,服务元素可以 包括在WSDL文件中,以标识环球网服务本身的位置(例如URL),和根 据绑定元素(binding element)提供的通信协议管理应用网关(例如) 与环球网服务之间的逻辑网络连接。应当认识到,应用105的组件400、 402、 404、 406是由工具116考虑到数据源106的特定说明而生成的,数 据源106的特定说明包括例如,但不限于,数据格式和消息格式内容的 说明,以及装置100的用户界面的预期屏幕内容的说明。
例如,WSDL文件名可以被应用网关AG用来促成环球网服务与装置之 间的消息传递。WSDL文件也可以包含其他元素,例如,扩展元素和服务元
素,从而使得能够将几个环球网服务的定义在一个单一的WSDL文件中组
合在一起。〈portType〉元素定义环球网服务,环球网服务可以执行的操作, 和有关环球网服务操作所涉及的消息。WSDL端口说明环球网服务揭示的界 面(合法操作)。〈portType〉元素可以比作为传统编程语言中的函数库(或 模块,或类)。〈message〉元素定义操作的数据元素,以及有关与操作互动 的每个消息的名称。每个消息可以由一个或更多的部件组成。这些部件可 以比作为传统编程语言中函数调用的参数,以便使函数是环球网服务本身 的部件。〈type〉元素定义了环球网服务使用的数据类型。为了有助于提供 最大的平台中性,WSDL使用了 XML模式语法来定义数据类型。〈binding〉 元素定义了每个操作的消息格式和通信协议细节,以便使消息格式和通信 协议正好如同环球网服务所期望的。
请求-回答操作类型是最普通的操作类型,但是,WSDL定义了四种操 作类型,例如,但不限于操作可以接收消息但是不返回回答的单向
(0neiay)操作类型;操作可以接收请求并返回回答的请求-回答
(Request-response)操作类型;操作可以发送请求和等待回答的恳求-回答(Solicit-response)操作类型;和操作可以发送消息但是不等待回 答的通知(Notification)操作类型。
WSDL绑定定义了环球网服务的消息格式和协议细节。绑定元素具有两 种属性-名称属性和类型属性。名称属性(你可以使用你要的任何名称) 定义了绑定的名称,而类型属性指定了绑定的端口,在本例中是
"glossaryTerms"端口。 soap:binding元素具有两种属性-类型属性和传 送属性。类型属性可以是"rpc"或"document (文件)"。在本例中,我 们使用文件。传送属性定义了使用的SOAP协议。在本例中,我们使用HTTP。 操作元素定义端口面临的每个操作。对于每个操作必须定义对应的SOAP 动作。你也必须说明如何对输入和输出进行编码。在本例中,我们使用
"literal (文字)"。应当理解,如果希望,可以使用不是SOAP的协议。
WSDL示例
以下是一个示例WSDL文件的简化片段。 〈message name=" getTermRequest"〉
〈part name二,, term" type=,, xs:string" /> 〈/message〉
〈message name二,, getTermResponse,, >
〈part name=,, value" type二,, xs:string" /〉 〈/message〉
〈portType name=,, glossaryTerms ,,〉 〈operation name二" getTerm,, > 〈i叩ut message=,, getTermRquest,, /> 〈output message二,, getTermResponse,, /> 〈/operation〉 〈/portType>
〈binding type=" glossaryTerms" name二" bl" > 〈soap:binding stype=" document" transport=http://schemas. xmlsoap. org/soap/http/〉 〈opemtion> <soap:operation
soapAction二" http://example. com/getTerm" /> <input〉
〈soap:body use=,, literal" /> 〈/input> <output〉 〈so印body use=,, literal" /〉 </output〉 〈/operation> 〈/binding〉
在上面的示例中,portType元素定义了 "glossaryTerms"作为端口 名称,"getTerm"作为对应的操作的名称。"getTerm"操作具有叫做 "getTermRequest"的输入消息,和叫做"getTermResponse"的输出消 息。消息元素定义了每个消息的部件和相关的数据类型。与传统编程相比,
glossaryTerms可以是一个函数库,"getTerm"可以是带有作为输入参数 的"getTermRequest"和作为返回参数的"getTermResponse"的函数。
应用程序设计用户界面或工具116
参考图1,应用105可以作为由技术室开发人员工具116建立的一系 列程序包存储在系统信息中心库114中,应用105的开发人员可以使用这 些程序包。开发人员设计工具116可以是一种用于开发有线和/或无线组 件应用程序(Wired and/or Wireless Component Application) 105程序 包的RAD工具。如下面要进一步定义的,工具116可以为诸如,但不限于, 屏幕402、数据元素400、消息404、和应用程序工作流逻辑406之类的应 用105组件(见图4)的视觉对象设计提供拖放方式支持。应用105程序 包可以被表示为能够由工具116通过自动代码生成过程自动生成的元数据 (XML)。这个工具116可以供给自动生成代码,以包括工业标准脚本语言 (例如,JavaScript)或现有技术中其他已知脚本/编程语言,或是由这 些语言扩充。系统信息中心库114的应用105程序包的可用性是经过服务 器110的发现服务在注册器112中发布的。应当认识到,应用网关AG和 相关的数据源106的特定网络10配置可以使用一个以上的系统信息中心 库114和相关的注册器112。
参考图2,工具116在计算机201上操作,计算机201可以经过诸如 经过连接器218耦合到装置基础设施204的收发器200之类的网络连接接 口连接到网络10。收发器200可以用于将完成的应用程序105上载到系统 信息中心库114 (见图1),以及访问注册器11和选择的数据源106。再参 考图2,开发人员设计工具116还具有用户界面202,用户界面202通过 连接器222耦合到装置基础设施204,以便与用户(未示出)互动。用户 界面202包括一个或更多的诸如,但不限于,键盘、小键盘、轨迹轮、指 示笔、鼠标器、话筒之类的用户输入装置,并且耦合到诸如扬声器(未示 出)和屏幕显示器206之类的用户输出装置。如果显示器206是触摸屏, 那么显示器206也可以用作由装置基础设施204控制的用户输入装置。用 户界面202由工具116的用户使用,以利用一系列的编辑器600和阅读器 602 (见图6),在开发过程的工作流中使用多个向导604来帮助/驱动,协
调应用105的设计。
再参考图2,装置基础设施204能够使工具计算201操作。装置基础 设施204包括计算机处理器208和相关的存储模块210。计算机处理器208 通过执行有关的指令来操纵工具116的网络界面200、用户界面202、和 显示器206的操作,指令是由驻留在存储模块210中的操作系统和应用105 设计编辑器600、向导604、对话框605、和阅读器602提供的。此外,应 当认识到,装置基础设施204可以包括耦合到处理器208以向处理器208 提供指令和/或装载/设计也驻留在(例如)存储模块210中的应用105的 计算机可读介质212。计算机可读介质212可以包括硬件和/或软件,例如, 磁盘、磁带、诸如CD/DVDROMS之类的光学可读介质、和存储卡。在每种 情况下,计算机可读介质212可以采用小盘、软盘、盒式磁带、硬盘驱动 器、固态存储卡、或提供在存储模块210中的RAM的形式。应当注意,以 上列出的示例计算机可读介质212可以单独使用或组合使用。
再参考图2,设计工具116作为用于开发应用105的应用程序开发环 境在计算机201上操作。工具116的开发方法理念可以基于建立应用程序 视觉、数据、消息传送行为、和运行时导航模型的视觉"拖放"系统。可 以将工具116构造为对于一般化的综合设计环境(IDE)框架的一组插件 程序,例如,但不限于,Eclipse框架,或可以将工具116配置为不使用 插件程序结构的完全设计体系结构。仅仅是为了举例说明的目的,现在把 工具116描述为一种使用Eclipse框架的插件程序设计环境。
参考图2和6, Eclipse提供了一种可以扩展以提供客户编辑器、向 导、项目管理、和其他多种不同功能的基本的一般工具116环境。设计 Eclipse平台以便建立能够用于创建诸如网站、嵌入式JavaTM程序、C++ 程序、和Enterprise JavaBeans TM之类的多种应用程序的综合开发环境 (IDE)。导航器示图230显示用户(例如,开发人员)的工作区中的文件; 文本编辑器部分232显示工具116的用户正在加工以开发应用105和相关 的组件400、 402、 404、 406 (见图4)的文件;任务示图部分234显示工 具116的用户的任务列表;和概要阅读器部分236显示,例如,正在设计
/编辑的应用105的内容概要,禾n/或通过提供诸如在另一个示图中选择的
对象的性质之类的有关当前选择的对象的信息添加其他示图。应当认识 到,工具116在创建和修改结构化定义语言(例如,XML)的组件400、 402、 404的编码定义内容方面为开发人员提供帮助。此外,工具116也在创建、 修改、和确认组件400、 402、 404之间的定义内容的相互依赖关系方面提 供帮助,例如,但不限于,消息/数据和屏幕/数据关系。还应当认识到, 根据需要,开发人员(在使用编辑器600和阅读器602的过程中)使用的 向导604和对话605内容的显示器上的显现可以位于部分230、 232、 234、 236中的一个上,禾卩/或指定向导部分上(未示出)。
Eclipse平台建立在用于发现、综合、和运行时被称为插件程序(即, 编辑器600和阅读器602)的模块的机构上。当经过计算机201的UI 202 启动Eclipse平台时,在显示器206上给用户提供了由诸如编辑器600和 阅读器602之类的一组可用插件程序构成的综合开发环境(IDE)。提供到 Eclipse平台的各个插件程序操作在显示器206上指示的用户工作区中的 正规文件上。工作区由一个或更多的顶级项目构成,其中每个项目映射到 使用导航器230定位的文件系统中的对应的用户专用目录,如同存储在存 储器210—样(和/或可以在网络10上存取)。Eclipse平台UI范例基于 编辑器,视图,和透视图。从用户立场看,工作台显示器206是由视图602 和编辑器600可视地组成的。透视图表现显示器206上可见的编辑器600 和视图602的选择和排列。编辑器600允许用户打开、编辑、和存储对象。 编辑器600遵循打开-存储-关闭的寿命周期,这与基于文件系统的工具十 分相似。当激活时,选择的编辑器600可以给工作台菜单和工具条提供动 作。视图602提供有关工作台上用户正在用以工作的某些对象的信息。阅 读器602可以通过提供有关正在编辑的文献的信息帮助编辑器600。例如, 阅读器602可以具有比编辑器600更为简单的寿命周期,从而总是能够立 即存储使用阅读器602进行的修改(例如,改变性质值),和将变化立即 反映在显示器206的其他有关部件上。也应当认识到,显示器206的工作 台窗口可以具有几个分离的透视图,在任何给定时刻只有它们中的一个可 以看见。每个透视图具有自己的安排(平铺的,重叠的,或分离的)在显 示器206上显现的阅读器602和编辑器600。
组件应用105
参考图3,应用105包具有应用元素或人为产物301,例如,但不限 于XML定义300,映射302,应用资源308,和用于定位支持的任选资源 束306。 XML定义300是应用数据400、消息404、屏幕402组件和工作流 406、部分原始应用105的XML编码。应当知道,XML语法仅用作可用于应 用105的编码的任何结构化定义语言的例子。应用映射302定义应用消息 传送中的内容与数据资源106的后端操作的关系。应用程序开发人员利用 工具116建立映射302,从而网关AG能够在装置100的运行时RE与数据 源106之间的应用105请求/回答消息的通信期间使用这个映射302。资源 304是用应用包装作为静态附件的一个或多个资源(图像,声音信息组, 媒体,等等)。例如,资源304可以相对于资源文件夹(未示出)定位,
使得特定资源可以包含对于主文件夹的自己的相对路径(例如 resources/icon.gif, resources/screens/clipart—l. 0/happyface. gif, 禾口 resources/soundbytes/midi/inthemood. midi)。资源束306可以包含 应用105支持的每种语言的定位信息。这些束可以定位在地点文件夹中, 例如,并且可以根据支持的语言命名(例如,locale/lang_en. properties 和locale/lang—fr. properties)。下面给出了元素301的一个例子。
应当知道,装置100的运行时环境RE是其中在装置100上执行应用 105的客户程序常驻容器。容器管理该装置100上的应用105的寿命周期 (提供,执行,删除,等等),并且负责将代表应用105的元数据(XML) 翻译成可以在装置100上有效执行的形式。如上所述,应用105的元数据 是XML定义300的可执行形式,并且是由运行时环境RE建立和管理的。 RE可以向应用105提供一组通用服务,也可以为任选JavaScript或其他 脚本语言提供支持。这些服务包括支持,例如,但不限于UI控制,数据 暂留,和异步客户服务器消息传送。应当知道,如果希望,也可以将这些 服务组合为应用105的部件。RE的暂留服务可以允许组件应用程序105 将数据存储在装置100的存储模块中。应当知道,可以将RE的暂留服务 用于协调经过映射800链接到消息组件404的数据组件400的数据实例的 修改/创建(见图19a)。
参考图4,组件应用105是可以具有以,例如,extensible Markup Language (XML)和ECMAScript的子集写的人为产品301的软件应用程序。
XML和ECMAScript是允许软件开发人员以可移动和平台独立的方式开发 组件应用105的基于标准的语言。组件应用105的方框图包括数据组件 400,显现组件402,和消息组件404,这些组件是由工作流组件406通过 与提供在装置IOO上的客户运行时环境RE (见图1)互动而协调的。结构 化定义语言(例如,XML)可以用于将组件400、 402、 404构造为一系列 元数据记录,这些元数据记录包括多个代表资源的特定属性从而使每个元 素能够具有一个或更多的值的预定义元件。每个元数据模式一般具有定义 的特征,例如,但不限于有限数量的元素、每个元素的名称、和每个元 素的意义。示例元数据模式包括,例如,但不限于Dublin Core (DC), Anglo-American Cataloging Rules (AACR2), Government Information Locator Service(GILS), Encoded Archives Dscription(EAD), IMS Global Learning Consortium (IMS),禾口 Australian Government Locator Service
(AGLS)。编码语法允许通过运行时环境RE(见图l)处理的组件400、 402、 404的元数据,并且编码方案包括,例如,以下方案XML、 HTML、 XHTML、 XSML、 RDF、机器可读目录(Machine Readable Cataloging (MARC)),和 多用途网际由卩件扩充协议(Multipurpose Internet Mail Extensions
(MIME)),但不限于这些方案。装置100的客户运行时环境RE对组件400、 402、 404的元数据说明符进行操作,以提供应用105的可执行版本。
再次参考图4,数据组件400定义组件应用105使用的数据实体。数 据组件400定义描述数据实体需要什么信息,和用怎样的格式表达信息。 例如,数据组件400可以定义信息,例如,格式为数字的、由该订单的惟 一标识符组成的订单,格式为多个字符串的一列项目,具有日期-时间格 式的订单建立时间,格式为字符串的订单状态,和发出具有根据另一个数 据组件400的定义的格式的订单的用户,但不限于。应当知道,如下面要 进一步说明的,消息组件404可以经过映射800链接到数据组件400 (见 图19a)。
再次参考图4,消息组件404定义组件应用105用于与诸如环球网服 务之类的外部系统通信所使用的消息的格式。例如, 一个消息组件404可 以描述如下的信息,例如,用于发出订单的消息,所述消息包括订单的惟 一标识符、订单的状态,和与订单相关联的附注,但不限于此。应当知道,
链接的或包含相同数据定义的数据400和消息404组件可以共享组件的数
据定义内容。
再次参考图4,显现组件402像装置100的用户界面显示的那样定义 组件应用105的外观和行为。显现组件402可以指定GUI屏幕和控制,以 及在用户利用用户界面与组件应用105互动时执行的动作。例如,显现组 件402可以定义屏幕、标签、编辑框、按钮、和菜单,以及用户在编辑框 中打字或按动按钮时采取的动作。应当知道,链接的或包含相同数据定义 的数据400和显现402组件可以共享组件的数据定义内容。
参考图1和4,应当知道,在上面说明的客户组件应用105定义集合 模型中,显现组件402可以根据装置100的客户平台和环境而改变。例如, 在一些情况下,Web Services客户不需要可见的显现。可以将组件应用 105的组件400、 402、 404、 406的应用程序定义集合在Web Services系 统信息中心库114中,作为带有一组用于各种预定义的客户运行时RE的 平台中性的显现组件402描述符的平台中性数据400、消息404、工作流 406组件描述符的包束。当发布了针对应用105的发现或开发请求消息时, 把客户类型规定为这种请求消息的一部分。为了不在针对通信装置100的 不同客户平台包装组件应用105的同时复制数据、消息、和工作流元数据, 可以将应用程序定义集合成一个与不同的显现组件402的集合链接的平台 中性组件定义束。对于那些Web Services客户,客户应用105应当包含 通过工作流组件406与数据400和消息404组件链接的选定显现组件402。
再次参考图4,组件应用105的工作流组件406定义在要执行一种动 作时发生的处理过程,这种动作是,例如上述显现组件402规定的动作, 或当消息从应用网关AG (见图l)到达时要执行的动作。显现、工作流、 和消息处理过程是由工作流组件406定义的。如上所述,用一种编程语言 (例如,面向对象的编程语言)禾n/或诸如,但不限于,ECMAScript之类 的脚本语言将工作流组件406写为一系列的指令,和可以被编译成本机代 码并通过运行时环境206执行。工作流组件406的一个例子可以是给数据 赋值,操作屏幕,或发送消息105。如同显现组件一样,可以创建多个工 作流定义,以支持不同装置IOO之间变化的能力和特征。ECMA (European Computer Manufactures Association (欧洲计算机制造商协会))Script是一种标准脚本语言,其中可以将脚本称为一个指令序列,这个指令序列 是由另一个程序翻译或执行的,而不是由计算机处理器翻译和执行。脚本
语言的一些其他例子是Perl, Rexx, VBScript, JavaScript,和Tcl/Tk。
脚本语言一般是用于操纵、定制、和自动化诸如装置ioo之类的现有系统
的设施的指令性语言。
参考图4,应用105是利用组件体系结构构造的,以便当装置100 (见 图l)接收到来自于应用网关AG的包含消息数据的回答消息时,适当的工 作流组件406能够根据适当的消息组件404定义翻译消息的数据内容。然 后,工作流组件406处理数据内容并将数据插入到对应数据组件400中, 以随后存储在装置100中。此外,如果需要,工作流组件406也把数据插 入到适当的显现组件402,以随后在装置100的显示器上显示。应用105 的组件体系结构的又一个例子是用于装置100用户输入的数据,例如,按 动按钮或选择菜单项。有关的工作流组件406根据适当的显现组件404翻 译输入数据,并建立由适当数据组件400定义的数据实体。然后,工作流 组件406用用户提供的输入数据填充数据组件400,以随后在装置100中 存储。此外,工作流组件406也把输入数据插入到适当的消息组件404中, 以随后将输入数据作为数据实体发送到数据源106,例如,消息组件404 定义的Web Services。
参考图4,以下的例子示出了如何可以使用诸如,但不限于,XML之 类的结构化定义语言,和诸如,但不限于,ECMAScript之类的平台中性的 脚本/编程语言,来表达Web Services客户应用105,其中定义的组件符 合下面的文件类型定义(DTD)的定义
<!ELEMENT wcApp(desc , iconUrl , res*, wcData*, wcMsg氺,style*, wcScr氺,wcFlow)〉 〈!ATTLIST wcApp
name CDATA#REQUIRED
title CDATAttIMPLIED
vendor CDATA#IMPLIED
version CDATA固PLIED
transportKey CDATAttIMPLIED
installNotifURL CDATA#IMPLIED registerURL CDATA#IMPLIED

<!ELEMENT desc (#PCDATA)〉 〈!ELEMENT iconUrl(#PCDATA)> 〈!ELEMENT res (#PCDATA)〉 〈!ATTLIST res
name CDATA#REQUIRED
url CDATA妝EQUIRED
type(xml|image|sound|any)^REQUIRED
deferred (true I false) ,, false,,

示例数据组件400
〈!ELEMENT wcData(dfield+)>
〈!ATTLIST wcData
name CDATA#REQUIRED
persisted (true 1 false) " true,,

〈!ELEMENT dfield(#PCDATA)〉 〈!ATTLIST dfield
name CDATAftREQUIRED
type (String I Number I Boolean I Date I Any) ,, Any array (true I false) ,, false" cmp (true I false) " false,' cmpName CDATA證PLIED key(0|l|2),, 0"

示例消息组件404<!ELEMENT wcMs g(mf i e1d*) > 〈!ATTLIST wcMsg
name CDATA瓶EQUIRED
mapping CDATA#IMPLIED
>
《'ATTLIST wcMsg
pblock CDATA#IMPLIED
>
<!ELEMENT mfield(#PCDATA)〉 〈!ATTLIST mfield
name CDATA#REQUIRED
type (String | Number | Boolean | Date | Array | XML)醒PLIED mapping CDATA#IMPLIED
示例显现组件402
<!ELEMENT wcScr(layout , menu , refresh , event )〉 〈!ATTLIST wcScr
name CDATA服EQUIRED
title CDATAtt頂PLIED
main(true I false) ,, false"
dialog (true I false) ,, false,,
param CDATA#IMPLIED
>
〈!ELEMENT style(font )〉 〈!ATTLIST style
name CDATA服EQUIRED
bgColor CDATA#IMPLIED
>
<!ELEMENT font EMPTY〉
〈!ATTLIST font
name CDATAttREQUIRED
color CDATA#IMPLIED
size CDATAttIMPLIED
bold(true I false)" false"
italic(true I false)" false"
underline(true I false) " false"

<!ELEMENT refresh(msg+)> <!ELEMENT msg(#PCDATA)>
〈!ELEMENT layout(layout*, label*, separator*, edit*, image氺,choice* button氺,textarea氺)〉 〈!ATTLIST layout
type(grid|flow|border|vertical)^REQUIRED
param CDATAttIMPLIED
placement CDATA翻PLIED
style CDATA#IMPLIED
>
〈!ELEMENT menu(item*)〉
〈!ELEMENT item(action, condition"〉
〈!ATTLIST item
name CDATA#REQUIRED
label CDATA#REQUIRED
shortcut CDATA#IMPLIED

〈!ELEMENT action EMPTY〉 〈!ATTLIST action
screen CDATAttIMPLIED
pblock CDATA#IMPLIED
param CDATA#IMPLIED
acceptChanges (true | false) ,, false"

〈!ELEMENT condition EMPTY〉 〈!ATTLIST condition
pblock CDATA#REQUIRED
param CDATAttIMPLIED
result (true i false) ,, true"

〈!ELEMENT event EMPTY〉 〈!ATTLIST event
type (onlnit | onClick | onChange | onFocusOut) ,, onlnit
pblock CDATA#IMPLIED
screen CDATA画PLIED
param CDATAftIMPLIED

〈! ELEMENT s印arator EMPTY〉
〈!ELEMENT label(condition , event )〉
〈!ATTLIST label
name CDATAttREQUIRED
value CDATA#REQUIRED
placement CDATA固PLIED
style CDATA#IMPLIED

〈!ELEMENT edit(condition , event)〉 《'ATTLIST edit
name CDATA#REQUIRED
value CDATA#IMPLIED
mapping CDATA#IMPLIED
type (char | number | date | pwd i phone | emai 1) ,, char ,, readOnly (true I false) ,, false" placement CDATAttIMPLIED style CDATA#IMPLIED

〈! ELEMENT textarea (condition* , event7〉 〈!ATTLIST textarea
name CDATA服EQUIRED
value CDATA翻PLIED
mapping CDATA#IMPLIED
readonly(true I false)" false"
placement CDATA#IMPLIED
style CDATA#IMPLIED

〈! ELEMENT image (condition* , evenO 〈!ATTLIST image
name CDATAttREQUIRED
resName CDATA服EQUIRED
placement CDATAttIMPLIED

<! ELEMENT choice (condition* , event* , entry" > 《'ATTLIST choice
name CDATA#REQUIRED
value CDATA醒PLIED
mapping CDATAttIMPLIED
type (singleList | multilist | dropdown | checkbox | radio) ,, singled
ist"
readonly (true I false) ,, false" placement CDATAHIMPLIED style CDATA證PLIED

〈!ELEMENT entry(UPCDATA)>
《'ELEMENT button (condition1 , event" > 〈!ATTLIST button
name CDATA#REQUIRED
label CDATAttREQUIRED
image (true I false) ,, false"
placement CDATA證PLIED
style CDATAWMPLIED
示例工作流组件406 〈!ELEMENT wcFlow(pblock+)〉 <!ELEMENT pblock (弁PCDATA)> 〈!ATTLIST pblock
id CDATA#REQUIRED
param CDATAftIMPLIED

如下所示,为了处理其他组件400、 402、 404,图5中显示的示例组 件应用程序程序105是用XML和mScript表示的,包括表示为"wcData" 的数据组件400,表示为"wcMsg"的消息组件404,表示为"wcScr"的 显现组件402,和表示为"wcFlow"的工作流组件406: <!DOCTYPE wcApp SYSTEM "wcApp.dtd">
<wcApp name="WirelessPizza" title="Wireless Pizza" vendor="ARG"version="0,9">
<desc> Order pizza from your wireless device. </desc> <iconUrl>http:〃www.exam ple.com/wirelessPizzalcon. png</iconUrl> 〈wcData name="User">
<dfield name="name" type="String" key="l 7> <dfield name="passwordHash" type=" String7> <dfield name="street" type="String"/> <dfield name="city" type="String"/><dfield name="postar type="String"/> <dfield name="phone" type=" String7> </wcData>
<wcData name="OrderStatus">
<dfield name="confNumber" type="Number" key=" 1 ">
<dfield name="status" type="String"/>
<dfield name="datetime" type="Date7> </wcData>
<wcData name="Order">
<dfield name="orderld" type="Number" key=" 1 "/> <dfield name="special" type="String"/> <dfield name="user" cmp="true" cmpName="User"/> <dfield name="datetime" type="Date'7>
<dfield name="orderStatus" cmp="true" cmpName="0rderStatus7> </wcData>
<wcData name="Special">
<dfield name="desc" key="l " type="String7>
<dfield name="price" type="Number"/> </wcData>
〈wcMsg name="inAddSpecial" mapping="Special"> </wcMsg>
<wcMsg name="inRemoveSpeciar pblock="mhRemoveSpeciar> <mfield name="desc" mapping="Special.desc"/>
</wcMsg> <wcMsg name="inOrderStatus">
<mfield name="orderld" mapping-"Order.orderld"/> <mfield name="status" mapping-" Order, order Status 7>
</wcMsg>
〈wcMsg name="inUserlnfo" mapping="User"> </wcMsg>
<wcMsg name="out[theta]rder">
<mfield name="special" mapping-"Order.special7> <mfield name="user" mapping="Order.user"/> <mfield name="datetime" mapping="0rder.datetime"/>
</wcMsg>
<wcScr name="scrSpecials" title="Specials" main="tme"> <layout type="f low">
〈choice name-"slSpecials" value="Special[].desc + '-$' + Special[]. price" type="singleList"/> </layout> <menu>
<item name="login" label="Login">
<action screen="scrLogin"/>
<condition pblock="chLoggedin" result-"false'7> </item>
<item name="order" label="Order">
<action screen="scrDelivery" param="Application.authenticatedUser"/>
<condition pblock="chLoggedin"/> </item>
<item name="viewOrderStatus" label="View Orders Status"> <action screen="scrOrdersList"/> <condition pblock="chLoggedin"/> </item> </menu> </wcScr>
<wcScr name="scrLogin" dialog="true"> 〈layout type="vertical"> <layout type="flow">
<label name="lblUserName" value="L<)>ser Name:7> <edit name="edUserName'' type="char"/> </layout>
<layout type="flow">
<label name="lblPassword" value=" Password :"/> <edit name="edPassword" type="pwd"/〉
</layout〉
<button name="btnl—ogin" label="Login">
<eventtype="onClick" pblock="ahLogin' param="edUserName.value"/>
</button> </layout>
</wcScr>
<wcScr name="scrDelivery" title="Please provide delivery information' param="User">
〈layout type="vertical"> 〈layout type="flow">
<label name="lblStreet" value="Street:/>
<editname=" street" mapping="User. street'
type="char7>
</layout>
<layout type="flow">
〈label name="lblCity" value="City:/>
<edit name="city" mapping="User.city" type="char"/>
</layout>
<layout type="flow"〉
〈label name="lblPostalCode" value="Postal code:> <edit name="postalCode" mapping="User.postal'
type="char"/></layout>
〈layout type="flow">
<label name="lblPhone" value="Telephone:7>
<editname="phone" mapping="User.phone"
type="phone"/>
</layout>
〈layout type="flow">
〈label name="lblDate" value="Date of delivery: "/> <edit name="date" type="date"/〉 </layout> </layout> <menu>
<item name="send[theta]rder" label="Send Order">
<action pblock="ahSendOrder" param="User'V> </item> </menu> </wcScr>
<wcScr name="scrOrderStatus" title="Order status" param="Order[]"> <layout type="verticar param="%"> 〈layout type="flow">
<label name="lblSpecialr" value="Special: 7> 〈label name="lblSpecialMapped" value=" @Order []. special'V> </layout〉
<layout type="flow">
<label name="lblConfNumber" value="Confirmation
numbsr: 7>
<label name=" lblConfNumberMapped"
value="@Order[].orderStatus.confNumber"/> </layout>
<layout type="flow">
〈label name="lblStatus" value="Status: "/> <label name="lblStatusMapped" value="
@Order[].orderStatus.status7>
</layout>
<layout type="flow">
<label name="lblConfDate" value="Date of last status
update: 7>
〈label name="lblConfDateMapped" value=" @Order[]. order Status. datetime 7> </layout> <separator/> </layout> <m6im>
<item name="continue" label="Continue">
<action screen="scrSpecials'7> </itsm> </msnu〉 <refresh>
<msg> inOrderStatus </msg> </refresh> </wcScr>
<wcScr name="scrOrdersList" title-" Previous Orders"> <layout type="vertical">
<label name="lbllnstructions" value="Select one or more order:
7>
<choice name="ml[theta]rderl—ist" value="@Order[].datetime + '-'+ @Order[]. special" mapping="Order[]" type="multil—ist'7>
</layout> <menu>
<item name="viewOrder" label="View Order"〉
<action screen="scrOrderStatus' param="mlOrderList.selected"/> </item> </menu> </wcScr> <wcflow>
〈pblock id="chLoggedin">
return Application. authenticatedUser != null; </pblock>
〈pblock id="ahl—ogin" param="User.name">
if(User.passwordHash == Util.md5(scrLogin.edPassword)) { Application.authenticatedUser = User; scrl_ogin.back();
J else {
Dialog.displayflnvalid login!"); </pblock>
<pblock id="ahSendOrder" param="User"> Order.orderld = Util,guid(); Order邻ecial = scrSpecials.sISpecials.selected;
Order, user = User; Order.datetime = scrDelivery.date;
OrderStatus.confNumber = XJtil.guid(); OrderStatus.status = "Sent. Pending response,";
Order Status, date = Util.currentDate(); Order.orderStatus = OrderStatus;
outOrder.send(); scrOrderStatus.display(Order); </pblock>
〈pblock id="mhRemoveSpecial" param="inRemoveSpeciar> Special.desc = inRemoveSpecial.desc; Special.deleteO; </pblock> </wcF"low> </wcApp>
如前面给出的,XML元素定义了包括wcApp元素、wcData元素、wcMsg 元素、wcSrc元素、和wcFlow元素的示例组件应用105。参考图4, wcApp 元素是定义组件应用105的顶级元件。wcData元素定义了示例数据组件 400,它是由一组指定了名称和类型的字段构成的。wcMsg元素定义了示例 消息组件404,它同样地定义了一组指定了名称和类型的字段。wcSrc元 素定义了示例显现组件402。示例显现组件402是标签,图像,按钮,编
辑字段,文本区,单选列表,多选列表,下拉列表,复选框,单选按钮, 或包含一组其他显现组件402的屏幕。包括在示例组件应用105中的显现 组件402定义了注册屏幕500,特价物品屏幕502,传送信息屏幕504,定 单列表屏幕508,和定单状态屏幕506。这些屏幕将显现在装置100的用 户界面上。wcFlow元素定义了示例工作流组件406。 XML元素的pblock 属性规定了嵌套在wcFlow元素中的pblock元素。每个pblock元素包括 定义组件应用105的工作流部件的脚本。脚本仅仅是以举例说明的方式用 ECMAScript写成的。
为了定义组件应用105的行为,工作流组件406利用ECMAScript参 考和操纵数据组件400,显现组件402,和消息组件404。工作流组件406 也可以参考外部对象类型,这使得动作能够在组件应用105中定义的组件 上执行。例如, 一种wcMsg类型允许评价消息组件404定义的消息以确定
是否已经提供了强制性字段,并且发送到诸如环球网服务106之类的外部
系统。wcData类型允许确定数据组件400定义的数据实体的集合的大小, 并允许删除数据实体。wcScr类型允许将显现组件402向用户显示。同样 地,专用对话外部对象允许在装置100的用户界面上向用户显示消息。消 息组件404转播应用105的消息的输入和输出的必要数据。对应的数据组 件400协调数据在装置100的存储器中的存储,以随后通过显现组件402 在用户界面上显现。工作流组件406协调数据400、显现402、和消息404 组件之间的数据传送。工作流组件406被写为一系列前面说明过的指令, 例如,但不限于ECMAScript。
上述基于组件的应用105体系结构可以导致其中装置100的用户界面 和数据的定义被断开的组件应用105。这种断开允许在组件应用105中的 任何组件400、 402、 404、 406的修改,同时有利于非实质地改变到应用 105中的其他组件400、 402、 404、 406,从而可以有利于组件应用105的 维护,包括装置100上组件应用105的修改和更新。
数据400与消息404组件字段之间的映射
消息404组件内容和有关数据400组件内容可以包含简单和/或复杂 数据结构。复杂数据结构可以包含多级嵌套(例如,包括嵌套阵列的多维 数据结构)。典型的复杂数据结构可以包括阵列,堆栈,链接表,树,并
且也包括,例如,用于代表支持支持专用数据操纵功能的结构的数据元件 之间的物理和/或逻辑关系的"类"。链接表是一种由指针连接或"链接" 的结构的连续集合。链接表可以比保持项目列表的阵列更灵活。链接表可 以根据需要增长,而阵列可能限于最初宣告的固定元件数量。指针包含变 量的存储器地址;变量包含专用值。应当知道,阵列数据结构可以与链接 表数据结构不同,因为程序设计人员仅处理阵列位置,并且计算机隐藏全 部内存标记。另一方面,利用链接表,程序设计人员处理一些内存标记, 例如,指针。因此,链接表数据结构必然可以具有高于逻辑的物理标记 凭借指针的存储地址操纵。应当知道,可以将上述示例考虑为复杂数据结 构的示例说明。无线应用程序消息404内容可以具有带有类型枚举的字段 的复杂类型的数据字段,或在数据400内容中表示出来的简单/复杂类型
的数据字段,等等。
如上参考图4所述的,无线组件应用105可以表示为消息404、数据 400、和组件402、 406的集合,包括规定这些组件如何相互作用的信息。 应用105是利用诸如XML之类的结构化定义语言表达的。应该指出,消息 404和数据400作为组件的表达可以带有某种类似
每个组件400、 404是由一个唯一的名称标识的;和 每个组件400、 404规定一个或更多的由名称和宣告的类型组成的子 字段。
在实践中,由开发人员做出的组件400、 404的表达方式一般可以是 几乎相同的,而应用105的每个组件400、 404的行为是有区别的。因此, 通过认识到消息105 (见图1)内容经常是从一些下层的数据元素产生的, 并且根据这些组件400、 404的表达之间的类似性,那么,如下面要进一 步说明的,可以方便地将某些映射800 (见图19a)引入到消息组件404 的表达。这些映射800本质上是说明如何获得有关消息组件404的消息的 定义的,和在应用105的执行过程中消息组件404在运行时是如何运转的 消息105的表达的捷径。映射800是消息组件404定义和数据组件400定 义之间的固定关系。关于消息组件404的表达,使用映射800可以减少表 述组件404所需的元数据的数量。因此,映射800的使用可以具有减少描 述应用105所需的"代码"(例如,XML)的数量的直接效果。关于组件404 在运行时如何运转,映射800说明了如何通过消息状态解析和影响(通过 数据组件400说明的)链接数据元素。在这点上,说明映射800可以减少 开发人员提供应用105中的附加专用消息处理代码的需求。
映射分辨约定
再参考图1和19a,应用程序和对应的RE服务依赖于映射分辨约定和 具有一个唯一标识符的映射规则(见图19a)。这个映射规则规定结合于数 据组件400的任何映射将严格地每映射数据类型804映射一个关键字段 802。这个映射规则为映射800影响的数据实例的唯一标识和修改做好了 准备。映射规则规定映射800隔离出对应消息组件404的消息内容链接到 的数据组件400的一个实例。数据组件400实例通过唯一的标识符802(例
如,关键码)分辨。应当注意,这个标识符802的组成可以是这样的,但 是不限于此简单的主关键码或由一个以上的字段构成的复合关键码。在
用这个标识符802参考时,标识的是数据组件400的数据定义中的一个单 一的字段804 (例如, 一个组件名称)。映射分辨约定规定在对于每个链接 的数据组件400的映射800中仅包括一个主关键字段802。如下面要进一 步说明的,映射800的这种一对一性质为对其施加输入消息数据的数据实 例的分辨提供了唯一性。 一个特定的数据实例被表示为给每个字段名称 808的赋予数据值的选定数据组件400。消息实例806被表示为通过映射 800给包含的消息字段赋予数据值的选定消息组件404。
说明了两种类型的映射800:字段级映射911,和消息级映射801。以 下详细说明可以如何表达消息404到数据400组件映射800,并且说明存 在以唯一地确定将消息内容应用到何处的运行时分辨约定。
消息级映射801
再次参考图19a,消息级映射801是一种从消息组件404直接到命名 的数据组件400定义的映射800,从而消息806字段性质(消息实例)与 映射的数据组件的相同。消息级映射801规定消息实例806从数据组件400 的链接数据元件获得其完整说明。链接数据组件400中描述的所有字段将 出现在消息实例806中,可以看到字段名称808、类型说明810、和字段 定单。例如,在进入或外出消息实例806严格复制数据组件400的数据的 数据实例表示的信息的时侯,这种类型的消息级映射801可以是方便的。 参考图19b,示出了 Order数据组件400与submitOrder消息组件404之 间的示例消息级映射801。 orderld主关键字段802的隐含链接满足了映 射801的映射分辨约定。图19b中提供了这种关系的示例结构化定义语言 说明(例如,XML)。从XML表达可以清楚地看到,通过引入这种映射801 可以减小应用105定义(见图4)的大小,因为在链接的消息组件404中 没有重复数据组件400的自变量812的列表。
字段级映射911
字段级映射911 (见图20a, 20b)提供了从消息组件404定义的一个
特定字段914到命名数据组件400定义的命名字段808的映射800。字段 级映射911可以在需要映射800的更灵活排列的位置出现。在这种配置中, 每个字段映射911说明了消息实例916的每个选定字段914与对应于数据 组件400的数据实例的字段808之间的链接。可以有任何数量的这种字段 映射911。字段映射911可以仅涉及一个目标数据组件400 (—对一链接), 或可以通过分离的字段映射911将多个数据组件400链接到消息实例916 (一对多链接)。为了满足映射分别约定,链接到消息组件404的每个数 据组件400都包括关键字段802。
参考图20a, 一对一映射911排列将链路结合到一个单一数据组件 400。给代表数据组件400的主关键码802的字段建立一个字段映射911, 从而将消息实例916与数据组件400的数据实例链接。在组件404的选定 消息字段914与组件400的对应数据字段808之间建立另一个映射911。 图20a描述了在Part字段808的子集链接到PriceReduction消息字段914 的情况下的典型字段级映射911关系。通过建立到标识为Part的关键字 段802的partNo字段的链接911,满足了映射分辨约定。图20b中提供了 这些关系的示例XML表达,其中用粗体字显示Key字段映射911。应当认 识到,消息实例916可以具有一个以上的消息字段914,每个消息字段914 在相同的关键码802下映射到一个对应的数据字段808 (即,可以利用相 同的关键码802,将消息组件404链接到数据组件400的两个或更多的数 据字段808)。
复杂映射1001
参考图21a和21b,复杂映射1001安排是由到两个或更多的数据组件 400的字段级映射911构成的。如同图19a, b的一对一映射情况一样,为 通过字段映射911集链接的每个数据组件400提供不同的唯一主关键字段 802映射。图21b示出了 orderUpdate消息404与Order和Inventory数 据组件400之间的关系的XML表示方法。对于链接的两个数据组件400中 的每一个,安置了带有关键码802的对应主字段映射911;用于Order 400 的orderld字段关键码802,和用于Invertory 400的partNo字段关键码 802。这满足了映射分辨约定。这些主关键码字段映射911用粗体字示出。对于图19a、 b、 20a、 b、和21a、 b中所示的例子,也可以使用其他 映射800配置。如下面要进一步说明的,这些例子包括,例如,但不限于, 扩充定义(Extended Definition),消息原型法(Message Prototyping), 禾口到达事件处理(Arrival Event Processing)。
扩充定义是一种通过定义附加非映射字段914来扩充消息801或字段 映射911配置的消息组件404。在映射801、 911存在的情况下,通过增加 没有被映射到对应的数据组件400但是具有消息组件定义404内的完整本 身说明的字段914,扩充消息实例916可以扩充它的定义。可以将这些字 段914添加到具有一个或更多字段映射911的消息916中,或被映射801 到对应树间组件400的消息916中。扩充定义可以给映射的消息916的说 明提供附加的灵活性范围。消息原型法可以被定义为扩充另一个消息组件 404的规定定义的能力。这种机构具有与面向对象的继承类似的效果;父 消息916的全部的宣告的字段914都可用于扩充消息916。关于映射801, 911关系,扩充消息映射801, 911可以超越父消息916上陈述的任何映射 说明。对于消息到达事件处理,映射机构可以通过允许将附加处理代码与 消息接收相联系,而进一步增强映射机构。处理代码的主体可以通过凭借 用应用程序XML编写的消息组件404的说明标识。处理代码可以是嵌在应 用105 (例如, 一个工作流组件406)中的脚本(例如,ECMAScript),或 可以标识一个装置运行时环境RE (见图1)提供的标准本地变换。消息到 达事件处理的操作将在下面进一步地讨论。
为了创建消息实例916,到数据映射801, 911的消息定义消息实例 916要携带的内容的源和格式。消息格式可以同样地从链接的数据组件(消 息映射801)获得,或可以通过多个数据组件400关系的聚集效果(字段 级映射911)定义。最后, 一些消息字段可以带有它们自己的说明(扩充 定义)。为了生成说明了任何一种类型映射801、 911的始发消息实例916, 将所有依赖数据组件400实例提供到编辑器704和/或编辑器712(见图7) 的消息组件生成处理的输入端。此外,字段914的扩充说明的使用意味着 供给的消息实例916提供了需要的字段值。
设计者工具116体系结构
图6示出了用于设计组件应用105的整个设计者工具116结构。设计
者工具116界面(UI 202和显示器206— —见图2)实际上是图形和文本 编辑器600、阅读器602、对话框605、和向导604的用户界面模块601 集合。大部分外部互动是通过开发人员/用户利用拖放编辑和向导驱动加 工的系统在这些编辑器600的一个或多个上完成的。第二和非用户接口连 接系统界面是"后端(Backend)"的界面,工具116借此连接到和整理诸 如Web Services和SQL数据库之类的数据源106服务。如上所述,工具 116可以建立在Eclipse平台上,从而用户界面系统组件可以是,例如, 但不限于编辑器600、阅读器602、对话框(未示出)、和向导604的组 件,它们是,例如,扩充Eclipse类和利用Eclipse架构的插件程序模块 601。如图所示,工具116与后端数据源106和UDDI系统信息中心库114 以及注册器112通信。这些外部系统106、 112、 114可以不是工具116的 部件,而是为了完整性而示出的。
工具116具有主要由编辑器600和阅读器602构成的UI层606,编辑 器600和阅读器602通过工作流向导605帮助工作。层606接入到一个用 于Eclipse的被称为Standard Widget Toolkit (标准专用接口工具包)
(SWT)的扩展专用接口工具集和图形库。UI层606模块601也可以利用 一种被称为JFace的更高级的工具包,这种工具包包含诸如列表、树、和 表之类的标准阅读器类,和用于将命令添加到菜单和工具条中的动作框 架。工具116也可以利用图形编辑框架(Graphical Editing Framework
(GEF))来实现诸如工作流编辑器702和关系编辑器704 (见图7)之类 的图画编辑器。UI层606模块601可以遵循模型-视图-控制器设计图案, 其中每个模块601是视图和控制器二者。数据模型608, 610代表应用105 的持续状态,并且被实现在工具116体系结构的数据模型层612中。层606, 612的分离保持了各种不同视图中的显现专用信息,并且供给多个UI模块 601 (例如,编辑器600和阅读器602)以响应对于数据模型608, 610的 变化。用于引导应用105的开发的向导604帮助显示器202 (见图2)上 的编辑器600和阅读器602的开发人员的操作。应用程序开发图案或开发 向导948 (见图13)。如下面要结合图13进一步说明的,图案属于以下一 般类别中的一个,例如,但不限于推荐(Recommendation)图案654;
开发途径(Devel叩ment approach)图案650;确认(Validation)图案 660;消息传送(Messaging)图案658;屏幕(Screen)图案656;和脚 本(Script)图案652。
工具116数据模型608, 610可以基于Eclipse建模框架(EMF)。 EMF 是一种框架和代码生成工具。框架提供模型608, 610变化通知,持续性 支持,和一种用于EMF对象一般操纵的有效反射API。代码生成工具用于 产生模型608, 610实现,和创建适配器将模型层612与UI层606的用户 界面模块601连接。
工具116服务为UI层606提供了工具,例如,确认620、定位624、 生成622、建立626、和开发628,这将在下面进一步说明。工具116可以 利用Eclipse扩展点机构,以装载两种服务类型的附加插件程序后端连 接器616和带有相关的显现环境的装置表层管理器618。
后端连接器616定义了 Eclipse扩展点,使得工具116能够与不同后 端数据源106通信或获得有关不同后端数据源106的信息,以便获得选定 数据源106的消息格式。后端连接器616可以被用作一个界面,以连接到 或调查诸如Web Services和SQL数据库之类的后端数据源106服务。后 端连接器616有利于建立适当的应用程序消息和数据集,以允许在装置上 运行时从应用105与这些服务通信。后端连接器616可以支持对多个不同 类型的数据源106的访问,例如,但不限于通过基于通信连接器的体系 机构揭示对应的直接通信界面。在运行时,工具116读取插件程序注册器, 以将提供的后端扩展添加到后端连接器616的集合,例如,但不限于用 于Web Services的连接器。
后端连接器616可以负责,例如,但不限于连接到后端数据源106 中选定的一个(或多个)(例如,Web Services,数据库);为访问后端数 据源106的说明(例如,消息,操作,数据类型)提供界面;禾B/或为通 知服务(例如,通过网络向装置IOO (见图l)发送通知的那些通知服务) 的识别提供准备。后端连接器616可以提供到后端数据源106 (例如,环 球网服务,SQL数据库,或其他)的界面,以便访问数据源说明,并且可 以提供后端消息传送的实现专用细节与设计时数据模型608保持的一般消 息传送说明302之间的抽象级。例如,后端连接器616可以用于产生应用105的适当消息传送404和数据400组件集,和被模型确认器用作确认任 务的部件以确认开发下的应用程序中现有消息映射302关系的健全。例如, 后端连接器616可以被实现为利用API调用作为协议的界面,以访问潜在 的后端数据源106 (例如,利用Web Services的WSDL界面)。
装置表层管理器618定义Eclipse扩展点,例如,以允许工具116模 拟不同装置100 (见图1),从而能够说明(应用105的)不同目标装置100 的外貌和感觉。在运行时,工具116读取插件程序注册器,以将提供的表 层扩展或显现环境630增加到管理器618协调的装置环境630的集合,例 如,但不限于 一般BlackBerry TM (黑莓)或其他装置100的环境630。 表层管理器618由测试/预览阅读器826使用,以装载看起来适合于正在 模拟的装置100的可视元件(如数据模型608, 610的屏幕组件402定义 的),即,与规定环境630兼容的元件。不同的表层或显现环境/格式630 "可以插入"到工具116的管理器618中,意味着第三部件可以通过建立 新的唯一Skinld (—个Eclipse扩展点)实现它们自己的显现环境630, 例如,和实现一个适当的界面以建立模拟的装置100的运行时环境RE支 持的屏幕元件的实例。为了装载新的显现环境,测试/预览阅读器826首 先向管理器618请求指定环境630的实例。然后,管理器618例示这个环 境630,测试/预览阅读器826利用指定的环境6320,根据模型608, 610 的屏幕组件402构造屏幕元件。例如,利用Eclipse框架通过一个客户 Eclipse扩展点,将显现环境630 (例如,SkinPlugin (表层插件程序)) 标识到表层管理器618。
参考图6, UI层606是由编辑器600、阅读器602、向导604、和对话 框605的集合构成的。UI层606使用其中每个UI模块601是视图和控制 器二者的模型-视图-控制器(MVC)图案。UI层模块601与带有如MVC图 案所定义的某种有关控制逻辑的数据模型608, 610互动。编辑器600是 不提交模型608, 610变化直到工具116的用户选择"存储"它们的模块 601。编辑器600的一个例子是下面要进一步说明的脚本编辑器706 (见图 7)。阅读器602是在用户对阅读器602做出改变时立即将它们的改变提交 给模型608, 612的模块601。阅读器602的一个例子是导航器(项目视图) 822(见图8)。向导604是一个或更多的对话605系列逐步驱动的模块601,
其中每个对话框605经过用户界面202 (见图2)从工具116的用户收集 特定的信息。在工具116的用户选择了诸如"Finish"之类的确认按钮之 前,不利用向导604将变化施加到设计时模型608。应当认识到,在示例 插件程序设计工具116环境中,模块610可以扩展两种类型的界面-Eclipse扩展点和扩展点界面。扩展点将一个唯一的包或已经在系统中定 义的插件程序宣布为功能扩展的进入点,例如,编辑器600,向导604, 或项目。扩展点界面允许工具116定义它自己的插入界面,例如,为表层 618和后端616连接器。
再次参考图6,工具116中的模块601 (主编辑器600和阅读器602) 是数据模型608, 610的观察程序,并用于互动或测试和修改讨论中的应 用程序(例如,组件400, 402, 404, 406,见图4)的数据模型608, 610。 当数据模型608, 610改变时,通知模型608, 610,并通过更新应用105 的显现做出回答。工具116利用Eclipse建模框架(EMF),例如,将Eclipse UI框架连接到工具116数据模型608,610,从而模块601能够利用标准 Eclipse界面将信息提供到显示器,并在显示器206 (见图2)上编辑对象。 一般地讲,EMF框架实现这些标准界面,并且通过访问生成的、知道如何 存取存储在存储器210中的数据模型608, 610的适配器,使调用适合于 这些界面。设计时数据模型608是开发中的应用105的当前版本,并且通 过使用模块601的用户存取,与模型608的相关数据互动。模块601也可 以触发设计时数据模型608上的确认动作。模块601也造成一些或所有应 用105从寄存在存储器210中的设计时数据模型608生成。设计时数据模 型608 —般经过UI 202 (见图2)接受一个影响模型608的状态的命令集, 并且在回答中可以产生事件集。说明的每个模块601 (编辑器600和阅读 器602)包括这个影响模块601和数据模型608配对的命令和事件集。
参考图6和8,运行时数据模型610代表在用工具116开发下的模拟 应用105的状态,用作设计时数据模型608的内容的基础。运行时数据模 型610存储下面的主要项的值,例如,数据组件400 (见图4);全局变量; 消息组件404;资源304, 306 (见图3);屏幕组件402和风格,但不限于 此。应用程序模拟过程中,(例如)为了测试和预览,运行时数据模型610 与设计时数据模型608和测试/预览阅读器826合作。阅读器826也与表
层管理器616合作,以模拟指定装置100类型的运行时数据模型610。运 行时数据模型610也通过桥613向阅读器826、以及与对模型610进行改 变相关的UI层606的任何其他模块601发出通知。例如,在模型610的 状态改变时,可以将API调用用作相关模块601的通知程序。
参考图6和4,设计时数据模型608代表应用105开发项目的状态, 并且通过在模型608的状态改变时通知模块601以及从存储器210存储和 装载对象而与UI层606的模块601互动。模型608的主要责任是定义应 用105,包括,例如数据组件400定义;全局变量定义;消息组件404 定义;资源304, 306定义;屏幕组件402定义;脚本406;风格定义和后 端数据源106映射302描述符,但不限于此。设计时数据模型608回答每 个编辑器600,阅读器602的命令。设计时数据模型608也响应模型608 中的变化激起对模块601的事件,以及通过在数据模型608发生变化时通 知对应的模块601与其他模块601合作/通信(模块601-模块601互动), 以便连续化向和从存储器210的模型608内容取出和存储。
以下说明工具116、编辑器600、和阅读器602使用与数据模型608 互动的机构。EMF.Edit框架是Eclipse框架提供的可选框架。工具116 可以使用EMF.Edit框架和生成的代码作为(例如)Eclipse UI框架和工 具数据模型608之间的桥或耦合613。遵循Model-View-Controller图案, 编辑器600和阅读器602并不直接了解模型608,而是依赖界面提供在模 型608中显示和编辑数据所需的信息。
例如, 一 般情况下,树阅读器使用TreeContentProvider和 LabelProvider界面查询树的结构和分别获得树中每个节点的文本和图 标。表阅读器和列表阅读器以类似的方式工作,但是使用结构化的 ContentProvider和LabelProvider界面。数据模型608中的每个类是变 化通知程序,即,无论何时属性或参考改变,则发生一个事件。例如,在 EMF中,将通知观察程序称为适配器,因为它不仅观察状态变化,而且也 可以通过支持附加界面扩充它附属于的类的行为(不进行细分类)。适配 器工厂将适配器附属到模型对象。要求适配器工厂使一个对象与一个特定 类型的扩展匹配。适配器工厂负责创建适配器或返回现有适配器,模型对 象自己并不知道适配。工具116利用EMF生成一组用于数据模型608的、
叫做项提供程序的适配器。每个项提供程序是实现提供程序界面以扩充模 型对象的行为从而使得它能够被看到和编辑的适配器,并且与此同时是可 以将状态变化传递到监听视图的通知观察程序。工具116通过用一个或更 多的EMF. Edit类配置编辑器600和阅读器602,将编辑器600和阅读器 602连接到数据模型608。每个EMF. Edit类支持Eclipse UI提供程序界 面。EMF.Edit类通过授权给适配器工厂实现界面调用。然后,适配器工厂 返回知道如何访问数据模型608的生成的适配器(项提供程序)。当模型 608的状态改变时,使用同样的适配器来更新阅读器602和编辑器600。 下面的命令是可以影响U工层606的其他有关模块601的示例命令 ComponentAdded-组件(即,屏幕,数据等等)已经添加到应用105; Compo訓tRe丽ed-组件已经从应用105去除;ComponentRenamed-组件已 经重新命名;NavigationControlChanged-应用105的屏幕(例如,组件 402)上已经被添加了或去除了按钮或菜单项,或己经使它的属性改变; DataBindingChanged-在屏幕上已经添加了或去除了 (消息404,数据400 和/或显现402组件的)数据绑定的控制,或己经使它的属性改变; ScreenParameterListChanged-已经在屏幕组件402上添加了一个参数或 从屏幕组件402上去除了一个参数;FieldMappingChanged-消息级,字段 级,或原型映射已经改变;MessageContainmentChanged-包含关系已经改 变;MessageFieldChanged-已经为消息404禾口/或屏幕402组件添加、去 除了消息字段,或使它的性质改变。DataFieldChanged-己经在消息404, 数据400和/或显现402组件上添加了数据字段,从其去除了数据字段, 或使它的性质改变;NavigationChanged-工作流组件406的可能包含导航 代码的脚本已经改变;LocalizeStringChanged-文字串已经被添加、去除、 或改变;和ExitCodeChanged-Exit代码己经被添加或从工作流组件的脚 本去除。
服务层614的模型确认620为UI层606提供了工具,例如,确认设 计时数据模型。模型确认器620用于检查应用105消息的设计时数据模型 608表示是否符合消息传送操作的后端数据源106显现。模型确认器620 可以负责确认要生成的应用105的模型608表示,例如工作流组件406 的工作流健全;组件400,402,404,406的参数和字段级映射的持续性;屏 幕组件402的屏幕控制映射和屏幕刷新消息;组件400, 402, 404, 406之间 或之内的消息和/或数据复制,但不限于此。确认620的另一种功能可以 是确认后端数据源106消息传送关系的模型608表示。为了完成它的职责, 确认器与设计时数据模型620,应用程序生成器622,和后端连接器616 合作。请求模型确认器620确认模型608 (或模型608的一部分,根据需 要)是利用工具用户界面202,例如,经过将生成器622连接到确认器620 的确认模型界面(未示出),通过应用程序生成器622进行的。模型确认 器620又作为确认任务的一部分,利用包含应用105和映射文件元模型信 息的设计时数据模型608,以及支持到后端数据源106的界面的后端连接 器616。
返回到图6和9,示出了模型608确认序列900。首先,请求901确 认器620确认模型608。确认器从数据模型608获得902所有组件400、 402、 404、 406,并且又确认903每个组件400、 402、 404、 406的内容。 然后,确认器620从数据模型608获得904后端映射302,然后获得后端数 据源106的映射信息。然后,进行比较以便确认907模型608。
再返回到图6,定位服务624具有的责任是,例如支持用户可见字 符串的建立时间定位;支持附加定位设置(例如,默认时间&日期显示格 式,默认数字显示格式,显示货币格式,等等);和创建建立服务 (BuildService) 626可以在可展开应用105 (例如,应用程序jar文件) 的准备过程中使用的资源束文件306 (和资源304),但不限于此。例如, 定位服务624可以被实现为用于集合驻留在设计时数据模型608中的资源 304,306的资源模块以包括在可展开应用105中。JAR文件可以是一种包 含收集到一个单一文件中并且压縮以便有效地下载到装置100中的应用程 序的类、图像、和声音文件的文件。例如,应用程序生成器622使用定位 服务624,以产生语言专用资源束306。建立服务626实现资源束306的 准备,并用可展开应用105包装资源束306。定位服务624与工具编辑器 600和阅读器602互动,以设置或操纵应用105的语言串和定位设置。
参考图6,应用程序生成器622可以负责,例如从组件400, 402, 404 生成应用程序XML;映射302描述符的生成;最优化组件400, 402, 404描 述符的字段排序;和依赖性的生成和按照需要的脚本转换以存储在存储器
210中,但不限于此。应用程序生成器622与设计时数据模型608合作, 以获得包括应用105的开发的组件400,402,404的内容。在使用自动屏幕 组件生成器629的情况下,可以通过生成器622协调现有组件400和404, 以便生成器629在产生有关屏幕组件402中使用。应用程序生成器622利 用模型确认器620,检查(组件400,402,404,406的)应用105定义和映 射302描述信息都是正确的。然后,应用程序生成器620从保存在设计时 数据模型608中的关系,用工作流组件406的脚本的内涵和/或增添内容, 和映射302文件描述符产生XML代码。应用程序生成器622使用定位服务 624,通过,例如,资源束界面(未示出),产生语言资源束306。通过开 发人员使用工具116的UI 202 (例如,凭借诸如鼠标点击和/或键按动之 类的用户输入事件)访问的生成应用程序界面启动应用程序生成器622生 成处理过程。应当认识到,生成器622可以配置成模块的集合,例如,但 不限于生成XML301的代码模块(可以包括有关的脚本)和生成映射描 述符的映射模块。
参考图6和10,示出了包括映射302文件的生成在内的、生成应用105 的应用程序人工产物的序列1000。在步骤1001,通过确认器620执行确 认模型608。在步骤1002,生成器622通过从模型608获得1003组件400、 402、 404、 406生成应用程序语言描述符(例如,XML) 300 (可以包括相 关的脚本),在1004生成对应的XML 300。在步骤1005,生成器622通过 在1006从数据模型608获得映射,然后在1007生成后端映射描述符,而 生成后端映射302文件描述符。在步骤1008,如同前面参考图3说明的那 样,定位服务624准备资源束306 (和资源304),以添加到应用105中。 将生成的应用程序的人工产物存储在存储器210中。
再次参考图2和6,工具116可以是在一个单一台式计算机201上运 行时的实用程序。工具116提供了主要的开发人员能力,这种能力包括用 于应用105开发的开发、预览、确认、和生成功能。但是,应当认识到, 可以将建立服务626和/或安全服务632包装为分离的实体,以允许"本 地成长的(home-grown)"开发人员人工创建应用程序,从工具116的其 他应用程序开发分离,和仍然使用可展开应用105包(例如,jar)的准 备和安全方面。还应当认识到,展开服务628也可以分开包装,以允许"本
地成长的"开发人员生成和展开适当的应用程序描述符文件。因此,工具
116可以利用外部建立626和展开628服务实用程序,内部建立626和展 开628服务(如图6中所示),或熟悉本领域的人员知道的其他配置。
参考图3和6,建立服务626为建立可应用105的可展开形式提供了 界面,并且负责,例如生成证明文件和生成可展开应用105 jar文件, 但不限于此。建立服务626使用可用的应用程序XML 300 (可以包括有关 的脚本),映射描述符文件302,和上述的资源束306 (和资源304)。可以 通过工具116应用程序生成器622,或在本地成长的开发方法的情况下通 过使用外部建立服务626人工保证这些应用105元件的可用性。安全服务 632用于签署包含有关应用105的唯一信息的证明。最后,建立服务626 产生可展开应用105 jar文件单元,包括所有的人为产物和签署的证明文 件。如上所述,可以将建立服务626包装为与工具116的分离实用程序, 并且被工具116用于可展开应用程序jar文件的包装。
参考图6和ll,示出了运行时建立服务626以生成可展开应用105(例 如,应用程序jar文件)的序列1100。在步骤1101, 一旦应用程序生成 器622生成了应用程序元件/人为产物301 (见图3),开发人员启动建立 服务626作为(工具116)内部或外部的分离实用程序。在步骤1102,服 务626检索可用映射302文件描述符,和在步骤1103,服务626检索可用 应用程序XML 300 (可以包括有关的脚本)。在步骤1104,服务626检索 资源304, 306,然后生成1105证明文件。在步骤1106,签署证明文件, 然后生成1107应用程序jar文件。通过展开服务628,使可展开应用105 可用于(例如,存储在存储器210中)最终展开。
参考图6,安全服务532用于利用根据jar文件内容产生的摘要签署 证明jar,并且可以具有两个主要责任,第一和最主要的安全服务可以 用于产生能够包括在每个应用105 jar文件中的IDE (综合设计环境 (integrated design environment))丰示记。第二, 安全月艮务632可以提 供一种手段来初始化工具116的安全基础设施。建立服务626在建立时与 安全服务632互动,以产生可以是每个可展开应用105 jar文件证明部分 的IDE标记。安全服务632也可以与建立配置元件(未示出,可能在服务 632外部)互动,以允许安全服务的配置,例如签署的证书的最初建立;用于新关键码的生成,关键码请求的生成,和现有技术己知的签署证书的 安装,但不限于此。
再此参考图6,展开服务628连接到UDDI系统信息中心库114,以安 装/发布生成的应用程序描述符文件,并且可以负责生成应用105的展开 描述符。展开服务628在展开时使用可用应用105 far文件。尽管展开服 务628不安装应用105 far文件,但是服务628内省jar文件以确定支持 哪种语言(例如,以资源束306表示的)。可以将这种信息添加到描述符 文件。
参考图6和12,示出了将应用105展开到UDDI (例如)系统信息中 心库114的序列1200。在步骤1201,开发人员作为(工具116)的内部或 外部的分离实用程序启动展开服务628。在步骤1202,服务628检索可用 应用程序jar。在步骤1203,服务628生成应用105的展开描述符,并且 在步骤1203前进以通过系统信息中心库114的发现服务634发布展开描 述符。
参考图7,示出了编辑器600在Eclipse插件程序中的分布(仅作为 示例)。工具编辑器600主要属于两种类别,例如文本编辑器700实现 了基于标准行的编辑功能,和提供了在其中描绘对象的编辑空间的图形编 辑框架(GEF)编辑器701,但不限于这些类别。在工具116的情况下,如 现有技术中己知的,GEF编辑器701可以包含调色板和帆布。用户可以将 节点(实体)从调色板下降到帆布上,并且在它们之间添加连接(关系), 以便,例如,定义组件400、 402、 404、 406 (见图4)的XML编码的相互 关系。应当知道,编辑器600和阅读器602被用于创建和修改包含在组件 400、 402、 404、 406中的定义,以及下面要进一步说明的,创建和修改组 件之间的(例如,数据-数据,数据-屏幕,消息-数据,屏幕-数据,数据 -消息之间的)定义的相互依赖性。应当认识到,根据需要,阅读器602 和编辑器600可以是基于文本的和/或基于图形的模块601的任何组合。
编辑器600
为了使编辑器600与数据模块608脱离耦合,编辑器600不直接了解 数据模块608。编辑器600依赖于(Eclipse的)UI提供程序界面,以得 到描绘编辑中的对象所需的信息。可以用EMF核心对象配置编辑器600, 例如,在使用实现UI提供程序界面的Eclipse平台时,例如,用 ContentProvider (内容提供程序),LabelProvider (标签提供程序)。EMF 提供程序对象通过授权于知道如何访问数据模型608的生成适配器而改编 UI调用。
通常,编辑器600创建命令以改变模型608,从而可以通过取消API (未示出)取消改变。可以凭借手头开发任务的适当向导,帮助这些改变。 可以用保持着命令堆桟的,被称为编辑域的EMF核心对象配置编辑器600。 编辑域使用适配器工厂来发现可以创建命令的适配器。生成的适配器类 (ItemProvider (项提供程序))创建命令。编辑器600使用命令堆栈执 行命令。此外,利用Eclipse框架作为例子,EMF模型608是变化通知程 序。因为ItemProvider是通知观察程序,所以在数据模型608改变时通 知它。ItemProvider又通知提供程序。在变化通知之后,提供程序告诉编 辑器600和PropertySheet刷新。
脚本编辑器706
脚本编辑器706是用于写应用105组件的命令(例如,JavaScript) 的受限文本编辑器,应用105组件是,例如工作流组件406,但不限于 此,参见图4。开发人员与编辑器706的互动可以由脚本图案652 (见图3) 帮助或驱动,如下面要进一步说明的,脚本图案652可以包括诸如消息始 发652a,控制条件652b,和消息接收652c之类的图案652,但不限于此。 一些诸如创建函数之类的语法在它是组件应用105中的用户不可定义的情 况下受到限制。脚本编辑器706可编辑的示例命令包括,诸如SaveScirpt 之类的命令,但不限于此,SaveScript是在用户存储应用105的脚本时使 用的。如果成功的话,SaveScript可以触发NavigationChanged 、 LocalizeStringChanged、和ExitCodeChanged的数据模型608命令。脚 本编辑器706的示例输入事件可以包括,诸如,但不限于,以下事件 ComponentRemoved,通过它,如果去除的组件(400, 402, 404, 406)影 响到了对脚本和脚本使用的全局变量的输入参数,那么脚本编辑器706提 示工具116的用户修改的脚本是无效的;和ComponentRenamed,它具有
ComponentRemoved相同的效益。脚本编辑器706的示例界面通过实现 org. eclipse, ui. editors, texteditors层级的一个子类而扩展Eclipse 框架的org. eclipse, ui. editors扩展点。工具166协调(例如工作流406) 组件中脚本的创建和/或修改,以及影响应用105的其他有关组件的创建 的/修改的脚本的相互关系。
应当认识到,脚本编辑器706也可以用于编辑由屏幕组件生成器629 自动生成的脚本。
屏幕编辑器708
屏幕编辑器708负责帮助工具116的用户定义和安排与装置100上数 据的显示有关的应用105的屏幕组件402中的结构化定义语言代码(例如, XML)。开发人员与编辑器708的互动可以通过屏幕图案656 (见图13)帮 助和驱动,屏幕图案656可以包括,但不限于,以下的图案656:例如要 在下面进一步说明的,放映幻灯656a,表格656b,访问装置数据656c, 条件屏幕控制656d,和数据单表656e。可以将屏幕组件402中的包含物 的UI控制滴落到显示器(见图206)的编辑器部分232中的表格帆布(未 示出)上。也可以通过屏幕编辑器708编辑包括事件处理程序的控制性质。
屏幕编辑器708可以编辑的示例命令可以包括,但不限于,以下的命 令,例如在开发人员改变按纽控制时发送(到数据模型608)的 ButtonChange.,如果成功,这个命令触发数据模型608的 NavigationControlChange ;在开发人员改变菜单项的时侯发送的 MenuItemChang ,如果成功,这个命令触发数据模型608的 NavigationControlChanged ; 在开发人员改变脚本时发送的 ChangeScript ,如果成功,这个命令触发数据模型608的 NavigationControlChanged;在开发人员需要可以在应用105的屏幕上发 送或刷新的可用消息的列表,并且返回可用消息列表的时侯发送的 QueryMessages;在开发人员需要控制绑定到的可用数据对象的列表,并 且返回可用数据的列表的时侯发送的QueryData;在不影响导航的控制(例 如,标签,文本字段)已经被修改时发送的NonNavigationControlChang; 和在数据绑定改变时发送的DataBindingChange,如果成功,这个命令触
屏幕编辑器708的示例输入事件可以包括,但不限于,以下事件例如,
ComponentRemoved,屏幕开发人员(工具116的用户)用它来检查,看看 组件是否是相关屏幕组件402正在用于导航的消息,屏幕组件402使控制 绑定到的Data (数据)对象,或处理屏幕组件402的屏幕事件的脚本(例 如,工作流组件406 ); 具有ComponentRemoved相同效益的 ComponentRenamed; ScreenParameterListChanged通矢口屏幕组件402,从 而如果过去使用的参数已经被改变,那么屏幕组件402必须调节该参数或 提醒开发人员那些依赖性不再有效和必须改变;屏幕开发人员用来检查, 看看所述的字段是否正在被屏幕组件402使用的MessageFieldChanged; 和屏幕开发人员用来检查,看看是否有任何控制绑定到已经改变的字段并 适当地提醒开发人员的DataFieldChanged。
屏幕编辑器708的示例界面使用GEF图形编辑器和/或VE编辑器扩展 Eclipse框架的org. eclipse, ui. editors。工具116协调(例如,屏幕402) 组件中屏幕定义的创建和/或修改,以及影响应用105的其他有关组件的 创建的/修改的屏幕定义(和有关的数据定义)的相互关系。
应当知道,屏幕编辑器708也可以用于编辑由屏幕组件生成器629自 动生成的屏幕组件420。
数据编辑器710
数据编辑器710负责通过向开发人员提供编辑数据组件400字段和性 质的能力,帮助工具116的用户创建和修改数据组件400 (和可能的屏幕 402和消息404组件)中的结构化定义语言代码(例如,XML)。如下面要 进一步说明的,结合包括数据组件400方面的图案684 (见图13),可以 帮助或驱动开发人员与编辑器710的互动。通过原型研究现有的数据对象 或根据对消息组件404中消息对象的数据定义映射801, 911 (见图19a, 20a),可以从擦除创建新的数据对象。
数据编辑器710可编辑的示例命令包括,但不限于例如,在开发人 员向数据对象定义添加或从其去除字段时发送的AddRemovedFields,如果 成功,这个命令触发数据模型608的DataFieldChanged;在开发人员将数
据对象定义链接到诸如,但不限于,日历或接点数据对象之类的外部(对
于应用105)数据对象时发送的LinkToExternalData,如果成功,这个命 令触发数据模型608的DataFieldChanged。
数据编辑器710的示例输入事件可以包括,但不限于例如, ComponentRemoved,屏幕开发人员(工具116的用户)使用它通过原型研 究或保存来检査,看看己经去除的对象是否与消息有关,然后,开发人员 可以调节包含在受到影响的数据对象中的字段;和ComponentRenamed具 有ComponentRemoved相同的效益。
屏幕编辑器708的示例界面使用GEF图形编辑器扩展 org. eclipse, ui.editors。工具116协调(例如,数据400)组件中的数 据定义的创建和/或修改,以及影响应用105的其他有关组件的创建的/修 改的数据定义(和有关的屏幕/消息定义)的相互关系。
消息编辑器712
消息编辑器712负责帮助工具116的用户创建和修改应用105的消息 组件404中的结构化定义语言代码(例如,XML)。开发人员与编辑器712 的互动可以通过屏幕图案658 (见图13)帮助或驱动,如下面要进一步说 明的,屏幕图案658包括,但不限于例如,消息内容目标658a,和通知 建立器658b。消息设计器供给开发人员来建立和编辑发送到后端数据源 106 (与装置100有关的)和从后端数据源106到达的组件消息。这些消 息可以包括请求/回答对,以及预订/通知/非预订通知消息。消息定义可 以通过原型研究现有消息,或通过根据诸如WSDL和JDBC/SQL之类的数据 源106的后端服务模板化而创建。
消息编辑器712可编辑的示例命令包括,但不限于例如,在开发人 员将字段添加到消息组件404中或从其去除字段时发送的 AddR隨eFields。消息编辑器712的示例输入事件包括,但不限于例 如,ComponentRemoved,屏幕开发人员(工具116的用户)用其检查,看 看是否己经将消息定义原型化的或包含的消息去除,然后视图必须更新; ComponentRenamed 具有 ComponentRemoved 相同的效益; 禾口 FieldMappingChanged,屏幕开发人员(工具116的用户)用其检査,看
看字段映射是否促成了编辑的消息定义,然后,消息开发人员检査,看看 是否有任何消息字段被映射中的变化添加/去除/重新命名。
屏幕编辑器708的示例界面利用GEF图形编辑器扩展 org. eclipse, ui.editors。工具116协调(例如,消息404)组件中消息 定义的创建和/或修改,以及影响应用105的其他有关组件的创建的/修改 的消息的相互关系。
工作流编辑器702
工作流编辑器702负责帮助工具116的用户创建和修改应用105的工 作流组件406中的命令代码(例如,ECMA脚本)。如下面要进一步说明的, 开发人员与编辑器702的互动可以通过与应用程序工作流配置相关联的图 案648 (见图13)帮助或驱动。工作流编辑器702定义形成组件应用105 的可视部分的核心的屏幕-屏幕转变。屏幕和由于用户/脚本事件造成的屏 幕之间的转变被可视地表现出来。
工作流编辑器702可以编辑的示例命令可以包括,但不限于,以下命 令例如,在开发人员要从中选择的屏幕列表时,例如,在把新屏幕加到 工作流的时候,发送的QueryScreens;在开发人员要脚本的列表以访问屏 幕导航事件时发送的QueirSc:ript;在开发人员要在上面键入屏幕转变的 回答消息(包括通知)的列表时发送的QueryArrivingMessages;在开发 人员要把工作流中已经不存在的新屏幕、消息、或脚本添加到工作流中时 发送的AddComponent ,如果成功,这个命令触发数据模型608的 ComponentAdded ;和在开发人员把新导航添加到工作流时发送的 ChangeNavigation ,如果成功,这个命令触发数据模型608的 Nav i gat i onChange d 。
工作流编辑器702的示例输入事件可以包括,但不限于,以下事件 例如,ComponentRemoved,工作流开发人员(工具116的用户)用其检査, 看看组件是否是工作流对象(屏幕,脚本,到达消息),然后工作流通过 删除与这个对象定义的所有关系而自我更新;ComponentRenamed,工作流 开发人员(工具116的用户)用其检査,看看组件是否是工作流对象,然 后工作流用组件的新名称更新它的画面;NavigationControlChanged,工作流开发人员(工具116的用户)用其检查,看看工作流是否必须根据控 制改变更新它的导航视图,如果,例如,按钮已经被添加到工作流中的屏 幕,那么更新视图以显示该屏幕上的新导航节点的可用性;
ScreenParameterListChanged,工作流开发人员(工具116的用户)用其 检查,看看屏幕的参数列表是否已经改变和该屏幕是否在工作流中,然后 开发人员更新任何涉及该屏幕的导航的视图;NavigationChanged,工作 流开发人员(工具116的用户)用其检查,看看是否可能的导航变化已经 发生,开发人员发现和分析变化,并且对视图进行任何必要的更新;和 ExitCodeChanged,工作流开发人员(工具116的用户)用其检查,看看 是否已经添加/去除了出口点,然后更新编辑器视图以可视地反映这种情 况。屏幕编辑器708的一个示例界面利用GEF图形编辑器扩展 org. eclipse, ui. editors。
消息-数据关系编辑器704
消息编辑器704负责帮助工具116的用户创建和修改应用105的相互 关联的消息404和数据400组件中的结构化定义语言代码(例如,XML)。 如下面进一步说明的,开发人员与编辑器704的互动由与消息-数据关系 配置相关的图案648 (见图13)帮助或驱动。消息/数据关系编辑器704 创建和编辑消息组件404与数据组件400之间的关系。这些映射801, 911 在应用程序运行时影响如何将数据组件400增添到达到装置100的消息 上。例如,数据400与消息404组件之间的数据对象定义共用可以是这样 的,数据对象定义可以驻留在数据组件400中,而只有将消息组件404链 接到数据组件400中的数据对象定义的数据映射定义801, 911驻留在消息 组件404中,或相反。如下面要结合屏幕-数据关系阅读器824 (见图8) 进一步说明的,对于屏幕402和数据400组件之间的数据对象定义共用可 以使用相同的配置,从而数据对象定义驻留在组件之一中,并且数据映射 定义801, 911驻留在其他有关组件中。
编辑器704可以编辑的示例命令包括,但不限于,以下命令例如,
在用户将新数据或消息添加到关系图表中,结果也把该组件添加到正在开 发的应用105中时发送的AddComponent,如果成功,这个命令触发数据模型608的ComponentAdded;在开发人员需要一列消息映射时发送的 QueryMessages;在开发人员需要一列数据映射时发送的QueryData;在开 发人员改变消息级映射801时发送的ChangeMessageLevelMapping,如果 成功,这个命令触发数据模型608的FieldMappingChanged;在开发人员 改变字段级映射911时发送的ChangeFieldLevelMapping,如果成功,这 个命令触发数据模型608的FieldMappingChanged;在开发人员改变(添 加/去除)数据对象之间的原型关系时发送的ChangePrototype,如果成功, 这个命令触发数据模型608的FieldMappingChanged;和在开发人员改变 数据对象之间的包含关系时发送的ChangeContainment,如果成功,这个 命令触发数据模型608的MessageContainmentChanged。
编辑器704的示例输入事件可以包括,但不限于,以下事件例如, Component Removed,开发人员(工具116的用户)用其检査,看看被去除 的对象是否是一个消息或数据,关系映射器删除涉及被去除的对象的任何 关系;ComponentRenamed,开发人员(工具116的用户)用其检査,看看 重新命名的对象是否包含在任何映射关系中,用新名称更新映射对象的可 视代表;MessageFieldChanged,开发人员(工具116的用户)用其检查, 看看关心的消息是否存在在关系编辑器中,然后在消息的可视代表中反映 字段变化,如果所述字段包括在映射中,那么反映了变化,并且需要警告 开发人员映射被破坏(例如,如果字段已经被去除);和除了用Data取代 了 Messages之夕卜,DataFieldChanged具有与MessageFieldChanged相同 的意义。
编辑器704的示例界面用GEF图形编辑器扩展 org. eclipse, ui.editors。工具116协调(例如,消息/数据404/400)组 件中消息/数据定义的创建和/或修改,以及影响应用105的其他有关组件 的创建的/修改的消息/数据定义的相互关系。
定位编辑器714
定位编辑器714提供给开发人员收集(装置100的)应用105终端用 户可见的所有字符串,并且在一个地点编辑它们。编辑器714也提供给开 发人员将每个字符串的多个资源映射创建为不同语言。编辑器714可编辑
的示例命令包括,但不限于,以下命令例如,在开发人员添加、删除、
或修改定位的字符串时发送的ChangeLocalizeString。编辑器714的示例 输入事件可以包括一个事件,但不限于这个事件用于确定字符串文字何 时在脚本编辑器中改变的,或标签何时在屏幕编辑器708中改变的 LocalizedStringChanged。定位编辑器714可以通过扩展EditorPart来 扩展org. eclipse, ui. editors界面。
后端观测器编辑器716
后端观测器编辑器716向开发人员显示消息组件404和驱动组件404 的后端数据源106 (Web Services, SQL,等等,见图1)之间的关系。如 下面要进一步说明的,可以通过与装置运行时RE (见图1)与后端数据源 106之间的消息和/或数据关系配置,帮助或驱动开发人员与编辑器716 的互动。编辑器716也提供给开发人员用于将新源105添加到开发中的应 用105支持的那些数据源105的列表。除了与设计时数据模型608互动之 外,如同使用接收的命令和事件对其他模块601的说明那样,后端观测器 编辑器716与后端连接器616 (见图6)合作。后端连接器616提供给观 测器用于从已知的服务类型(例如,Web Services, SQL数据库)的注册 器请求Serviceslnterface (服务界面)。返回可以通过名称或通过迭代法 查询的这种类型的服务的列表。
编辑器716可以编辑的示例命令包括以下命令例如,在开发人员添 加新消息时发送的AddComponent,如果成功,这个命令触发数据模型608 的CompoenetAdded;和在开发人员将消息连接到选定后端数据源106时发 送的SpecifyM印ping,但不限于此。编辑器716的示例输入事件包括以下 事件例如,Component Removed,开发人员(工具116的用户)用其检查, 看看组件是否是消息,后端观测器为该消息调节它的映射; ComponentRenamed 具有与 Component Removed 相同的效益;禾口 MessageFieldChanged,开发人员(工具116的用户)用其依靠后端存在 的信息确认消息字段,并可视地通知任何破坏的映射,但不限于此。通过 对服务层直接呼叫,访问后端数据源106。作为选择,可以使用背景处理 使网络处理避免阻塞UI线程。编辑器716可以使用GEF图形编辑器来扩
展org. eclipse, ui. editors。 阅读器602
参考图6和8,阅读器602是在开发人员对它们作出改变时,立即就 把它们的改变提交给数据模型608的模块601。参考图8,(仅作为示例) 示出了阅读器602在Eclipse插件程序中的分布。工具阅读器602主要分 成两个类别,例如以下类别资源阅读器830和图形编辑框架(GEF)阅 读器828,它们提供了在其中观看对象的编辑空间,但不限于此。用户可 以观看节点(实体)和它们之间的连接(关系),以便,例如,定义组件 400, 402, 404, 406 (见图4)的XML编码的内容和相互关系。应当认识 到,如下面要进一步说明的,阅读器602被用于创建和修改包含在组件 400、 402、 404、 406中的定义,以及创建和修改组件之间的(例如,数据 -数据,数据-屏幕,消息-数据,屏幕-数据,数据-消息)定义的相互依 赖性。Eclipse阅读器是在用户作出改变时,立即就将改变提交到数据模 型608的模块601。阅读器602包括(例如)用树视图示出显示器206(见 图2)的工作区中的应用105项目的等级视图的导航器822;模拟应用105 的运行时行为的测试/预览阅读器824;和可以是绑定到对应屏幕的屏幕 402和数据400组件之间的关系的只读视图的屏幕-数据关系阅读器824。 每个阅读器602可以在org. eclipse, ui. views创建扩展点,并且可以实 现Eclipse平台的IViewPart界面,经常是通过选定的默认超类。
导航器阅读器822
导航器822给开发人员提供了显示器206的工作区中的所有项目应用 105,文件夹和文件的等级树视图(例如)。开发人员可以浏览和操纵有关 从导航器822选择的应用105项目的对象定义。
阅读器822发出的示例命令可以包括以下命令例如,在通过导航器 语境菜单上的新菜单(未示出)将新组件添加到应用105项目时发送的 AddComponent,如果成功,这个命令触发数据模型608的ComponentAdded; 在通过把组件从导航器语境菜单删除而去除组件时发送的 RemoveComponent ,如果成功,这个命令触发数据模型608的
ComponentRemoved;和在通过在导航器中选择它而给组件重新命名时发送 的RenameComponent ,如果成功,这个命令触发数据模型608的 ComponentRenamed, 但不限于]t匕。
阅读器822的示例输入事件包括以下事件例如,用于在添加了组件 时,导航器822刷新它的项目应用105的视图的Component Added,和 ComponentRemoved具有与ComponentAdded相同效益。导航器822的示例 界面是使阅读器 822 能够通过细分类 org. eclipse, ui. view, navigator. ResourceNavigator , 例如,通过 Eclipse框架,扩展org. eclipse, ui. view extension, 但不限于此。
屏幕数据关系阅读器824
屏幕/数据阅读器824提供给开发人员以观看给定屏幕定义和绑定到 它的数据定义之间的关系。界面可以是只读的,并且是从有关屏幕404和 数据400组件贡献的设计时数据构造的。作为只读阅读器824,阅读器824 没有任何影响数据模型608的命令。阅读器824的示例输入事件包括,但 不限于下面的事件例如,ComponentRemoved,开发人员(工具116的用 户)用其检查,看看去除的组件是否是屏幕402或数据400组件,开发人 员去除与去除的组件的任何关系;DataBindingChanged,开发人员(工具 116的用户)用其检查,看看组件是否是屏幕402或数据400组件,和是 否是当前在阅读器824中打开的,然后更新组件的名称;和 ComponentRenamed,开发人员(工具116的用户)用其检査,看看 DataBinding是否涉及当前打开的屏幕402和/或数据400组件,然后在显 示器206 (见图2)的视图中描述任何新的关系。阅读器824可以利用GEF 图形编辑器扩展org. eclipse, ui. editor,但是作为"只读"编辑器视图。
阅读器824可以用于观看屏幕组件生成器629的自动生成屏幕组件
402。
测试/预览阅读器826
测试/预览阅读器826模拟装置100 (在设计者的计算机201上,见图 2)外部的应用105的运行时行为。与阅读器826互动的有服务层614
的表层管理器618 (见图6),从而使得能够为模拟的装置100管理表层插 件程序的集合;给模拟的应用105的性质和状态建模的运行时数据模型 610,和为模拟的应用105提供元数据的设计时数据模型608,例如,屏幕
上存在什么可以元件和如何布置它们。
阅读器826可以用于观看屏幕组件生成器629的自动生成的屏幕组件
402。
参考图1和9,示出了开发具有带有以结构化定义语言表达的描述符 的组件400、 402、 404和表达为一系列指令的组件406的应用程序的方法 900。应当知道,各个组件400、 402、 404、 406互动,以在装置100的运 行时环境RE上处理通过网络10从数据源106接收的消息。在构造应用105 中,组件400、 402、 404的定义是通过与数据模型608互动而开发902的, 模型608用来提供应用程序的持久状态。第二组件的指令是通过与数据模 型608互动而开发904的。获得为应用105选择的数据源106的消息映射 信息906,以便根据映射信息帮助定义的生成。 一旦完成,组件400、 402、 404、 406被组装908成应用105。
自动屏幕组件生成器629
参考图22,工具116具有用于提供方法和系统的屏幕生成器629,以 便从现有组件400, 404和列举450自动生成准备运行时的无线应用105, 包括自动生成屏幕组件402和用于与有关后端数据源106的复杂类型数据 参数的操作协同操作的任意关联的脚本组件406。生成器629还协调用于 显现经过网络102从数据源106 (例如,通过应用网关AG)接收的消息的 屏幕组件402的生成。组件生成器631可以是应用程序生成器622 (见图 6)的任选部分。组件生成器631可以协调用于经过应用网关AG协调数据 源106与装置100之间的应用105消息的后端映射信息452的生成,也提 供屏幕组件生成器629使用的预定义组件400, 404和列举450 (在使用的 情况下)(即,输入454,见图23)。
屏幕组件生成器629允许无线应用程序设计者使用工具116,响应工 具116进行的数据源106通信格式的调查(例如,通过后端连接器616呼 叫455,见图6),激发数据源106通过信息453提供的所有复杂数据结构 信息(在可用的情况下也包括简单数据类型)的全屏生成。开发人员可以
随后决定展开生成的无线应用(包括组件400, 402, 404, 406),或根据 需要调整。例如,可以理解,生成器629可以在屏幕生成处理和一般应用 程序处理过程中与工具116的其他模块通信,其他模块包括屏幕编辑器 708,消息编辑器712,消息-数据编辑器704,工作流编辑器702,和数据 编辑器710,以及阅读器826和824,但不限于此。应当理解,开发人员 在(通过生成器619)自动生成屏幕组件402的过程中,和/或一旦屏幕组 件402 (那些对应于现有或已经定义的组件400, 440和列举450的组件 402)被生成时,可以用重复进行的方式执行工具115模块与生成器629 的结合。
因此,应当认识到,生成器629可以整合在工具116体系机构中,或 作为分离的工具提供,并且利用出自在通过后端连接器616确定的数据源 106 (例如,Web Services,数据库,等等)中发现的消息和数据结构的 现有(即,预定义的)无线数据400,消息404和可选的枚举450组件。 例如,如下面要进一步说明的,现有数据400和消息404组件可以通过从 底向上的路径图650a预定义。因此,生成器629供给了用于显示选定数 据源106网络消息(如应用105的消息组件404定义的)使用的所有复杂 和/或简单数据结构的无线屏幕组件402的自动或引导生成。
参考图23,屏幕组件生成器629接收应用程序输入454 (例如,组件 400, 402和列举450),和产生输出466,输出466可以只是对应的屏幕组 件404,或应用105的更为汇编的版本,例如作为XML定义集林(见图 3)提供的组件400, 402, 404, 406,但不限于此。如下面进一步说明的, 可以用XML分析器分析输入454的内容,以便提供一组组件细节458a, b, c (例如,数据,消息和枚举细节)。工作流模块460可以使用细节458a, b, c, 以产生输入454的组件400、 402、 450的适当的工作流461,和/或可以将 工作流461作为开发人员预定义的(显示在幻图中)提供到屏幕组件生成 器629。屏幕组件生成器629也可以使用一组屏幕模板462 (例如预定义 的设计图案),包括,例如用于进入和外出消息的类属字段和控制及可 见对象,列举细节,数据结构,主屏幕,和对话框,但不限于此。如下面 进一步说明的,屏幕生成引擎464用于根据细节458a,b,c、工作流461、
和屏幕模板462组装屏幕组件404。
预定义的组件400, 404细节
为了简单起见,仅说明一个数据源106对其如上所述输入和输出消息 的操作。对于预定义的/生成的组件400、 404和枚举450,以下的无线消 息458b、数据458a、和列举458c细节可以供屏幕组件402生成使用。参 考图24a,从(输入的)预定义消息组件404获得的消息细节458b可以包 括,例如组件名称520,消息类型522,消息字段524,字段的类型526, 和复杂或简单数据结构的指示528,但不限于此。应当注意,可以将名称 520以及命名的消息字段524用作(被引擎464)插入到模板462以便组 装生成屏幕组件402的代表屏幕的可视对象320 (见图26c)。参考图24b, 从(输入454)的预定义数据组件400得到的数据细节458a可以包括,例 如组件名称520,数据字段530,字段类型526,和复杂或简单数据结构 的指示528,但不限于此。还要注意,名称520以及命名的数据字段530 可以被用作(被引擎464)插入到模板462中的可视对象320,以便组装 生成的屏幕组件402的代表屏幕(见图26c)。参考图24c,示出了列举细 节的例子,包括结果类型532和列举文字534。
示例屏幕工作流
参考图25,示出了用于图24a,b,c中表示的示例消息404、数据400 组件和列举450的示例工作流461。可以供给屏幕324的定义控制322用 于,例如根据用户互动(当在装置100上使用应用105时)在屏幕324 之间导航,响应用程序户和/或系统事件将数据显现到屏幕324,以及装置 IOO的用户作出的数据输入,但不限于此。
生成的组件402的示例屏幕
下面是生成的屏幕组件402的代表无线屏幕的示例。注意示例屏幕 324的图有关图24a, b, c中表示的示例组件400、 402、和列举450。屏幕 组件生成器629可以根据下面的图案/模板462 (见图23)实现无线应用 105设计。参考图26a,主屏幕620为无线应用105提供了一个唯一的进入点(无线屏幕组件402)。这个屏幕(scr—Main) 620允许用户调用通过 预定义的组件400、 402表示的任何选定数据源106操作(键入24a, b, c)。 参考图26b,生成用于所有外出无线消息的对话框(scr一MessageSent)屏 幕622。在发送了外出消息之后,这个对话框屏幕622可以在装置100的 用户界面上弹出,然后将控制返回到(装置100用户界面的)控制台屏幕。 参考图26c,引擎464 (见图23)为预定义消息402 (见图24a)的每个外 出消息组装(由生成的组件402表现的)无线屏幕624。
再参考图26c,结合它的"Submit (提交)"按纽控制322,屏幕生成 器629也可以创建用于发送与屏幕624相关联的消息的脚本,例如,但不 限于此
outGetQuickQuotesSo即In. parameters二gv—GetQuickQuotesSoapIn. parameters;
outGetQuickQuotesSoapIn. Header=gv—GetQuickQuotesSoapIn. Head
er;
outGetQuickQuotesSoapIn. send(); scr—MessageSent. display ();
在上面的脚本468中,"gv—GetQuickQuotesSoapIn"代表通过生成器 629创建的并且结合到我们的示例中的无线数据组件400 "GetQuickQuotesSoapIn"的无线全局变量。应当认识到,在完成的应用 105中,脚本468可以被包括在,例如,生成的屏幕组件402和/或对应的 工作流406组件406中,但不限于此。
参考图26d,为预定义的消息(见图24a)的每个进入消息,生成无 线屏幕。例如,装置100用户在关闭控制322上的点击将控制返回到主控 制台(即,进入点)屏幕620 (见图26a)。应当认识到,进入和外出消息 屏幕624, 626可以具有,例如,以下非阵列类型的控制322,例如
无线列举专用选择控制(格式下拉);
字符串编辑框(格式文本);
布尔型多选择控制(格式检验栏);
日期编辑框(格式日期);
二进制、长和整数编辑框(格式文本或数字);和 无线数据组件"Details"按纽,
但不限于此。应当认识到,消息组件的布尔型的可选实施例是类型可以如 下表示对于结合于外出消息的屏幕,表示为一个单一的选择控制(格式 单选按钮);和对于结合于进入消息的屏幕,表示为编辑框(格式文本)。
应当知道,这个可选实施例可以提供表示布尔值的更为方便和自然的方 式,因为单选按钮控制更适合于表示布尔值(真或假)。
为了每个预定义的无线数据组件(用细节458a表示的,见图24b), 生成对应的无线屏幕组件。这些屏幕的控制对应于该无线数据组件的字段 530,并且是与上面的格式相同的格式的,g卩,例如
无线列举专用选择控制(格式下拉);
字符串编辑框(格式文本);
布尔型多选择控制(格式检验栏);
日期编辑框(格式日期);
二进制、长和整数编辑框(格式文本或数字);和
无线数据组件"Details"按纽, 但不限于。如上所述,应当知道,数据组件的布尔类型的可选实施例是, 类型可以如下表示对于结合于外出消息的屏幕,表示为单一选择控制(格 式单选按纽);和对于结合于进入消息的屏幕,表示为编辑框(格式文本)。 应当知道,这个可选实施例可以提供表示布尔值的更为方便和自然的方 式,因为单选按钮控制更适合于表示布尔值(真或假)。
消息和数据组件的生成屏幕的所有控制可以具有初始值和输出映射。 对于进入无线消息的屏幕624的(和也用于结合于这些进入消息的细节屏 幕(未示出)的)控制322,初始值可以具有如下示例格式
对于阵歹lj: @gv_QuickQuote_Array[]. Outcome;禾口
对于非阵列@gv—WRecipe.Name。
对于结合于外出消息的屏幕626和它们的细节屏幕628 (见图26e), 初始值可以是空白。输出映射用于其值要进一步发送(例如,发送到细节 屏幕62S)的控制322。此外,类型阵列的字段(数据字段530或消息字 段524)可以遵循以下图案,例如
对于类型阵列的原始字段,产生选择控制;和
对于类型阵列的字段-无线数据组件,可以添加额外按纽"View" 322,但不限于此。
结合于这个细节按纽的生成屏幕626允许该阵列的所有字段的显示。 屏幕626的"View"按纽322发送到下一个屏幕(例如细节屏幕628),初 始化到细节的数据组件的无线局部变量。在我们的示例中,局部变量是 类型"QuickQuote"的"Iv—QuickQuote"。参考图26e,细节屏幕628示 出了参考(局部变量)构成控制(进入消息),或允许将控制的值发送到(外出消息的)呼叫者屏幕。
生成器工具629提供了显现预定义数据源消息组件404和数据组件 400 (由细节458a,b,c表示的,见图24a,b,c)使用的所有复杂和简单结 构所需的所有无线屏幕组件的生成。可以将这个屏幕组件402生成处理过 程看成是多个步骤的序列,这个多步骤序列的结果是无线屏幕组件402、 脚本468、全局变量、初始值、和选定数据源106操作的映射的完整生成(如通过预定义组件400, 404,和列举450说明的)。通过应用105开发人 员在物资供应系统信息中心库114 (见图1)上展开这个创建的无线应用 105可以允许装置100用户将它下载到装置100并且其上运行时。预定义 组件400, 404,和在可用的情况下的列举450,以及应用网关AG的数据源 绑定452 (见图22)是利用,例如,(下面要说明的)开发图案**,通过 与组件生成器631提供的。
生成器629的操作
参考图23和27,屏幕组件生成器629的操作可以用以下的步骤,在 每个预定义消息组件402 (即,输入454)基础上,进一步分解,例如, 但不限于
步骤SIO,对于结合与输入454的选定数据源106操作的所有无线消 息(进入或外出),在通过分析器456分析以产生细节458a,b,c时,创建 代表消息字段524的类型526的(见图24a),与每个无线数据组件相关联 的无线全局变量;
步骤S20,在步骤S10创建的全局变量可以用于通过引擎464 (例如) (如果开发人员使用引擎464的话),创建无线消息与无线数据组件之间
的字段级映射911 (见图20a)。这样,在运行时,可以将无线数据组件的
值绑定到无线消息;
步骤S30,对于每个无线消息(进入的或外出的),通过引擎464根据
工作流461创建对应于无线屏幕组件402,从而对于结合与(在装置100
与应用网关AG之间通信的,见图l)无线消息的每个上述屏幕624,626,
利用上述图案/模板462创建屏幕控制;
步骤S31,作出消息是进入的消息还是外出的消息的决定; 步骤S40,创建结合于外出消息屏幕626的"Submit"按钮控制322 (例如)脚本468,和在步骤S41创建用于进入消息屏幕624的"Close"
按钮控制322;
步骤S50,如果对于给定预定义的消息组件404有预定义的数据组件 类型526 (不是原始类型的)的字段,那么为该无线数据组件和所有它的 嵌套无线组件递归地生成屏幕624,626;和
步骤S60,生成代表无线应用程序控制台屏幕620的无线屏幕组件402 作为输出466。这个屏幕620可以包含用于每个选定数据源106操作的"Go" 按钮控制,如在输入454的预定义组件400,404中说明的(见图23)。
参考图28,包含在预定义消息组件402中的每个字段的操作如下
步骤S62,通过引擎464从数据细节458a, b, c收集所有字段;
步骤S64,是否有更多字段;
步骤S66,字段是否是阵列(即,复杂数据结构);
步骤S68,如果S66的回答为"是",那么字段是否有关数据组件400 (例如,输入454的一部分);
步骤S72a, b, c,如果对于S68的回答为"否",那么创建选择控制322 和设置初始值和映射,并且如上所述为步骤S64选择下一个字段,否则;
步骤S74a, b, c, d,如果对于S68的回答为"是",那么创建视图按钮 控制322 (例如)和局部变量,与此同时设置初始值和映射;
步骤S75,产生当前阵列字段的屏幕组件402和添加到应用105,并 且如上所述地重复步骤S62;
步骤S70,如果对于S66的回答为"否",如果字段于数据组件400 有关(例如,输入454的一部分),那么;
步骤S78a, b, c, d,与设置初始值和映射一同创建细节按钮控制322, 并选择数据组件400,从而;
步骤S79,生成数据组件的屏幕组件402和添加到应用105,并且如 上所述地重复步骤S62,否则;和
步骤S76a,b,c,创建编辑框或选择控制322 (例如)和设置初始值和 映射,并且如上所述地为步骤S64选择下一个字段。
应用程序开发图案648
推荐图案654
参考图13和14,工具116可以使用显示器206 (见图2)上显现的方 式推荐图案654作为向导,以便引导开发人员确定哪个可用开发图案650 最适合当前开发活动。如上所述,向导604操作是通过借助工具116的用 户界面202访问的对话605引导的。例如,开发人员面在开发应用105时 面临着如何决定釆用那种途径图案650的最初问题。参考图14,开发人员 开始1402,或通过考虑到一些可能影响选择的图案650的问题而继续现有 的应用105项目,问题包括,例如对于诸如WebServices、在前的应用 程序、当前数据库配置、或这些元件的某种组合之类的现有元件的框架的 限制,但不限于此。然后,开发人员在1404审阅可能影响途径图案650 选择的设计参数,这些设计参数可以包括以下参数例如,有具有充分了 解的工作流和/或需要通过应用105模拟的屏幕的现有应用程序操作;可 能有要连接在后端上的特殊数据源106,和希望根据这个特殊数据源106 规划模型化应用105;可能有应用程序应当与之互动,因此不能对该Web Services(数据源106)的行为进行改变的现有Web Services(数据源106); 和可能是环球网的简单测试的或可能生成基于简单表格的界面的应用 105,但不限于此。如果希望,图案654可以经过显示器206向开发人员 建议这些设计参数。
根据哪个组件400, 402, 404, 406是开发途径图案650的中心部分的决 定1404,推荐图案654可以自动地选择1406 (经过显示器通信到开发人 员)哪一个图案,例如如下面要进一步说明的,以消息组件404为中心 的从下向上图案650a;以消息组件404为中心的懒汉图案650b;以数据
组件400为中心的数据驱动方式650c;以数据组件400为中心的商业域模 板图案650d,但不限于此。也应当知道,开发人员可以不使用推荐图案 654,并代之以用人工选择1406以哪种开发途径图案650作为开始。此外, 应当认识到,根据需要其他开发图案650可以是以屏幕组件402和/或工 作流组件406为中心的。此外,应当认识到,根据步骤1404,存在着可以 选择一个以上的组件400, 402, 404, 406作为应用程序开发目的的开始点。 但是,在这种情况下,可以(人工地或自动地)选择一个与选定的组件 400, 402, 404, 406中的一个相关联的特殊编辑器600或阅读器602作为模
块来开始开发处理过程。
再参考图14,如果在步骤1406的图案650决定是,例如,有可用的 现有Web Services (数据源106),并且应用105被禁止使用对应的Web Services界面,那么在步骤1408可以采用以消息组件404为中心的方式, 这种方式被称为"从下向上的方式"图案650a。这种情景的一种极端情况 即,开发人员毫不关心应用程序看起来如何,可以允许使用懒汉途径图案 650c,懒汉途径图案650c也是以消息组件404为中心的。另一方面,如 果在步骤1406开发人员具有严格地反映出一个现有数据源模式的应用 105开发任务,那么可以选择以数据组件400为中心的数据驱动途径图案 650c。同样地,模拟特定商业域的数据组件400标准集可以是选择商业域 模板图案650d的原因,商业域模板图案650d也是以数据组件400为中心 的。因此,可以根据组件400,402,404,406中心原理,选择上述或其他希 望的特定开发图案650。
开发图案650 从下向上途径图案650a
参考图13和14,从下向上途径图案650a采用了根据可用后端数据源 106消息传送说明(例如,SQL和WSDL)生成适当的应用105的方式。这 个图案选择650a中存在的问题是你如何聪明和有效地建立加工现有Web Services或其他数据源106服务的应用105;和是一个或更多的开发的应 用程序必须定址或与之通信的现有后端数据源106服务。考虑的示例设计 参数是典型的公司具有其一套数据源106的可用服务遗产,并且一套可
以经过互联网使用的公共Web Services可以是应用105的框架。因此, 上述细节和决定可以经过显示器206向开发人员现实,或可以由开发人员 人工地作出决定。根据以上说明,图案650a可以(经过显示器206或用 户界面202的其他设施)指导
1. 在步骤1410,为组装消息组件404选择消息编辑器712 (和在步骤 1408选择结合的消息有关的向导604);
2. 输入目标Web Services的URL;
3. 选择操作以生成消息编辑器712的消息;
4. 选择字段默认值;
5. 确认MessageAutomerge图案660b (以后要进一步说明)生成的消 息副本的推荐,例如,使用模型确认器602 (见图6);
6. 如果开发人员要产生适当的数据组件400以持续消息组件404的消 息数据,或把消息组件404的消息链接到屏幕组件402中定义的屏幕,那 么可以应用程序MessageContentTarget图案658a (以后要进一步说明); 和
8.通过利用带有下面要进一步说明的有关向导604的相关编辑器600 和阅读器602指定任何附加数据400、屏幕402、和工作流406 (例如,导 航)组件,可以完成应用程序的开发。这可以通过直接前进到步骤412, 或通过在适当的向导604的指导下跨越步骤1408的路径(用参考号1409 指示的)完成。
懒汉途径图案650b
参考图13和14,懒汉途径图案650b可以是从下向上途径图案650a 的一种扩展,借助其生成包括数据组件400和屏幕组件402的完整应用程 序6105。图案选择650b中存在的问题是你如何有效地生成应用105以 能够测试现有的Web Services数据源106;和你在开发的早期阶段并且你 的目标Web Services数据源106正在频繁地改变消息传送模式,例如, 你要能够快速地生成应用105以测试界面和不是真正地关心应用105的显 现。考虑的示例设计参数是应用105的UI外观可能对与Web Services 数据源106互动的能力没有作用;和开发人员可能最关心后端数据源106的测试和调试。根据上述说明,图案650b可以(经过显示器206或用户 界面202的其他设施)指导开发人员,以
1. 以在步骤1408应用程序和扩展的从下向上途径图案650a开始;
2. 在步骤1410与数据编辑器710 (和潜在的编辑器704)协力,和如 果希望,那么图案650b提供一组建议的数据组件400以模拟从消息组件 404的消息调用传递或返回的数据;
3. 通过屏幕编辑器708 (和潜在的阅读器824)生成并接受一组默认 屏幕以显现或输入传送到Web Services的数据;和
4. 通过利用带有下面要进一步说明的有关向导604的相关编辑器600 和阅读器602指定任何附加数据400,屏幕402,和工作流406 (例如导航) 组件,可以完成应用105的开发。这可以通过直接前进到步骤1412,或通 过在适当的向导604的指导下跨越步骤1408的路径(用参考号1409指示 的)完成。
数据驱动途径图案650c
参考图13和14,数据驱动途径图案650c帮助开发人员使用工具116 创建严格地象或类似于现有数据库模式的应用105。这种图案选择650c 中存在的问题是你如何产生其结构主要来自现有数据源106模型的应用 105;目标应用程序数据结构要严格地/等同地类似数据源106模式的一部 分;和,应用105主要用于观看或更新存储在后端数据源106中的信息。 考虑的示例设计参数是应用105是以数据为中心的,和应用105的功能 以简单的观看/更新/删除方式运行时。根据上述说明,图案650c可以(经 过显示器206和用户界面202的其他设施)指导开发人员,仅通过示例的 方式
L在步骤1410选择数据编辑器710 (和与有关的数据相关联的向导 604);
2. 使用编辑器712 (和潜在的编辑器704)根据数据库模式选择生成 数据组件400;
3. 提供数据库模式的位置(例如,可以通过dll文件表达);
4. 建议按照前面的步骤使数据组件400与通过表格表达的"高速缓存"
数据匹配;
5. 开发人员可以选择可用表格的子集,从而使工具116能够为相关的 需要的表格保持最小的(或其他预定义的标准)依赖关系;
6. 用户可以指定如何访问表格,例如选择/更新/删除,和建议的消息 可以通过消息编辑器712生成以支持这些功能;和
7. 通过利用消息编辑器712提供消息传送组件400以执行与数据源 106的互动(假设跳过了步骤6),和在步骤1412利用带有工具116提供 的有关向导604的适当屏幕编辑器708和阅读器824提供屏幕组件402以 显示和操纵数据组件400而完成1412应用程序。
商业域模板图案650d
参考图13和14,商业域模板图案650d可以用于作为主要方式的一部 分帮助开发人员生成模拟应用105的特定商业域的数据组件400的标准 集。这个图案选择650d中存在的问题是你如何产生最适合于特定垂直 市场的应用105;和你要开发用于商业应用程序的特定域,例如,保险业、 卫生部门、房地产、汽车工业、等等的应用105。考虑的示例设计参数是 商业部门一般具有它们自己的完好定义的实体和关系;开发人员要确定该 域用户熟悉应用105;希望避免"重新从头做";和希望保证应用105符合 被接收的惯例。根据上述说明,图案650d可以(经过显示器206或用户 界面202的其他设施)指导开发人员,仅通过示例的方式-
1. 开发人员利用UI 202在显示器206上启动商业域模板图案650d, 并提供商业域的模式(XSD)位置;
2. 在步骤1410,通过使用数据编辑器710工具116生成匹配商业域的 数据组件400的集;
3. 开发人员可以选择感兴趣的模式的对象,放弃不使用的(典型的域 模式相当大);
4. 工具116保持模式中连接的数据表达之间的关系,以确定包括了所 有相依的组件400;和
5. 通过利用消息编辑器提供消息传送组件400以执行与数据源106的 互动,和通过在步骤1412使用带有工具116提供的有关向导604的适当的屏幕编辑器708和阅读器824提供屏幕组件402以显示和操纵数据组件 400而完成1412应用105。
应当认识到,在需要时,可以通过用于对应的图案650a,b,c的向导 604指导不是上面仅以示例方式说明的、其他编辑器600和阅读器602的 使用。这包括向导604与相关联的图案648之间的互动,这种互动优选是 通过显示器206 (或通过用户界面202)上对开发人员显示的对应图案 650a, b,c的向导604的指导。
确认图案660 消息自动归并图案660a
消息自动归并图案660a是可以减少与后端数据源106交换的消息组 件404的消息的定义中的副本的精制图案。在为了应用105的确认目的而 调用确认器620 (见图6)时,可以在显示器206上实现这个图案,作为 开发人员在UI 202上输入事件的结果。这个图案选择660a中存在的问题 是你如何生成更有效的消息集与后端Web Services互动;和你正在利 用从下向上途径图案650a开发应用105,并且已经为特定Web Services (数据源106)生成了消息集。考虑的示例设计参数是 一些界面可以交 换类似或复制的参数集;和就应用105尺寸,越过头顶的空中传输,装置 运行时RE需求而言,每个复制说明都具有相关联的(和不必要的)成本。 根据以上说明,图案660a可以(经过显示器206或用户界面202的其他 设施)指导开发人员,仅通过示例的方式
1. 通过(例如)上述的从下向上途径图案650a提供(例如,通过消 息编辑器712)生成的(消息组件404的)消息集;
2. 分析消息以看看是否存在消息方面的公共性,例如, 一个消息是另 一个的子集(比较字段数和类型是否一样),和/或任何复制消息定义;
3. 工具可以推荐在何处原型化可以用于通过遗传定义类似的消息,或 在何处可以除去复制消息。
数据自动归并图案660b
在应用程序到开发的应用105的数据组件400说明(例如,由数据编 辑器710给出的)时,这个图案660b可以为消息自动归并图案660a中的 消息提供讨论的最佳化和步骤的相同的分类。
屏幕图案656
参考图14,屏幕图案656可以在步骤1410和/1412中用作次要图案 648,以在根据主图案650指导/协调生成屏幕组件402时提供帮助,也就 是说,在帮助开发人员生成应用105的屏幕组件402中,图案650驱动图 案656,而图案656驱动屏幕编辑器/阅读器704, 824的操作。图15中示 出了主和次图案的协作1500,其中首先调用1502 (例如,通过图案654) 主图案(例如,图案650)。然后,主图案调用或选择1504次图案(例如, 图案652, 656, 658, 660),次图案又帮助或调用1506适当的编辑器600 和阅读器602,以按照开发人员的希望,或通过图案652, 656, 658, 660
(即,向导604)指导,开发组件400, 402, 404, 406。也应当认识到, 在需要时主图案可以直接调用1508适当的编辑器/阅读器600,602。此外, 一旦次图案在开发对应组件400, 402, 404, 406中完成了相关编辑器/阅 读器600, 602的指导(即,图案658指导编辑器712构造消息组件404), 指导可以退还1510到原始主图案,或不同的主图案,或交给其他次图案 以继续应用105开发。
表格图案656b
表格图案656b为开发人员提供了一种利用收集和提交某些值的屏幕 编辑器704和阅读器824有效地生成屏幕(作为屏幕组件)的方式。这个 图案选择656b中存在的问题是你如何有效地产生表格以收集和提交某 些信息;和产生的屏幕具有一种结构化的,例如,基于表的格式。考虑的 实例设计参数是表格经常被用于收集信息的标准集,例如,用户细节, 喜好,等等。根据上述说明,图案656b可以(经过显示器206或用户界 面202的其他设施)指导开发人员,仅通过示例的方式
1. 利用屏幕编辑器/阅读器704, 824,通过图案656b提示开发人员出 现在表格上的列数;
2. 或出现在表格上的行数;
a.开发人员识别每列中出现什么类型的控制,例如,标签,编辑框, 图像,等等,从而开发人员在适当的情况下输入任何标签所需的文本和标 识数据映射;
3. 开发人员识别屏幕转移如何经过提交发生,例如,在适当的情况下, 通过按纽提交,通过菜单项提交,和使用消息始发(MessageOrgination) 图案652a;和
4. 完成屏幕组件402开发并且直接或通过后续向导604调用后续编辑 器/阅读器600, 602。
数据单表图案656e
数据单表图案656e提供了一种生成,例如,基于数据组件400的数 据定义的屏幕的方式。这个图案选择中存在的问题是你如何根据现有的 数据定义生成屏幕;和当使用这个图案656e时,屏幕称为表现数据结构 本身的可见装置。考虑的示例设计参数是 一些屏幕生成只是为了修改数 据组件400的目的。根据上述说明,图案656e可以(经过显示器206或 用户界面202的其他设施)指导开发人员,例如,仅仅
1. 开发人员使用屏幕编辑器/阅读器704, 824提供要从其生成屏幕的 数据组件400定义;
2. 工具116 (利用屏幕组件402和相关的编辑器/阅读器600, 602) 生成具有两列的屏幕; 一列用于字段名称,另一列用于字段值,从而
a. 控制名称可以根据数据组件400定义字段名称自动生成,
b. 控制类型根据数据类型自动生成,其中,
i. 简单字段被映射到编辑框,和
ii. 嵌套数据字段产生"Add", "Edit",和"Remove"按纽。再使 用数据单表图案656e以生成显现嵌套数据组件400的屏幕(屏幕组件 402),从而,
I, "Add", "Edit",和"Remove"的显现依赖于运行时条件(即, 嵌套组件是否是零),
iii. 嵌套阵列类型字段生成选择列表,从而,
I.简单值的阵列可以通过选择列表直接表示,
II. 组件的阵列把再使用的数据单表图案656e用于包含的数据类
型,禾口
III. "Add", "Edit",禾B "Remove"可以根据运行时条件显示,
a. Add总是显示,
i.在运行时,"Add"按纽可以打开对话605收集简单值,或 可以搬运到子页创建数据组件400,
b. Edit在被选择时显示,
c. Remov在被选择时显示, i.如果用户要除去所有嵌套数据实例,数据组件400的
Removal可以提示用户,
iv.具有资源标记的字段导致图像字段,
c. 字段标签应当由开发人员输入,
d. 在开发人员的判断下,任何特定字段可以跳过,
3. 工具116生成施加该值的提交按纽,和
4. 屏幕组件402开发完成,并且直接或通过后续向导604调用后续编 辑器/阅读器600, 602。
放映幻灯图案656a
放映幻灯图案656a生成显示图像动态集的屏幕(即,屏幕组件402)。 这个图案选择656a中存在的问题是在图像的数量是在设计时不能确定 的情况下,你如何有效地显示一系列的图像;和应用105依赖于可能根据 一些预先的条件指向不同图像的URLS的动态集。考虑的示例设计参数是 产生允许这种行为的屏幕和脚本是困难和费时的。根据上述说明,图案 656a可以(经过显示器206或用户界面202的其他设施)指导开发人员, 仅通过示例的方式
1. 开发人员利用屏幕编辑器/阅读器704, 824 (从阵列)识别URLS
的源
a. 可以是数据组件400上的阵列字段,
b. 可以是接收的消息上的阵列字段;
2. 工具116生成具有映射到全局变量的图像控制的基本屏幕(组件402)
a.工具116生成全局变量;
3. 工具116生成"next"按纽
a.生成附属脚本组件406,这个脚本组件将来自1的下一个图像URL 装载到2.a的全局变量;
4. 工具生成"done"按纽;和
5. 完成屏幕组件402开发(全部或部分),和直接地或通过后续向导 604调用后续编辑器/阅读器600, 602。
访问装置数据图案656c
访问装置数据图案656c提供对基于装置访问的"内置"集合(例如, 日历预约,地址簿项,等等)的访问的智能处理。图案656c提供了一种 区分装置100管理的组件的整个集合和应用105创建和管理的组件的子集 的手段。这个图案选择656c中存在的问题是你如何容易地区分整个装 置100管理的外部组件的集合和应用程序100在其上操作的组件的子集; 你正在开发引用诸如日历预约之类的外部集合的屏幕组件402。考虑的示 例设计参数是 一些应用105可能要操作在外部应用程序管理的所有外部 集合实体上; 一些应用105可能要仅显示其本身创建和管理的外部应用程 序组件。根据上述说明,图案656c可以(经过显示器206或用户界面202 的其他设施)指导开发人员,仅通过示例的方式
1. 开发人员利用屏幕编辑器/阅读器704, 824将控制链接到诸如日历 或地址簿之类的"内置"集合;
2. 开发人员指出内置集合的包含关系
a. 集合可以包括被访问的应用程序外部创建和管理的所有参见
b. 集合可以仅包括那些由应用程序明显地创建或参考的组件;
3. 工具116为2中指示的情况产生数据组件400
a. 对于组件的标准集合,应用105数据组件400简单地通过名称,例 如,"Address"使用内置组件,
b. 对于应用程序106管理的集合,应用程序数据组件400扩展内置组 件和添加UID关键字段,
i. 给扩展的数据组件400 —个隐藏的名称,可以预订将应用105的名
称挂到集合名称,
ii. 然后,工具116在屏幕生成发生时使用这个隐藏名称,但是在工 具116的设计视图中继续使用内置集合名称,
iii. 在把数据传递到脚本或另一个屏幕组件406, 402时,工具116 保持对正确潜在类型的关系;和
4.完成屏幕组件402开发(全部或部分),和直接地或通过后续向导 604调用后续编辑器/阅读器600, 602。
支持代码
内置集合可以如下扩展以容许应用105管理的集合 〈dataname二,, [wicletName]Address" prototype-" [UIDpkg] ,, pkey= ,,UID,,〉
〈dfield扁e二" UID" type〕../〉
</data>
制定屏幕控制条件图案656d
制定屏幕控制条件图案656d允许开发人员将条件附加到控制,条件 说明确定可见性的标准。这个图案选择656d中存在的问题是你如何规 定一个特定控制仅能在特定环境下显示;你如何能够用这样一种方式写出 应用'105,使得尽可能小的导航逻辑嵌入脚本组件406,而是表达在屏幕
定义中;和你正在开发具有在某些可测试标准的条件下发送的导航或消息 的应用105。考虑的示例设计参数是希望将导航的条件逻辑从脚本转移 到屏幕组件402的定义;和你要充分利用诸如消息始发 (MessageOrigination)图案652a (例如)之类的其他助手图案。根据上 述说明,图案656d可以(经过显示器206和用户界面202的其他设施) 指导开发人员,仅通过示例的方式
1. 开发人员利用屏幕编辑器/阅读器704, 824指示特定控制服从条件 逻辑;
2. 工具116显现可以陈述条件的区 a.显示产生的先决条件以重复使用;
3. 工具116将条件结合于控制,并提示是否要使用诸如 MessageOrigination 652a之类的其他图案;和
4. 完成屏幕组件402开发(全部或部分),并且直接或通过后续向导 604调用后续编辑器/阅读器600, 602。
支持代码
考虑下面两个示例
示例A:(正确方式)
〈screen name二" fromScreen,,〉
〈button name二,, submitToScreenA,, condition =,, return User, selection A" >
〈event scripts" sendMsgAGotoA,, param=" aType,, /〉
〈/button〉
〈button
name二,, submitToScreenB,, condition二,, return!User, selection A"
>
〈event script二,, sendMsgBGotoB" param=,, bType,, />
〈/button>
〈/screen〉
〈script name=,, sendMsgAGotoA,, params=" a" >
A. send (a); ScrA. display 0 ; 〈/script〉
〈script name=,, sendMsgBGotoB" params=,, b,,〉
B. send(b) ScrB. display (); 〈/script>
示例B:(不正确方式)
〈script name二,, fromScreen,,〉 〈button name=,, submitToScreenAOrB,,〉
〈event script二" sendAndBmnchAOrB,, param二,, aType, bType,, /〉
</button>
〈/screen〉
〈script name=,, sendAndBranchAOrB,, params二,, a,b" > if (User, selection:" A" 〉{
A. send (a); ScrA. display (); }else{
B. send(b); ScrB. display ();
〈/script>
示例A说明了经过条件脚本将条件导航嵌入屏幕的正确方式。执行屏 幕转变和消息发送的脚本被User, selection的当前状态禁止。示例B说 明了在一个单一脚本内评价条件逻辑的不大希望的方式。通过使用示例A 的方式,可以更容易地使用MessageOrigination图案652a。
脚本图案652 消息始发图案652a
消息始发图案652a提供了生成发送消息组件404的消息所需的脚本 的智能手段。图案652a应用一些规则确定消息的内容应当来自何处。这 个图案选择652a中存在的问题是你正在开发收集或操作某些信息然后 发送消息的屏幕组件402;如何你能容易地产生发送消息所需的脚本;屏 幕组件402具有用于处理的相关的数据类型,这个相关数据类型可以作为 参数提供,构造在屏幕中,或作为集合的一部分参考。考虑的示例设计参 数是能够生成共同使用情节的脚本可以减少开发应用105的复杂性;和, 依附于应用105开发最佳实践的消息、屏幕、数据定义或对应组件以及它
们的相互关系一般服从于一组公认的处理规则。根据上述说明,图案652a 可以(经过显示器206或用户界面202的其他设施)指导开发人员,仅通
过示例的方式
1. 在开发可以条件地分支到其他屏幕(组件402),或发送不同消息的 工作流组件406时,使用工作流/脚本编辑器702,706,条件逻辑应当被保 存在屏幕组件402设计中,而不是转移到工作流组件406 (观看制定屏幕 控制条件图案656d方式),从而使得使用这种方式的效果是,不需要将条 件逻辑嵌入到消息始发图案652a生成的脚本中;
2. 作为按钮或菜单项的定义的一部分,用户可以配属脚本以进行定制 处理。 一个典型的处理是发送消息,和转换到另一个屏幕
a. 提示用户脚本是否要发送消息,和识别要发送的消息类型(M),
i. 可以通过在使用中观察已经在组件402 (参数或链接的数据)的 屏幕定义中使用过的数据类型的映射,可以提取最可能发送的消息的子 集,
ii. 可以选择以前定义的任何其他消息,
b. 提示用户应用程序将转换到的屏幕;
3. 确定消息类型M的映射规则,
a.原位映射到一个或更多数据类型(消息映射或字段映射),
i. 必须指出映射的数据类型的源,
I. 可以是传递到屏幕组件402的数据参数,
II. 可以是一种链接到屏幕组件402中别处使用的控制的数据类
型,
III. 可以是集合(例如,数据库)的基本数据类型,
IV. 可以是另一种数据类型(例如,Datal.Data2)上集合类型字 段的基本数据类型,
ii. 生成利用识别的数据发送消息的脚本,
iii. 字段映射的消息生成使用传递到脚本的数据实例初始化发送 前的字段的组件406的脚本,
iv. 包含扩展的字段的字段映射的消息造成工具116提示这些字段 的值(可以是来自实例的屏幕控制,或只是文字值),
V.生成发送使用规定数据的消息,和接收适当的参数的脚本。在需 要时生成消息字段集,和请求下一个屏幕,
b. 没有消息类型M的映射,
i. 工具116提示用户识别每个字段值来自何处
1. 可以来自其他屏幕字段,
2. 可以是简单文字值,
3. 可以忽略,
ii. 工具116产生接受需要的参数的脚本,设置字段和发送消息, 然后转移到屏幕组件402的下一个屏幕,
c. 原位映射,但是不将映射的数据类型传递到屏幕或在屏幕内使
用,
i.生成错误消息,这个消息不能从这个屏幕发送;
4. 作为加强现有消息的映射的选择,提供了创建新消息的选项
a.可以根据当前在屏幕内使用的字段,或可能是消息映射的候选者 的链接的数据类型,建议消息的初始定义;和
5. 完成工作流组件406开发(全部或部分),和直接地或通过后续向 导604调用后续编辑器/阅读器600, 602。
消息接收图案652c
消息接收图案652c提供了在消息接收利用共同处理的手段。这个图 案选择652c中存在的问题是你如何在接收消息时通过脚本简化应用105 的效果的说明;感兴趣的消息包含指示可能需要通过工作流组件406的脚 本的附加处理的字段级映射。考虑的示例设计参数是有一些可以用于字 段级映射消息的接收的共同情景;和消息中具有不更新其他映射的数据字 段的主关键字段映射。根据上述说明,图案652c可以(经过显示器206 或用户界面的其他设施)指导开发人员,仅通过示例的方式
1.利用工作流/脚本编辑器702, 706分析消息M的消息说明,
a. 在不需要工具116提示开发人员附加脚本的位置,消息映射原位
指示需要附加处理的可能性低,
b. 字段映射关系原位指示通过脚本附加处理的可能性较大,特别
是,
i.具有对其他消息字段上没有引用的数据类型的原始关键字段 的消息立即通过工具116触发提示需要附加处理;
2. 检测主要关键字段映射,
a. 在有一个孤立主要关键字段映射(即,创建)的情况下,工具116
可以提示开发人员是否希望通过脚本附加附加处理,在这种情况下工作流
组件406的创建的脚本是空,
b. 在有如上所述的两个或更多的这样的孤立映射的情况下
i. 如果一个映射的数据类型是其他数据类型的嵌套字段
Datal.x, x的类型是Data2,
I. 工具116推荐将Data2的实例设置到Datal字段x。
II. 生成执行设置操作的工作流组件406的脚本
ii. 如果一个映射的数据类型是其他数据类型上的嵌套集合的基 本类型Datal.x, x的类型是Data2,
I. 工具116推荐可以执行附加(add)或除去(remove),
II. 开发人员选择首选的选项和生成工作流组件406的相关脚本;
3. 在字段映射被规定为没有被主要关键映射相关的数据类型的情况

a.工具116可以提示开发人员是否应当用该字段值更新这个数据类 型的集合中的每个实例,
i.可以经过where字句规定整个集合的子集, I.工具116提示数据类型的条件字段, IL工具116提示比较运算符,
III. 工具116提示比较值, a.可以规定为来自没有被映射的消息的另一个字段;和
4. 完成工作流组件406开发(全部或部分),和直接地或通过后续向 导604调用后续编辑器/阅读器600, 602。
控制条件图案652b
控制条件图案652b提供通过可能包含在工作流组件406中的脚本生
成影响特定屏幕控制的显示的条件所需的引导图。控制条件总是对布尔结 果进行评价。这个图案选择652b中存在的问题是你如何规定屏幕的显 示依赖于满足一组条件;你如何容易地生成脚本来实现这种条件行为;你
正在根据数据的元素的当前状态、屏幕控制的状态、或传递的参数的值开
发具有分支或或动态屏幕行为的应用105。考虑的示例设计参数是开发 人员几乎没有写脚本的知识;和写脚本容易出错。根据上述说明,图案652b 可以(经过显示器206或用户界面202的其他设施)指导开发人员,仅通 过示例的方式
1. 利用工作流/脚本编辑器702, 706给开发人员可用的列表
a. 数据集合,
b. 当前屏幕控制名称(编辑框和列表控制),
c. 传递到屏幕的可用参数,
2. 开发人员选择1中提供的一个可用实体。
a. 对于集合
i. 开发人员可以测试至少有一个元素(size()〉0),
ii. 开发人员可以测试包含特定字段,
I. 显示集合的"contains field"文本,
II. 显示无键(单元素集合)集合的"field value is",
III. 开发人员可以输入字段名称,
IV. 开发人员可以规定字段值,
a. 可以是文字(设计时),
b. 可以是运行时值,
i. 创建或传递到屏幕的数据实例的字段,
ii. 当前屏幕的控制字段,
b. 对于屏幕参数,
i. 参数本身,
I.开发人员可以测试是否未定义实例(即,零),
ii. 单实例参数字段,
I. 开发人员可以测试单实例未定义(即,零),
II. 开发人员可以测试参数的字段具有特定值(与2. a. ii. 3&4相
同),
iii.阵列参数字段,
I. 开发人员可以测试是否有至少一个元素(size()〉0),
II. 开发人员可以测试是否包含特定字段(与2.a. ii相同),用
于测试的任选项由选择哪种类型的元件控制,
c.对于屏幕控制字段,
i. 对于选定编辑或文本区控制,
I. 开发人员可以测试值是否为空,
II. 开发人员可以将值比对开发人员输入的文字,
III. 开发人员可以用屏蔽码测试值,
ii. 对于选定的选择控制,
I.开发人员可以测试选择控制是否为空(真或假),
n.开发人员可以测试是否选择了特定索引,
III. 开发人员可以比对提供的文字,
IV. 开发人员可以用屏蔽码测试值;
3. 开发人员可以通过选择"more"和选择适当的运算符(例如,AND/OR)
组合另外的条件;
4. 如果需要其他高级行为,开发人员可以选择在脚本表格中编辑条 件;和
5. 完成工作流组件406开发(全部或部分),和直接地或通过后续向 导604调用后续编辑器/阅读器600, 602.
消息传送图案658 通知建立器图案658b
通知建立器图案658b提供了一种从通知数据源106生成通知和预约 支持的手段。这种图案选择652c中存在的问题是你如何容易地生成屏 幕和消息以在后端支持通知界面;你如何生成用于通知筛选的过滤器;和 你正在对一个通过WSDL文件表达的通知界面进行加工,作为示范的后端 模式。考虑的示例设计参数是预期通知Web Services变得更为普遍; 通知界面和支持预约和过滤是复杂区;开发人员必须至少通过文献和一些其他源知道数据源106支持的通知类型,和/或图案658b不能区分用于通 知的复杂类型与那些作为规则的同步请求/回答交换的类型。根据上述说
明,图案658b可以(经过显示器206或用户界面202的其他设施)指导
开发人员,仅通过示例方式
1. 开发人员使用消息编辑器712将工具116指向数据源WSDL(g卩,方
案),
a. 工具116显现来自WSDL的可用复杂类型的列表,
b. 工具116显现来自WSDL的可用操作的列表,
c. 开发人员可以根据揭示的服务的先验知识从显现的通知中选择;
2. 工具116问开发人员他们是否要接收某些通知的警报(建立通知标
准)
a.工具116问开发人员他们是否要规定警报的独立标准(即,过滤
器)
i. 如果否,那么警报是简单的检验栏,
ii. 如果是,那么报警将具有独立的过滤标准;
3. 工具116收集通知和报警的过滤需求,作为一组过滤器部件
a. 开发人员可以从通知复杂类型的字段选择
b. 开发人员可以选择比较运算符
i. 二=, !=for Strings,
ii. ==, !=, >, 〈, 〉=, 〈=for Numbers,
iii. Other type,
c. 开发人员可以选择比较器字段
i. 通知的另一个字段(没有小配件)或一个单一的文字值, I.开发人员可以指出这个过滤器是条件的,
a.用检验栏将它表现在屏幕,
ii. 任意输入字段,
I. 用编辑框在屏幕上表现这个过滤器部件,
II. 开发人员提供文本标签,
iii. 值的列举,
I.用下拉菜单或单选按钮阵列在屏幕上表现这个过滤器部件,
d. 开发人员命名这个过滤器部件(这用于在屏幕上显示的目的),
e. 开发人员可以指示增加另一个过滤器部件(布尔表达式),与&& 或II运算符结合;
4. 工具116给出所有引用的通知字段的注释,剩余的字段是静态通知 标准的候选者,目卩,在建立通知时用户提供的信息
a. 问开发人员是否要将任何剩余字段组合为基本过滤准则的部件,
b. 如果是,那么利用步骤3的方式建立附加过滤器部件,从而仅允 许编辑框和下拉菜单字段用于输入(这里不是条件过滤器部件),以使这 个标准成为静态标准;
5. 工具116利用适当的编辑器600和阅读器602生成需要的组件
a. 包含通知的所有字段+附加主要关键字段(id)的数据组件400,
b. 通知消息组件404
i. 用于支持的每个通知类型的预定消息组件404,
ii. 用于支持的每个通知类型的非预定消息组件404,
iii. 映射到数据通知组件404的通知消息,
c. 报警消息组件404 (如果选择的话),
i. 用于支持的每个通知类型的报警预定消息组件404,
ii. 用于支持的每个通知类型的报警非预定消息组件404,
iii. 带有适当的报警标签的报警通知消息组件404,
d. 包含用于每个通知和报警的过滤器的映射文件
i.在过滤器部件映射到检验栏控制时出现的包含条件元件的过 滤器(动态过滤器)生成过滤器部件的组合(仅有一种这样的过滤器部件 支持第一方面,即,max2过滤器),
I.通知或报警的预定消息包括布尔字段,以指示是否选择了这个 标记,从而应用网关AG能够根据标记的状态应用程序正确的过滤器;
6. 工具116生成支持屏幕(组件402)
a.工具116决定通知基本布置1600的最好方式(见以下说明的图
16),
i.对于大于4个可视通知信息字段1604, 推荐字段字段1604的堆叠(垂直)布置16Q2,
ii.对于少于4个可视通知信息字段1604,推荐字段的排成一行 (流水)布置,
b. 开发人员指示用户是否要
i. 观看结果和在同页上修改过滤器,
I. 优点翻动较少的页
n.缺点焦点浏览每个可编辑过滤器字段, III.参考图17看下面合并的屏幕讨论,
ii. 观看结果和再在一个分离页上修改过滤器,
工.优点通知的快速滚动,
II. 缺点必须到另一个屏幕去编辑过滤器,
III. 参考图18看下面分离的屏幕讨论,
c. 开发人员可以将附加字段1604附加到不是通知过滤准则的部分, 但可以是通知结果(即,映射到5.a中生成的通知数据类型)的显示;和
7.完成消息组件404开发(全部或部分),和直接地或通过后续向导 604调用后续编辑器/阅读器600, 602.
合并的屏幕
例如,图17中示出了用于通知结果和过滤器的合并显示的生成屏幕 1700。这里描述了排列成行布置,但是,这对于屏幕的行为并不重要。黑 和白框1702映射到通知的字段(字段A至D)。黑框1702考虑为是只读的, 而白框1702可以修改。主屏幕显示作为只读的静态准则1707。用户能够 修改通知和触发改变动作1705的报警准则1706 (这可以不是菜单项的结 果,而是改变字段的默认行为)。updateSubscription (更新预约)脚本 1710负责发送适当的通知和/或报警消息。add (加入)1712菜单项将用 户转移到New Notification Screen (新通知屏幕)1704,在这里可以说 明预约的通知和报警过滤器以及静态准则1707。 submit (提交)按钮1714 调用发送适当的预约消息的createSubscription (创建预约)脚本1716。 最后,remove (除去)菜单项1718运行时除去当前通知和有关预约的脚 本1720。
分离的屏幕
图18中示出了用于分离的结果和过滤器修改屏幕的生成屏幕1800。 在这里描述了排列成行的布置,但是这对屏幕的行为并不重要。黑和白框
1802映射到通知的字段(字段A至D)。黑框802考虑为只读的,而白框 可以修改。主屏幕1806以重复布局1808显示以前建立的所有通知结果。 不能从这个屏幕1806修改过滤器。 一个change (改变)1810菜单项将用 户转移到屏幕1812,在这里显示一个单个通知。静态准则1814不在这个 屏幕1812修改,但是,可以将通知字段更新以生成预约。 updateSubscription (更新预约)脚本1814负责发送适当的预约消息, 包括报警和通知是否被修改的消息。add (加入)菜单项1818将使用转移 到屏幕1814,在这里可以说明预约的通知和报警过滤器以及静态准则 1814 。
submit (提交)按钮1822调用发送适当预约消息的 createSubscription (创建预约)脚本1824.最后,remove (除去)菜单 项1820运行时除去当前通知和有关预约的脚本1820。
示例
以下使用来自"AG,RE, IDE通知"文献的气象通知说明这个图案658b。
1. 开发人员指向气象通知Web Services,
2. 开发人员选择通知复杂对象作为通知对象,
3. 开发人员指示它们可接收报警和通知,
a.开发人员指示报警不规定其本身的准则,致使允许它开启和关 闭生成一个检验栏,
4. 工具116开始建立通知准则,
a. 开发人员从通知指示字段类型,
b. 开发人员指示运算符二、
c. 开发人员指示与值"报警"、"预报"、"报告"的列举类型的比较: 生成下拉菜单,
d. 开发人员命名过滤部件Alert Type (报警类型),
e. 开发人员指示给另一个过滤部件加入运算符&&,
f. 开发人员从通知指出字段temperatureDiff (温度差),
g. 开发人员指示运算符==,
h. 开发人员指示与数字5, 10, 15, 20, 25, 30, 35, 40的枚举范围比较 生成下拉菜单,
i. 开发人员命名过滤部件Temperature Diff, j.开发人员指示给最终过滤部件加入运算符M, k.开发人员从通知指出字段weatherOriginal,
1.开发人员指示运算符!=,
m.开发人员从通知指出字段weatherNew,
i. 工具问开发人员这是否是一个条件字段,
ii. 开发人员指示yes (是)生成检验栏
n.开发人员命名过滤部件Weather Changes
5. 工具116识别一组没有包括在通知准则中的通知字段,
6. 开发人员指示有要包括在预约中的附加字段。它们不能被用户动态 地改变,仅规定新预约何时建立(静态准则),
7. 开发人员通过规定通知的定位、县、和州字段字每个的任意输入框 加入到部分4的过滤器。为逻辑运算符再请求部分4的机构为每个生成 编辑框,
8. 工具116根据静态字段和通知准则的数量推荐堆叠布置,
9. 开发人员从用于修改通知准则的合并屏幕和分离屏幕方式中选择,
10. 工具116生成
a. 用于报警+通知的要求的预约消息, i.生成指示是否选择了气象变化(Weather Changes)检验栏的
布尔标签,
b. 包括所有过滤器的要求的映射文件,
i.用于气象变化过滤部分的分离过滤器,
c. 要求的非预约消息,
d. 使用堆叠布置的屏幕,
i. 在除了加入通知屏幕之外的所有屏幕中,静态准则字段是标号
ii. 在加入通知屏幕和改变通知屏幕以及主屏幕中,以及如果使 用合并屏幕的话,在主屏幕中,通知准则字段是可编辑的,
iii.将提供给每个过滤部件的标号配属到对应编辑框,检验栏, 或下拉菜单。
消息内容目标图案658a
这个图案658a用于确定什么元素受消息影响。消息的目标一般是屏 幕402或数据400组件。这个图案选择658a中存在的问题是在拥有消 息的定义的情况下,你如何规定接收消息的应用程序的效果;你正使用从 下向上途径图案650a,或定义你自己的消息集;和你要把这些消息连接到 应用105的一些元素,以说明消息接收如何影响应用105行为。考虑的示 例设计参数是消息接收以某种方式影响应用105的操作;有一组消息接 收可能具有的标准效果。根据上述说明,图案可以(经过显示器206或用 户界面202的其他设施)指导开发人员,仅通过示例方式
1. 在拥有消息定义的情况下,开发人员可以利用消息编辑器712规定,
一个消息
a. 生成数据组件400实例
b. 链接到屏幕模版,从而使得消息的接收能够用新的值更新屏幕组 件402,并立即放弃消息;和
2. 完成消息组件404开发(全部或部分),和直接地或通过后续向导 604调用后续编辑器/阅读器600, 602。
示例元素301
以下是可展开应用105 jar文件的示例元素301,可展开应用105 jar 文件是工具116为了作为数据源106的示例的气象Web Services生成的。
Weather, mapping
下面定义由应用网关AG用于将经过网络10的应用程序消息传送与用 WSDL定义的Web ServicesSOAP消息联系在一起的示例映射302。 < xml version="l .0" encoding= "ASCII " >
<def initions xmlns= "http : 〃schemas .xmlsoap . org/wsdl/ " xmlns : http= "http: / /schemas . xmlsoap . org/wsdl/http/ " xmlns : map="http: 〃com.rim,wica/mapping.xsd" xmlns :mime="http: 〃schemas .xmlsoap.org/wsdl/mime/ " xmlns : s= "http: 〃www,w3.org/2001/XMLSchema" xmlns : s="http: 〃www. serviceobjects.com/" xmlns : soap= "http : / /schemas . xmlsoap . org/wsdl/soap/ " xmlns : soapenc="http: 〃schemas .xmlsoap. org/soap/encoding/" xmlns : tm="http: 〃microsoft . com/wsdl/mime/textMatching/ " targetNamespace-"http : 〃www. serviceobjects . com/ " > <documentation><map: application>
<map:component map :mapName= " s0 :GetWeatherByZipSoapIn" map :mapType= "message" map :name= " outGetWeatherByZipSoapIn" map : S6cure= " false" >
<map: field map :mapName="parameters" map :mapType="part" map :name="parameters" />
</map : component)
<map : component map :mapName= " s0 :GetWeatherByZip" map :mapType= " element" map : name= "GetWeatherByZip" >
<map: field map:mapName="sO : PostalCode" map :mapType="
dsmsnt"
map:name="PostalCode" />
<map: field map :mapName= " s0 :LicenseKey" map :mapType="
map:name="LicenseKey" /> </map : componsnt>
<map : component map :mapName="sO: GetWeatherByZip SoapOut" map : mapType= "message" map :name= " inGetWeatherByZipSoapOut" map : sscurs= " falss" >
<map: field map :mapName="parameters" map :mapType= "part"
map : name= "parameters " /> </map: components
<map : component map:mapName="sO:GetWeatherByZipResponse" map : mapType= "element" map : name= "GetWeatherByZipResponse" >
<map: field map:mapName="sO:GetWeatherByZipResult" map : mapType= "element" map : name= "GetWeatherByZipResult" />
</map : component〉
<map:componentmap:mapName="sO :Weather' map:mapType="complexType" map : name= "Weather" >
<map:field map :mapName= " sO : Error" map :mapType='
element"
map: name="Eiror" />
<map: field map:mapName="sO:LastUpdated" map :mapType='
element"
map: name="LastUpdated" />
<map : field map :mapName= " sO : TemperatureF' map :mapType= " dement" map : name= "TemperatureF" />
<map:field map:mapName="sO:Windchill" map :mapType='
element"
map :name= "Windchill " />
<map: field map:mapName="sO :HeatIndex" map :mapType='
element"
map: name="HeatIndex" />
<map: field map :mapName= "sO : Humidity" map :mapType='
dement"
map : name= "Humidity" />
<map: field map:mapName="sO :Dewpoint'
map :mapT[gamma]pe=" element"
map:name="Dewpoint" />
<map:field map :mapName="sO:Wind" map :mapType-" element' map : name= "Wind" />
<map: field map :mapName= "sO : Pressure" map :mapType=
element"
map :name='' Pressure" />
<map: field map :mapName= "sO : Conditions" map :mapType='
element"
map :name="Conditions" />
<map:field map :mapName="sO:Visibility" map :mapType='
element"
map :name= "Visibility" />
<map: field map :mapName= "sO : Sunrise" map :mapType='
element"
map :name=" Sunrise" />
<map:field map :mapName= "sO : Sunset" map :mapType='
element"
map :name=" Sunset" />
<map: field map :mapName= "sO : City" map :mapType='
dsmsnt"
map :name="City" />
<map: field map :mapName= "sO : State" map :mapType=,
dsmcnt"
map :name=" State" />
<map: field map:mapName="sO :Moonrise" map :mapType='
element"
map:name="Moonrise" />
<map: field map:mapName="sO :Moonset'
map :mapType="element" map :name="Moonset" />
<map: field map:mapName="sO : Precipitation' map :mapType="element" map :name=" Precipitation" />
<map: field map :mapName= "sO : Country" map :mapType='
element"
map :name= "Country" />
</map : component>
<map : component map :mapName= "sO : Err" map :mapType=' complexType" map : name= " Err" >
<map:field map:mapName="sO :Desc" map :mapType=" element" map : name= "Dssc " />
<map: field map :mapName= " sO :Number" map :mapType='
element"
map : name= "Number" />
<map: field map:mapName="sO:Location" map :mapType='
dement"
map :name="Location7>
</map : components
<map: component map:mapName= '
sO : Get WeatherByCity StateSoap In" map :mapType= "message' map:name="outGetWeatherByCityStateSoapIn" map: secure=" false">
<map: field map :mapName="parameters" map :mapType="part' map :name="parameters" />
</map : component>
<map : component map :mapName= "sO :GetWeatherByCityState" map : mapType- "element" map : name= "GetWeatherByCityState" >
<map: field map:mapName="sO :City" map':mapType-" element" map :name= "City" />
<map:field map:mapName="sO :State" map :mapType=" element" map :name=M State" />
<map: field map:mapName="sO :LicenseKey" map :mapType="
element"
map: name="LicenseKey" /> </map : components
<map : component map :mapName= "sO : GetWeatherByCityStateSoapOut"
map : mapType= "message" map :name= " inGetWeatherByCityStateSoapOut ,i
map: secure=" false"〉
<map: field map :mapName= "parameters" map :mapType="part" map :name="parameters" /> </map : component>
<map : component map :mapName= "sO : GetWeatherByCityStateResponse"
map :mapType= "element" map :name= "GetWeatherByCityStateResponse"〉 <map: field map:mapName="sO :GetWeatherByCityStateResult" map :mapType=" element" map:name="GetWeatherByCityStateResult" /> </map : compon6nt>
<map : component map :mapName= " sO : GetWeatherByIPSoapIn" map :mapType="message" map:name="outGetWeatherByIPSoapIn" map :secure=" false" >
<map: field map :mapName="parameters" map :mapType="part" map : name= "parameters " />
</map : components
<map: componentmap:mapName="sO :GetWeatherByIP" map :mapType-" element" map:name="GetWeatherByIP">
<map:field map:mapName="sO: IPAddress" map :mapType=" element" map : name= " IPAddress " />
<map: field map:mapName="sO :LicenseKey" map :mapType=" element" map :name="LicenseKey" /> </map: component>
<map : component map :mapName=" s0: GetWeatherByIPSoapOut"
map : mapType- "message" map : name= " inGetWeatherByIPSoapOut" map : secure= " false" >
<map: field map :mapName="parameters" map :mapType= "part" map :name= "parameters" /> </map : components
<map: component map:mapName="sO :GetWeatherByIPResponse" map :mapType= " element" map : name= "GetWeatherBylPResponse" >
<map:fieldmap:mapName="sO :GetWeatherByIPResult" map:mapType=" element" map : name= "GetWeatherByIPResult" />
</map : component)
<map : component map :mapName= " sO : GetWeatherHistoricalByZipSoapIn" map :mapType= "message" map:name="outGetWeatherHistoricalByZipSoapIn" map: secure=" false"〉
<map: field map :mapName= "parameters" map :mapType= "part
ii
map :name="parameters7〉 </map : components
<map : component
map:mapName="sO:GetWeatherHistoricalByZip" map : mapType= " element" map : name= "GetWeatherHistoricalByZip" >
<map: field map:mapName="sO :PostalCode" map :mapType="
element"
map:name="PostalCode"/>
<map: field map :mapName="sO: Date" map :mapType=" element" map :name="Date" />
<map: field map :mapName- "s0 : Time" map :mapType="
element"
map :name="Time" />
<map: field map:mapName="sO:LicenseKey" map :mapType=" element" map:name="LicenseKey" /> </map : com[rho]onent>
<map : component map :mapName= " s0 : GetWeatherHistoricalByZipSoapOut"
map : mapType= "message" map:name="
inGetWeatherHistoricalByZipSoapOut" map : secure=" false" >
<map: field map :mapName="parameters" map :mapType= "part" map : name= "parameters " /> </map : component〉
<map : componsnt
map:mapName="sO :GetWeatherHistoricalByZipResponse" map :mapType=" element" map :name= "GetWeatherHistoricalByZipResponse" >
<map : field map :mapName= "
sO:GetWeatherHistoricalByZipResult"map:mapType=" element" map:name="GetWeatherHistoricalByZipResult" /> </map : component〉
<map : component map :mapName= " sO : GetWeatherByWMOIDSoapIn" map :mapType= "message" map : name=" outGetWeatherByWMOIDSoapIn" map: secure=" false"〉
<map: field map :mapName="parameters" map :mapType="part" map: name= "parameters" /〉</map : components
<map : component map :mapName= " sO : GetWeatherByWMOID" map :mapType= "element" map :name= "GetWeatherByWMOID" >
<map: field map :mapName= " sO :WMOID" map :mapType=" element" map :name="WMOID" />
<map: field map:mapName="sO:LicenseKey" map :mapType=" element" map :name="LicenseKey" /> </map : component>
<map : component map :mapName= " sO : GetWeatherByWMOIDSoapOut " map :mapType= "message" map:name=" inGetWeatherByWMOIDSoapOut" map :secure=" false" >
<map: field map :mapName="parameters" map :mapType="part" map : name= "parameters " />
</map : components
<map: component map:mapName="sO :GetWeatherByWMOIDResponse" map :mapType=" element" map : name= "GetWeatherByWMOIDResponse"〉
<map: field map:mapName="sO :GetWeatherByWMOIDResult" map : mapType= " element" map : name= "GetWeatherByWMOIDResult" />
</map : component)
<map: component map:mapName="sO :GetWMOIDByCitySoapIn" map :mapType="message" map:name="outGetWMOIDByCitySoapIn" map :secure=" false"〉
<map: field map :mapName= "parameters" map :mapType= "part" map : name= "parameters " />
</map: components
<map: component map:mapName="sO :GetWMOIDByCity" map :mapType=" element" map:name="GetWMOIDByCity">
<map: field map:mapName="sO :City" map :mapType=" element"
map :name="City" />
<map: field map :mapName= " sO :LicenseKey" map :mapType= element" map :name="LicenseKey" /> </map : components
<map : component map :mapName= " sO GetWMOIDByCitySoapOut" map :mapType= "message" map : name=' inGetWMOIDByCitySoapOut" map : secure= " false" >
<map: field map :mapName="parameters" map :mapType= "part' map : name= "parameters " />
</map : components
<map : component map:mapName="sO :GetWMOIDByCityResponse' map :mapType= " element" map:name="GetWMOIDByCityResponse" >
<map: field map:mapName="sO : GetWMOIDByCityResult' map :mapType=" element' map : name= "GetWMOIDByCityResult" />
</map : component〉
<map: component map:mapName="sO :WMOIDInfo' map:mapType="complexType" map : name= "WMOIDInfo" >
<map: field map:mapName="sO :WMOIDItern" map :mapType=' element" map : name= "WMOIDItern" />
<map: field map:mapName="sO :Error" map :mapType=' element" map : name= " Error" /> </map : compon6nt〉
<map : component map :mapName- " sO :WMOID' map:mapType="complexType" map : name= "WMOID" >
<map: field map:mapName="sO :City" map :mapType=" element' map:name= "City" />
<map:field map :mapName= " sO : Region" map :mapType=, element" map: name="Region"/>
<map: field map :mapName= " sO : Country" map :mapType='dement" map :name="Gountry" />
<map:field map :mapName="s0:WMOID" map :mapType=" element" map :name= "WMOID" /> </map : component>
<map :portType map : name= " sO : DOTSFastWeatherSoap"> <map: operation map:name="GetWeatherByZip"〉 <map : input map : component^ " outGetWeatherByZipSoapIn" /> <map : output map : component= " inGetWeatherByZipSoapOut"
/>
</map: operation>
<map : operation map : name= "GetWeatherByCityState"〉
<map: input map:component="outGetWeatherByCityStateSoapIn"/>
<map: output map: component="
inGetWeatherByCityStateSoapOut"/> </map : operation>
<map : operation map :name= "GetWeatherByIP" >
<map : input map : component- "outGetWeatherByIPSoapIn" /> <map: output map:component="inGetWeatherByIPSoapOut"/>
</map : operation>
<map : operation map : name= "GetWeatherHistoricalByZip" >
<map : input map : component^ " outGetWeatherHistoricalByZipSoapIn" />
<map: output map: component= "
inGetWeatherHistoricalByZipSoapOut" /> </map:operation>
<map : operation map : name= "GetWeatherByWMOID" >
<map : input map :
component="outGetWeatherByWMOIDSoapIn" />
<map : outputmap : component-"
inGetWeatherByWMOIDSoapOut" /> </map: operation>
<map: operation map:name="GetWMOIDByCity">
<map : input map : component- " outGetWMOIDByCitySoapIn"
/>
<map : output map : component= " inGetWMOIDByCitySoapOut
"/>
</map : operation〉 </map : portType> </map:applicationx/documentation> <types>
<s : schema elementFormDefault="gualified" targetNamespace= "http : / /www. serviceobj ects . com/ "〉 <s :element name="GetWeatherByZip"> <s : complexType> <s : S6qusnc6〉
<s: element minoccurs="0" maxoccurs="l" name="PostalCode" type="s: string" />
<s: element minoccurs="0" maxoccurs="r name="LicenseKey" type="s : string" />
</s : ssqu6nc6> </s : complexType> </s : d6ment>
<s : element name="GetWeatherByZipResponse"> <s : complexType> <s : sequence>
<s: element minoccurs="0" maxoccurs="l''
name="GetWeatherByZipResult" type="s0 :Weather" /> </s : sequence〉
</s : complexType> </s :element〉
<s : complexType name= "Weather" > <s : S6qu6ncs>
<s: element minoccurs="0" maxoccurs="l" name="Error" type="s0 :Err" />
<s: element minoccurs="0" maxoccurs= "1" name="LastUpdated" type= " s : string" />
<s: element minoccurs="0" maxoccurs='T' name= "TemperatureF" type="s : string" />
<s: element minoccurs="0" maxoccurs='T, name="Windchill" type="s: string" /〉
<s: element minoccurs="0" maxoccurs='T' name="HeatIndex" type=" s : string" /〉
<s: element minoccurs="0" maxoccurs="l" name="Humidity" type="s : string" />
<s : element minoccurs="0" maxoccurs="l" name="Dewpoint" type="s : string" />
<s : element minoccurs="0" maxoccurs='T' name="Wind" type=" s: string" />
<s : element minoccurs="0" maxoccurs="l" name=" Pressure" type=" s : string" />
<s: element minoccurs="0" maxoccurs='T' name= "Conditions" type=" s : string" />
<s: element minoccurs="0" maxoccurs=T' name= "Visibility" type="s : string" /〉
<s: element minoccurs="0" maxoccurs="l" name=" Sunrise" type= " s : string" />
<s: element minoccurs="0" maxoccurs="l" name= " Sunset " type="s :
string" string" string" string" string"
/>
〈s:element minoccurs="0" maxoccurs='T' name="City" type="s :
/〉
element minoccurs="0" maxoccurs="l" name=" State" type="s :
<s /> <s
/>
<s
/>
<s
element minoccurs="0" maxoccurs="l" name="Moonrise" type="s element minoccurs="0" maxoccurs-"l" name="Moonset" type="s
element minoccurs="0" maxoccurs='T, name=" Precipitation" type="s : string" />
<s : element minoccurs="0" maxoccurs="l" name="Country" type="s : string" />
</s:sequence> </s : complexType> <s : complexType name="E;rr''> <s : S6qu6ncs〉
〈s:element minoccurs="0" maxoccurs="r name="Desc" type=" s: string" /〉
<s: element minoccurs="0" maxoccurs="l" name= "Number" type= " s : string" />
<s: element minoccurs="0" maxoccurs-"l" name= "Location" type="s : string" />
</s : S6qusnc6> </s :complexType>
<s : element name= "GetWeatherByCityState" > <s : complexType> <s:sequence〉
<s: element minoccurs="0" maxoccurs="l" name="City" type="s : string" />
<s: element minoccurs="0" maxoccurs='T' name=" State" type="s :
string" />
<s: element minoccurs="0" maxoccurs="r name="LicenseKey" type="s : string" />
</s : ssqusnc6〉 </s : complexType> </s : d6mcnt>
<s : element name="GetWeatherByCityStateResponse"> <s : complexType> <s:sequence>
<s: element minoccurs="0" maxoccurs='T,
name="GetWeatherByCityStateResult" type="sO:Weather'V> </s : S6qu6nc6> </s : complexType> </s:element>
<s: element name=" Get WeatherByIP"> <s : complexType> <s:ssquence〉
<s: element minoccurs="0" maxoccurs=" 1" name="IPAddress" type="s : string" />
<s: element minoccurs="0" maxoccurs="l" name="LicenseKey" type= " s : string" />
</s:sequenc6> </s : complexType> </s:element>
<s : element name="GetWeatherByIPResponse"> <s : complexType> <s:sequence〉
<s: element minoccurs=''0" maxoccurs='T'
name="GetWeatherByIPResult" type="s0 :Weather"/> </s : S6qu6ncs〉 </s : complexType> </s :element>
<s : element name="GetWeatherHistoricalByZip"> <s : complexType> <s:seguencs>
<s: element minoccurs="0" maxoccurs='T, name="PostalCode" type= " s : string" />
<s:element minoccurs="0" maxoccurs="l" name="Date" type="s : string" />
〈s:element minoccurs="0" maxoccurs='T' name="Time" type=
"s : string" />
<s: element minoccurs="0" maxoccurs-"l" name="LicenseKey" type= " s : string" />
</s:sequence> </s : complexType〉 </s clsm6nt〉
<s : element name="GetWeatherHistoricalByZipResponse"> <s : complexType〉 <s:ssqusnc6>
<s: element minoccurs=''0" maxoccurs="r
nameJ'GetWeatherHistorica旧yZipResult" type="s0 :Weather'7> </s : sequence〉 </s : complexType> </s:element>
<s : element name="GetWeatherByWMOID"> <s : complexTyp6>
<s : ssqu6nc6〉
<s: element minoccurs="0" maxoccurs='T' name= "WMOID" type="s : string" />
<s: element minoccurs="0" maxoccurs='T' name="LicenseKey" type= " s : string" />
</s : sequence〉 </s : complexType> </s:element>
<s : element name="GetWeatherByWMOIDResponse"> <s : complexType> <s : s叫uence〉
<s: dement minoccurs="0" maxoccurs="l"
name="GetWeatherByWMOIDResult" type="sO :Weather7〉 </s : ssqu6ncs> </s : complexType〉 </s:element>
<s: element name="GetWMOIDByCity"> <s :complexType> <s : ssqusnc6〉
<s: element minoccurs=" 0" maxoccurs-'T' name="City" type=
"s : string" />
<s: element minoccurs="0" maxoccurs="l" name="LicenseKey" type=" s : string" />
</s : ssqu6ncs> </s : complexType> </s :element>
<s : element name="GetWMOIDByCityResponse"> <s : complexType> <s : s叫u6nc6〉 <s: dement minoccurs="0" maxoccurs=" 1" name="GetWMOIDByCityResult" type= " sO :WMOIDInfo" /> </s : S6qusnc6> </ s: complexType> </s : dement>
<s : complexType name="WMOIDInfo"> <s:ssqu6nc6〉
<s: element minOccurs="0" maxoccurs="unbounded" name="WMOIDItem" type= "sO:WMOID7>
<s:element minoccurs="0" maxoccurs='T' name="Error" type="sO:Err"/>
</s : sequence〉 </s : complexType> <s : complexType name= "WMOID" > <s :sequencs〉
<s: element minOccurs-"O" maxoccurs='T, name="City" type="s :
string" />
<s:element minoccurs="0" maxoccurs="l" name="Region" type="s :
string" />
<s: element minoccurs=" 0" maxoccurs='T' name="C!ountry'' type="s : string" />
<s: dement minoccurs="0" maxoccurs='T' name= "WMOID" type="s : string" />
</s : sequence〉 </s : complexType>
〈s:element name="Weather" nillable="true" type="s0 :Weather"/> <s:element name="WMOIDInfo" nillable="true"
type="s0:WMOIDInfo"/> </s : schema></types>
<message name= "GetWeatherByZipSoapIn" >
<part element="sO :GetWeatherByZip" name= "parameters "/> </message>
<message name="GetWeatherByZipSoapOut" >
<part element="sO :GetWeatherByZipResponse" name= "parameters" /> </message>
<message name="GetWeatherByCityStateSoapIn">
<part element="sO :GetWeatherByCityState" name="parameters"/> </message>
〈message name= "GetWeatherByCityStateSoapOut" >
<part element="sO :GetWeatherByCityStateResponse" name= "parameters" /> </message>
<message name= "GetWeatherByIPSoapIn" >
<part element="sO :GetWeatherByIP" name= "parameters "/> </msssags>
<message name="GetWeatherByIPSoapOut">
<part element="sO:GetWeatherByIPResponse" name= "parameters "/> </:message>
<message name="GetWeatherHistoricalByZipSoapIn">
<part element="sO :GetWeatherHistoricalByZip" name= "parameters" /> </message>
<message name="GetfWeatherHistoricalByZipSoapOut">
<part element-" s[theta] :GetWeatherHistoricalByZipResponse" name="parameters" /> </m6ssags>
<message name= "GetWeatherByWMOIDSoapIn" >
<part element="sO :GetWeatherByWMOID" name= "parameters "/>
</msssagc>
〈message name= "GetWeatherByWMOIDSoapOut" >
<part element="sO :GetWeatherByWMOIDResponse
name="parameters" /> </msssag6>
〈message name="GetWMOIDByCitySoapIn">
<part element="sO :GetWMOIDByCity" name= "parameters 7> </m6ssage>
<message name= "GetWMOIDByCitySoapOut" >
<part element="sO :GetWMOIDByCityResponse" name="parameters"/> </message>
〈message name="GetWeatherByZipHttpGetIn">
<part name="PostalCode" type="s: string" />
<part name="LicenseKey" type="s : string" /> </message>
〈message name= "GetWeatherByZipHttpGetOut" >
<part element="sO :Weather" name="Body" /> </message>
<message name="GetWeatherByCityStateHttpGetIn">
<part name="City" type="s : string" />
<part name=" State" type="s: string" />
<part name="LicenseKey" type=" s: string" /> </message>
〈message name="GetWeatherByCityStateHttpGetOut">
<part element="sO :Weather" name="Body"/> </message>
〈message name="GetWeatherByIPHttpGetIn"> <part name="IPAddress" type="s : string" /> <part name="LicenseKey" type="s : string" /> </msssagc>
〈message name= "GetWeatherBylPHttpGetOut" >
<part element="sO :Weather" name="Body" /> </msssag6>
〈message name="GetWeatherHistoricalByZipHttpGetIn"> <part name="PostalCode" type="s: string" /> <part name="Date" type="s : string" /> <part name="Time" type="s : string" /> <part name="LicenseKey" type="s: string" />
</messagc>
<message name="GetWeatherHistoricalByZipHttpGetOut">
<part element="sO:Weather" name="Body" /> </message>
〈message name="GetWeatherByWMOIDHttpGetIn"> <part name= "WMOID" type=" s: string" /> <part name="LicenseKey" type="s : string" />
</message>
〈message name="GetWeatherByWMOIDHttpGetOut"> <part element="sO :Weather" name="Body'7>
</m6SS3g6>
<message name="GetWMOIDByCityHttpGetIn"> <part name="City" type="s: string" /> <part name="LicenseKey" type="s : string" />
</message>
<message name= "GetWMOIDByCityHttpGetOut" > <part element="sO :WMOIDInfo" name="Body"/> </message>
〈message name="GetWeatherByZipHttpPostIn"> <part name="PostalCode" type="s : string" />
<part name="LicenseKey" type="s : string" /> </m6SS3gs>
<message name= "GetWeatherByZipHttpPostOut" >
<part element="sO:Weather" name="Body" /> </message>
〈message name="GetWeatherByCityStateHttpPostIn"> <part name="City" type="s : string" /> <part name=" State" type="s : string" /> <part name="LicenseKey" type="s : string" /> </message>
〈message name= "GetWeatherByCityStateHttpPostOut " >
<part element="sO :Weather" name="Body"/> </message〉
〈message name="GetWeatherByIPHttpPostIn"> <part name="IPAddress" type="s: string" /> <part name="LicenseKey" type="s: string" />
</message>
<message name="GetWeatherByIPHttpPostOut"> <part element="sO :Weather" name="Body" /> </message>
<message name="GetWeatherHistoricalByZipHttpPostIn"> <part name="PostalCode" type="s : string" /> <part name="Date" type="s : string" /> <part name= "Time" type="s: string" /> <part name="LicenseKey" type="s: string" />
</m6SS3g6〉
<message name="GetWeatherHistoricalByZipHttpPostOut" >
<part element="sO :Weather" name="Body"/> </message> <message name="GetWeatherByWMOIDHttpPostIn">
<part name= "WMOID" type="s : string" />
<part name="LicenseKey" type="s : string" /> </message>
〈message name="GetWeatherByWMOIDHttpPostOut">
<part element="s[theta]:Weather" name="Body"/> </msss3gs>
〈message name="GetWMOIDByCityHttpPostIn">
<part name="City" type="s : string" />
<part name="LicenseKey" type="s : string" /> </message>
〈message name= "GetWMOIDByCityHttpPostOut" >
<part element="sO :WMOIDInfo" name="Body"/> </message>
<portType name="DOTSFastWeatherSoap"> <operation name="GetWeatherByZip">
<documentation>Returns the weather for a given US postal code. </documentation>
<input message="sO :GetWeatherByZipSoapIn" /> <output message="sO :GetWeatherByZipSoapOut7> </operation>
<operation name="GetWeatherByCityState">
<documentation>Returns the weather for a given US city and state. </documentation>
<input message="sO :GetWeatherByCityStateSoapIn7> <output message="sO :GetWeatherByCityStateSoapOut" />
</operation>
<operation name="GetWeatherByIP">
<documentation>Returns the weather for a given IP Address .
</documentation>
<input message="sO:GetWeatherByIPSoapIn" /> <output message="sO :GetWeatherByIPSoapOut" /> </operation>
<operation name="GetWeatherHistoricalByZip">
<documentation>Returns historical weather information for a given US postal code, date, and time.</documentation>
<input message= "sO : GetWeatherHistoricalByZipSoapIn" /> 〈output message= "sO : GetWeatherHistoricalByZipSoapOut" />
</operation>
<operation name= "GetWeatherByWMOID" >
<documentation>Returns the weather for a given WMOID. Also see the GetWMOIDByCity method. </documentation>
<input message="sO :GetWeatherByWMOIDSoapIn"/> <output message="sO : GetWeatherByWMOIDSoapOut" /〉
</operation>
<operation name="GetWMOIDByCity" >
<documentation>Returns the WMOIDs for a partial city match. </documentation>
<input message="sO :GetWMOIDByCitySoapIn" /> 〈output message= "sO :GetWMOIDByCitySoapOut" /> </operation〉 </portType>
〈portType name= "DOTSFastWeatherHttpGet" > <operation name="GetWeatherByZip">
<documentation>Retums the weather for a given US postal code. </documentation.>
<input message="sO :GetWeatherByZipHttpGetIn" /> 〈output message="sO : GetWeatherByZipHttpGetOut" /></operation>
<operation name= "GetWeatherByCityState" >
<documentation>Returns the weather for a given US city and state. </documentation>
<inputmessage="sO: Get WeatherByCity StateHttpGetIn7> 〈output message="sO :GetWeatherByCityStateHttpGetOut"/>
</operation>
<operation name="GetWeatherByIP">
<documentation>Returns the weather for a given IP Address . </documentation>
<input message="sO:GetWeatherByIPHttpGetIn" /> <output message="s0:GetWeatherByIPHttpGetOut" /> </operation>
<operation name="GetWeatherHistoricalByZip">
<documentation>Returns historical weather information for a given US postal code, date, and time.</documentation>
<input message="sO :GetWeatherHistoricalByZipHttpGetln" /> 〈output message="s0:GetWeatherHistoricaffiyZipHttpGetOut"/>
</operation>
<operation name="GetWeatherByWMOID"〉
<documentation>Returns the weather for a given WMOID. Also see the Get WMOIDBy City method. </documentation>
〈i叩ut message="s0:GetWeatherByWMOIDHttpGetIn'V> <output message-"sO :GetWeatherByWMOIDHttpGetOut" />
</operation>
Operation name="GetWMOIDByCity" >
<documentation〉Returns the WMOIDs for a partial city match . </documentation>
<input message= "sO : GetWMOIDByCityHttpGetln" />
<output message="sO :GetWM0IDByCityHttpGet0ut7〉 </operation> </portType>
〈portType name="DOTSFastWeatherHttpPost"> <operation name="GetWeatherByZip">
<documentation>Returns the weather for a given US postal code. </documentation>
<input message="sO :GetWeatherByZipHttpPostIn" /> 〈output message="sO :GetWeatherByZipHttpPostOut" /> </operation>
<operation name="GetWeatherB [gamma]CityState"〉
<documentation>Returns the weather for a given US city and state. </documentation>
〈input message="sO :GetWeatherByCityStateHttpPostIn" /> 〈output message="sO :GetWeatherByCityStateHttpPostOut" />
</operation>
<operation name="GetWeatherByIP">
<documentation>Returns the weather for a given IP Address . </documentation>
〈input message- "sO : GetWeatherBylPHttpPostln" /> <output message="sO : GetWeatherBylPHttpPostOut" />
</operation〉
<operation name="GetWeatherHistoricalByZip">
<documentation>Returns historical weather information for a given US postal code, date, and time. </documentation
<input message="sO :GetWeatherHistoricalByZipHttpPostIn" /> <output
message="sO :GetWeatherHistoricalByZipHttpPostOut7> </operation>
<operation name= "GetWeatherByWMOID" >
<documentation>Returns the weather for a given WMOID. Also see the GetWMOIDByCity method. </documentation>
<inputmessage="s0:GetWeatherByWMOIDHttpPostIn7> 〈output message- "sO : GetWeatherByWMOIDHttpPostOut "
/>
</operation>
〈operation name="GetWMOIDByCity" >
<documentation>Returns the WMOIDs for a partial city match. </documentation>
〈input message="s0:GetWMOIDByCityHttpPostIn" /> 〈output message="sO : GetWMOIDByCityHttpPostOut" /> </operation〉 </portType>
<binding name="DOTSFastWeatherSoap" type="s0 :DOTSFastWeatherSoap"〉
<soap: binding transport="http: 〃schemas ,xmlsoap.org/soap/http" style="document" />
<operation name="GetWeatherByZip">
<soap : operation soapAction="http: 〃www. serviceobjects.com/GetWeatherByZip" style="document" /> <input>
<soap:body use=" literal 7> </input> <output>
〈soap:body use= " literal 7> </output> </operation>
<operation name="GetWeatherByCityState" >
<soap : operation soapAction="http: 〃www. serviceobjects.com/GetWeatherByCityState" style=" document" /> <input>
<soap:body use- " literal 7> </input> <output>
<soap:body use= " literal "/> </output> </operation>
<operation name= "GetWeatherByIP" >
<soap : operation soapAction= "http : / /www. serviceobj ects . com/GetWeatherBylP" style= "document" /> <input>
<soap:body use= " literal 7> </input> <output〉
<soap:body use="literal7> </output> </operation>
<operation name="GetWeatherHistoricalByZip">
<soap : operation soapAction-"http: 〃www. serviceobjects . com/GetWeatherHistoricalByZip" style=" document" /> <input>
〈soap:body use="literal" /> </input> <output>
<soap:body use= " literal 7> </output> </opcration>
<operation name="GetWeatherByWMOID">
<soap : operation soapAction= "http : 〃www . serviceobj ects . com/GetWeatherByWMOID" style="document" /> <input>
<soap:body use=" literal" /> </input> <output>
<soap:body use=" literal 7> </output> </operation>
〈operation name="GetWMOIDByCity">
<soap : operation soap Action= "http: 〃www. serviceobjects ,com/GetWMOIDByCity" style="document" /> <input>
〈soap:body use=" literal "/> </input> <output>
〈soap:body use= " literal 7> </output> </operation> </binding>
<binding name- "DOTSFastWeatherHttpGet" type- " s0 : DOTSFastWeatherHttpGet ">
〈http:binding verb="GET7> <operation name="GetWeatherByZip">
<http: operation location=" /GetWeatherByZip" /> <input>
<http : urlEncoded/> </input>
<output>
<mime :mimeXml part="Body" /> </output> </operation>
<operation name="GetWeatherByCityState">
<http: operation location='7GetWeatherByCityState"/> <input>
<http : urlEncoded/〉 </input> <output>
<mime :mimeXml part="Body" /> </output> </operation>
<operation name="GetWeatherByIP">
<http : operation location- " /GetWeatherByIP" /〉 <input>
<http :urlEncoded/> </input> <output>
<mime :mimeXml part="Body" /> </output> </operation>
<operation name="GetWeatherHistoricalByZip">
<http: operation location=7GetWeatherHistoricalByZip" /> <input>
<http :urlEncoded/> </input〉 <output>
<mime :mimeXml part="Body'7></output> </operation>
〈operation name="GetWeatherByWMOID">
<http: operation location-" /GetWeatherByWM0ID7> <input>
<http : urlEncoded/> </input> <output>
<mime :mimeXml part="Body"/> </output> </operation>
〈operation name="GetWMOIDByCity">
<http : operation location- " /GetWMOIDByCity" /> <input>
<http : urlEncoded/> </input> <output>
<mime :mimeXml part="Body"/> </output> </operation> </binding>
<binding name="DOTSFastWeatherHttpPost" type=" sO :DOTSFastWeatherHttpPost">
<http: binding verb="POST" /> <operation name= "GetWeatherByZip" >
<http: operation location-" /GetWeatherByZip" /> <input〉
<mime: content type="application/x-www-form-urlencoded"/> </input> <output>
<mime :mimeXml part="Body" /> </output> </operation>
<operation name="GefWeatherByCityState">
<http : operation location- " /GetWeatherByCityState" /> <input>
<mime: content type="application/x-www-form-urlencoded'
</input> <output>
<mime :mimeXml part="Body"/> </output> </operation>
<operation name="GetWeatherByIP">
〈http: operation location=7GetWeatherByIP" /> <input>
<mime: content type-"application/x-www響form-urlencoded'
</input> <output>
<mime :mimeXml part="Body" /> </output> </operation>
<operation name="GetWeatherHistoricalByZip">
<http: operation location-" /GetWeatherHistoricalByZip"/> <input>
<mime: content type="application/x-www-form-urlencoded'
</input> <output>
<mime :mimeXml part="Body"/> </output> </operation>
Operation name= "GetWeatherByWMOID">
<http : operation location=" /GetWeatherByWMOID" /> <input>
<mime : content type=
application/x-www-form-urlencoded" /> </input> <output>
<mime :mimeXml part="Body"/> </output> </operation>
〈operation name="GetWMOIDByCity">
<http : operation location: " /GetWMOIDByCity" /> <input>
<mime : content type="application/x-www-form-urlencoded"
>
</input> <output>
<mime :mimeXml part="Body'V> </output> </operation> </binding>
<service name="DOTSFast>^eather">
<documentation>For more information on our web services, visit
us at <a href= 'http: 〃www. serviceobjects.com/products/default .asp' targets 'new' >our website< /a><br/><br/><a href= 'http: 〃www. serviceobjects . com' target= 'new' >< img src= 'http: 〃www. serviceobjects. com/images/so—logo—2—inside.gif' border= ' 0 ' />< /a></documentation>
<port binding="sO :DOTSFastWeatherSoap"
name="DOTSFastWeatherSoap"〉
<soap: address location="http: 〃ws2. serviceobjects . net/fw/FastWeather ,asmx" />
</port>
<port binding-"sO :DOTSFastWeatherHttpGet"
name="DOTSFastWeatherHttpGet">
<http: address location-"http: 〃ws2. serviceobjects . net/fw/FastWeather .asmx" />
</port>
<port binding- " sO : DOTSFastWeatherHttpPost " name="DOTSFastWeatherHttpPost" >
<http : address location: "http : / /ws2. serviceobj ects . net/fw/FastWeather . asmx" /> </port> </service> </defmitions>
Weather, xml
以下定义用于(准备提供给装置100的)可展开应用105 jar文件中 的内含的示例XML定义300 (例如,表示组件400,402,404)。 < xml version="l .0" encoding="iso-8859-l" >
< !DOCTYPE application (View Source for fUll doctype...)> —<application uri="myhitechcomp. superdep. finejob/Fast Weather" name="Fast Weather"size="16.12.15.2200"entry="scr_Main" vendor="Research In Motion" version="l .1.0" persistence: messageDeliver[gamma]=" standard" >
<globalname=" gv—Get WeatherByZipRes [rho] onse"
componcnt=
〈global component=
〈global compon6nt=
<global component:
〈global component=
<global compon6nt=
〈global component:
〈global component:
<global component:
〈global component:
〈global component:
<global component:
"performant" type="data" type="data" type="data" type="data" type="data"
"GetWeatherByZipResponse" array=" false" />
name-" gv—Get WeatherByZip" "GetWeatherByZip" array=" false" />
name="gv_GetWeatherByCityStateResponse" "GetWeatherByCityStateResponse" arrays" false" />
name="gv—GetWeatherByCityState" "GetWeatherByCityState" array=" false" />
name="gv—GetWeatherByIPResponse" "GetWeatherByIPResponse" array=" false" />
name=" gv—Get WeatherByIP'' ty [rho] e=" data"
"GetWeatherByIP" array=" false" />
name="gv—GetWeatherHistoricalByZipResponse" type="data" "GetWeatherHistoricalByZipResponse" arrays" false" />
name="gv—GetWeatherHistoricalByZip" "GetWeatherHistorica旧yZip" array=" false" />
name="gv—GetWeatherByWMOIDResponse" "GetWeatherByWMOIDResponse" array=" false" />
name="gv—GetWeatherByWMOID" "GetWeatherBy観OID" arrays" false" />
name="gv—GetWMOIDByCityResponse" "GetWMOIDByCityResponse" array="false" />
name="gv_GetWMOIDByCity" "GetWMOIDByCity" arrays" false" /> <data name="GetWeatherByZip" persist-" false" key=""> <field name="PostalCode" type=" string" array-" false" /> <field name="LicenseKey" type="string" array="false" />
type="data" type="data" type="data" type="data" type="data"</data〉
-<data name="GetWeatherByZipResponse" persist="false" key=""〉 <field name="GetWeatherByZipResult" type="data" component- "Weather'
array=" false" /> </data>
-<data name= "Weather" persist="false" key=""> <field name=" Error" type="data" component="Err" array=" false" /> <field name="LastUpdated" type="string" array="false" /〉 <field name="TemperatureF" type=" string" array=" false" /> <field name="Windchill" type=" string" array=" false" /> <field name="HeatIndex" type="string" array="false" /> <field name= "Humidity" type="string" array=" false" /> <field name="Dewpoint" type=" string" array=" false" /> 〈field name="Wind" type=" string" array=" false" /> <field name=" Pressure" type=" string" array=" false" /> <field name= "Conditions" type="string" array="false" /> <field name="Visibility" type=" string" array=" false" /> <field name=" Sunrise" type="string" arrays" false" /> <field name=" Sunset" type="string" array=" false" /> <field name="City" type="string" array="false" /> <field name="State" type="string" array="false" /> <field name="Moonrise" type=" string" array="false" /> <field name="Moonset" type="string" array=" false" /> <fidd name=" Precipitation" type=" string" array=" false" /> <field name="Country" type="string" array=" false" /> </data>
-<data name="Err" persist=" false" key=""> <field name="Desc" type="string" array="false" /> <field name= "Number" type="string" array="false" />
<field name="Location" type="string" array="false" /> </data>
-<data name=" Get WeatherByCity State" persist=" false" key=""> <field name="City" type="string" array="false" /> <fleld name="State" type="string" array="false" /> <field name="LicenseKey" type=" string" array="false" /〉 </data>
-<data name="GetWeatherByCityStateResponse" persist="false" key=""> <field name=" Get WeatherByCity StateResult" type="data" component=
"Weather" arrays" false" /> </data>
-<cata name="GetWeatherByIP" persist-" false" key=""> <field name=" IPAddress" type=" string" array=" false" /> <field name="LicenseKey" type=" string" array=" false" /> </data>
-<data name="GetWeatherByIPResponse" persist=" false" key=""> <field name="GetWeatherByIPResult" type="data" component- "Weather"
array=" false" /> </data>
-<data name="GetWeatherHistoricalByZip" persist:"false" key="">
<field name="PostalCode" type="string" arrays" false" />
<field name="Date" type="string" array=" false" />
<field name="Time" type="string" array=" false" />
<field name="LicenseKey" type=" string" array=" false" /> </data> -<data name-"GetWeatherHistorica旧yZipResponse" persist-" false" key="">
<field name="GetWeatherHistoricalByZipResult" type="data" component-"Weather" arrays" false" />
</data>
-<data name="GetWeatherByWMOID" persist^" false" key=""〉 <field name="WMOID" type="string" array="false" /> <field name="LicenseKey" type="string" array="false" /> </data>
-<data name="GetWeatherByWMOIDResponse" persist=" false" key=""> <field name="GetWeatherByWMOIDResult" type="data" component-
"Weather" array=" false" /> </data>
-<data name="GetWMOIDByCity" persist="false" key=""> <field name="City" type="string" array="false" /> <field name="LicenseKey" type="string" array="false" /> </data>
-<data name="GetWMOIDByCityResponse" persist^" false" key=""> <field name="GetWMOIDByCityResult" type="data"
component="WMOIDInfo" arrays" false" /> </data>
-<data name="WMOIDInfo" persist=" false" key="">
<field name="WMOIDItem" type="data" component "WMOID" array="true" />
<field name="Error" type="data" component="Err" array=" false" /> </data>
-<data name="WMOID" persist="false" key=""> <field name="City" type=" string" arrays" false" /> <field name="Region" type="string" array="false" /> 〈field name: "Country" type="string" array^"false" /> <field name= "WMOID" type=" string" array=" false" /> </data>
-<message name="outGet"WeatherByZipSoapIn" script=""> <mappedField name="parameters" mapping="Global .gv一GetWeatherByZip"
/> 〈alert beep=" false" ribbon=" false" /> </message>
-<message name="inGetWeatherByZipSoapOut" script="inGetWeatherByZipSoapOut—onMsgArrive"〉
<mappedField name= "parameters" mapping-
"Global ,gv—GetWeatherByZipResponse" />
<alert beep=" false" ribbon=" false" />
</message>
-<message name="outGetWeatherByCityStateSoapIn" script=""> <mappedField name= "parameters" mapping-
"Global .gv—GetWeatherByCityState" /> <alert beep="false" ribbon=" false" /> </message>
-<message name="inGetWeatherByCityStateSoapOut" script="inGetWeatherByCityStateSoapOut—onMsgArrive"〉
<mappedField name="parameters" mapping="Global ,gv—GetWeatherByCityStateResponse" />
<alert beep=" false" ribbon=" false" />
</mcssagc>
-<message name="outGetWeatherByIPSoapIn" script-""> <mappedField name= "parameters" mapping= "Global .gv_GetWeatherByIP"
/>
<alert beep=" false" ribbon=" false" /> </message>
-<message name="inGetWeatherByIPSoapOut" script="
inGet^VeatherBylPSoapOut—onMsgArrive">
<mappedField name= "parameters" mapping=
"Global .gv—GetWeatherByIPResponse" />
<alert beep="false" ribbon=" false" /> </message>
-〈message name-"outGet"WeatherHistoricalByZipSoapIn" script=""> 〈mappedField name= "parameters" mapping:
"Global .gv—GetWeatherHistoricalByZip" /> <alert beep=" false" ribbon=" false" /> </message>
-<message name="inGetWeatherHistoricalByZipSoapOut" script="inGetWeatherHistoricalByZipSoapOut_onMsgArrive">
<mappedField name= "parameters"
mapping="Global .gv—GetWeatherHistoricalByZipResponse" />
<alert beep="false" ribbon=" false" />
</message>
-<message name="outGetWeatherByWMOIDSoapIn" script=""> <mappedField name="parameters" mapping=
"Global ,gv一GetWeatherByWMOID" /> <alert beep="false" ribbon=" false" /> </message>
-<message name= " inGetWeatherByWMOIDSoapOut " script= " inGetWeatherByWMOIDSoapOut—onMsgArrive" >
<mappedField name= "parameters" mapping=
"Global .gv一GetWeatherByWMOIDResponse" />
<alert beep="false" ribbon=" false" />
</message>
-〈message name-"outGetWMOIDByCitySoapIn" script=""> <mappedField name="parameters" mapping-
"Global .gv—GetWMOIDByCity" /> <aLert beep=" false" ribbon=" false" /> </message>
-<message name= " inGetWMOIDByCitySoapOut" script^" inGetWMOIDByCitySoapOut onMsgArrive" >
<mappedFieId name= "parameters" mapping- "Global, gv—GetWMOIDByCityResponse" /> <alert beep=" false" ribbon=" false" /> </msssagc〉
-<screen name="scr_Main" layout- "vertical" dialog=" false" title="Main Screen">
-<region layout= "vertical ">
<label name-"GetWeatherByZip" inValue="GetWeatherByZip" /> -<button name="Go" inValue="Go">
<onClick transition="scr—outGet"WeatherByZipSoapIn" transaction="none" />
</button>
</region〉 -<region layout= "vertical ">
<label name="GetWeatherByCityState" inValue="GetWeatherByCityState" />
-<button name="Go" inValue="Go">
<onClick transition="scr_outGetWeatherByCityStateSoapIn" transaction="none" />
</button>
</region> -<region layout= "vertical ">
<label name="GetWeatherByIP" inValue="GetWeatherByIP" /> -<button name="Go" inValue="Go">
<onClick transition="scr—outGet"W"eatherBylPSoapIn" transactions"none" />
</button>
</region> -<region layout= "vertical ">
<label name="GetWeatherHistoricalByZip" inValue="GetWeatherHistoricalByZip" /> -〈button name-"Go" inValue="Go">
<onClick transition="scr—outGetfWeatherHistoricalByZipSoapIn" transaction "none"/>
</button>
</region> -<region layout= "vertical ">
〈label name="GetWeatherByWMOID" inValue="GetWeatherByWMOID" /> -<button name="Go" inValue="Go">
〈onClick transition="scr—outGetWeatherByWMOIDSoapIn"
transaction="none" />
</button>
</region> -<region layout="vertical ">
〈label name="GetWMOIDByCity" inValue="GetWMOIDByCity" /> -<button name="Go" inValue="Go">
〈onClick transition="scr—outGetWMOIDByCitySoapIn" transaction="none" />
</button> </region> <menu /> </scre6n>
-<screenname="scr—inGet WeatherByZipSoapOut" layout= "vertical" dialog=" false" tille= " inGet WeatherByZipSoapOut" > -<region layout= "vertical ">
<label name=" Error" inValue=" Error" /> -<button name="Details" inValue="Details ">
<onClick transition="scr—Err" transaction="none" />
</boutton>
</region>
-<region layout= "vertical ">
〈label name="LastUpdated" inValue="LastUpdated" />
<edit readOnly=" false" type="text" mandatory^" false" name=" edit—data— LastUpdated" inValue="@Global.gv—GetfWeatherByZipResponse.
GetWeatherByZipResult. LastUpdated" />
</region> -<region layout= "vertical ">
<label name="TemperatureF" inValue="TemperatureF" />
<edit readOnly="false" type="text" mandatory=" false" name= " edit一data一TemperatureF" inValue="@Global . gv—GetWeatherByZipResponse . GetWeatherByZipResult. TemperatureF" />
</region> -<region layout="vertical">
<label name="Windchiir inValue="Windchill'V>
<edit readOnly=" false" type="text" mandatory-" false" name= " edit data—Windchil "inValue="@Global. gv_GetWeatherByZipResponse .GetWeatherByZipResult .Windchill" />
</region> -<region layout= "vertical ">
〈label name="HeatIndex" inValue="HeatIndex" />
<edit readOnly=" false" type="text" mandatory:" false" name= " edit data—Heatlndex" inValue= "@Global . gv_GetWeatherByZipResponse . GetWeatherByZipResult .Heatlndex" />
</region> -<region layout= "vertical ">
<label name-"Humidity" inValue="Humidity" />
<edit readOnly=" false" type="text" mandatory=" false" name= " edit data—Humidity" inValue= "@Global . gv一GetA^eatherByZipResponse . GetWeatherByZipResult. Humidity" />
</region>
-<region layout= "vertical "> 〈label name="Dewpoint" inValue="Dewpoint" />
<edit readOnly=" false" type="text" mandatory^" false" name= " edit data—Dewpoint " inValue- "@Global . gv—GetWeatherByZipResponse . GetWeatherByZipResult. Dewpoint" />
</region> -<region layout= "vertical ">
〈label name="Wind" inValue="Wind" />
<edit readOnly=" false" type="text" mandatory=" false" name="edit data—Wind" inValue="@Global . gv一GetWeatherByZipResponse. GetWeatherByZipResult .Wind" />
</region> -<region layout= "vertical ">
<labd name=" Pressure" inValue=" Pressure" />
<edit readOnly=" false" type="text" mandatory^" false" name="edit data—Pressure" inValue= "@Global . gv_GetWeatherByZipResponse . GetWeatherByZipResult. Pressure" />
</region> -<region layout= "vertical ">
〈label name= "Conditions" inValue="Conditions" />
<edit readOnly=" false" type="text" mandatory=" false" name= " edit data—Conditions " inValue= "@Global . gv—GetWeatherByZipResponse . GetWeatherByZipResult .Conditions " />
</region> -<region layout- "vertical ">
<label name= "Visibility" inValue="Visibility" />
<edit readOnlf false" type="text" mandatory^" false" name=" edit data—Visibility" inValue="@Global . gv—GetWeatherByZipResponse. GetWeatherByZipResult .Visibility" />
</region〉 -<region layout= "vertical "> 〈label name=" Sunrise" inValue=" Sunrise" />
<edit readOnly=" false" type="text" mandatory-" false" name="edit data—Sunrise" in Value- "@Global . gv—GetWeatherByZipResponse . GetWeatherByZipResult. Sunrise" />
</region> -<region layout= "vertical ">
<label name= " S腿et" inValue=" Sunset" />
<edit readOnly=" false" type="text" mandatory^" false" name- " edit data—Sunset" inValue="@Global . gv一GetWeatherByZipResponse. GetWeatherByZipResult. Sunset" />
</region> -<region layout= "vertical ">
<label name="City" inValue="City" />
<edit readOnly=" false" type="text" mandatory-" false" name="edit data—City" inValue="@Global.gv_GetWeatherByZipResponse .
GetWeatherByZipResult .City" />
</region> -<region layout="vertical ">
<label name=" State" inValue=" State" />
<edit readOnly=" false" type="text" mandatory=" false" name="edit data—State" inValue="@Global,gv—GetWeatherByZipResponse . GetWeatherByZipResult. State" />
</region> ' -<region layout="vertical ">
<label name="Moonrise" inValue="Moonrise" />
<edit read[theta]nly=" false" type="text" mandatory^" false" name= " edit data—Moonrise" inValue="@Global .
gv—GetWeatherByZipResponse .GetWeatherByZipResult .Moonrise" />
</region> -<region layout= "vertical ">
〈label name="Moonset" inValue="Moonset" />
<edit read[theta]nly=" false" type="text" mandatory^" false" name= " edit data—Moonset " inValue= "@Global . gv一GetWeatherByZipResponse . GetWeatherByZipResult .Moonset" />
</region> -<region layout= "vertical ">
<label name=" Precipitation" inValue=" Precipitation" />
<edit read[theta]nly=" false" type="text" mandatory^" false" name-"edit data_Precipitation" inValue= "@Global . gv一GetWeatherByZipResponse . GetWeatherByZipResult. Precipitatio n" />
</region> -<region layout= "vertical ">
<label name= "Country" inValue= "Country" />
<edit read[theta]nly=" false" type="text" mandatory-" false" name= " edit data—Country" inValue= "@Global . gv—GetWeatherByZipResponse . GetWeatherByZipResult. Country" />
</region> -<region layout- "vertical "> -<button name="Close" inValue="Close">
<onClick transition="script—inGet"WeatherByZipSoapOut一onClose"
transaction="iKme" />
</button〉
</region> -<menu>
-<item name="menu_inGetWeatherByZipSoapOut" inValue="Close"> <onClick transition=',script_inGetWeatherByZipSoapOut—onClose"transaction="none" /〉 </item> </raenu> </screen>
-<screen name="scr—Err" layout= "vertical" dialog="true" title="Err"> -<region layout= "vertical "> <label name="Desc" inValue="Desc" />
<edit readOnly=" false" type="text" mandatory^" false" name="edit data—Desc" inValue= "@Global . gv—GetWeatherByZipResponse . GetWeatherByZipResult. Error . Desc " />
</region> -<region layout= "vertical ">
〈label name="Number" inValue="Number" />
<edit readOnly=" false" type="text" mandatory:" false" name= " edit data—Number" inValue= "@Global . gv—GetWeatherByZipResponse . Get\VeatherByZipResult. Error .Number" />
</region> -<region layout= "vertical ">
<label name="Location" inValue="Location" />
<edit readOnly=" false" type="text" mandatory=" false" name= " edit data—Location" inValue= "@Global . gv—GetWeatherByZipResponse . GetWeatherByZipResult. Error . Locati on" />
</region> -<region layout= "vertical "> -<button name= "Close" inValue= "Close" >
<onClick transition="script—Err—back" transaction="none" />
</button>
</region>
<menu />
</screen>
-<screen name="scr—outGetWeatherByZipSoapIn" layout= "vertical" dialog-" false" title="outGetWeatherByZipSoapIn"〉 -<region layout= "vertical "> <label name="PostalCode" inValue="PostalCode" />
<edit read[theta]nly=" false" type="text" mandatory^" false" name="edit data—PostalCode" mapping="Global .gv—GetWeatherByZip. PostalCode" inValue=" (c)Global .gv一GetWeatherByZip. PostalCode" />
</region> -<region layout- "vertical ">
〈label name="LicenseKey" inValue="LicenseKey" />
<edit readOnly=" false" type="text" mandatory=" false" name="edit data—LicenseKey" mapping= "Global . gy—GetWeatherByZip丄icenseKey" inValue= "@Global. gv一GetWeatherByZip . LicenseKey" />
</region> -<region layout- "vertical "> -<button name=" Submit" inValue=" Submit" >
<onClick transition- " script—outGet"^^eatherByZipSoapIn一onSubmit " transaction="none" />
</button>
</region>
<menu />
</screen>
-<screen name="scr—inGetWeatherByCityStateSoapOut" layout= "vertical" dialog=" false" title="inGetWeatherByCityStateSoapOut"> -<ragion layout^ "vertical ">
<label name=" Error" inValue="Error" /> -<batton name="Details" inValue="Details">
<o/iClick transition-" scr Err" transaction="none" /></button>
</ tregion> -<region layout="verticar>
<label name= " LastUpdated" inValue= "LastUpdated" />
<edit read0nly= " false" type= " text " mandatory^ " false" name= " edit data_LastUpdated" inVa lue= "@Global .
gv一GetWeatherByCityStateResponse . GetWeatherByCityStateResult . La st Updated" />
</ region> -<region layout= "vertical ">
<label name="TemperatureF" inValue="TemperatureF" />
<edit readOnly=" false" type="text" mandatory=" false" name="edit data一TemperatureF' inVa lue="@GIobal .
gv—GetWeatherByCityStateResponse . GetWeatherByCityStateResult . TemperatureF" />
</region> -<region layout= "vertical ">
<label name="Windchill" inValue="Windchill" />
<edit read[theta]nly=" false" type="text" mandatory=" false" name= " edit data—Windchill " inValue= "@Global . gv—Get^WeatherByCityStateResponse . GetWeatherByCityStateResult. Windchill" />
</region〉 -<region layout- "vertical ">
<label name="HeatIndex" inValue="HeatIndex" />
<edit readOnly="false" type="text" mandatory^" false" name= " edit data—Heatlndex" inValue= "@Global . gv一Get"WeatherByCityStateResponse . GetWeatherByCityStateResult. Heatlndex" />
</region>
-<region layout= "vertical ">〈label name="Humidity" inValue="Humidity" />
<edit read[theta]nly=" false" type="text" mandatory:" faise" name= " edit data—Humidity" in Value- "@Global . gv—GetWeatherByCityStateResponse . GetWeatherByCityStateResult. Humidity" />
</region〉 -<region layout= "vertical ">
〈label name="Dewpoint" inValue="Dewpoint" />
<edit read[theta]nly=" false" type="text" mandatory=" false" name= " edit data—Dewpoint " inValue= "@Global . gv一GetWeatherByCityStateResponse . GetWeatherByCityStateResult. Dewpoint" />
</region> -<region layout= "vertical ">
〈label name="Wind" inValue="Wind" />
<edit read[theta]nly=" false" type="text" mandatory=" false" name="edit data—Wind" inVaIue= "@Global . gv—GetWeatherByCityStateResponse . GetWeatherByCityStateResult. Wind" />
</region> -<region layout="vertical ">
<label name=" Pressure" inValue=" Pressure" /> <edit readOnly=" false" type="text" mandatory-" false" name= " edit data—Pressure" inValue= "@Global.gv—GetWeatherByCityStateResponse. GetWeatherByCityStateResult. Pressure" />
</region> - <region layout= "vertical ">
<label name= "Conditions" inValue="Conditions" />
<edit read[theta]nly="false" type="text" mandatory=" false" name= " edit data—Conditions " inValue= "@GIobal . gv一GetWeatherByCityStateResponse . GetWeatherByCityStateResult. Conditions" />
</region> -<region layout= "vertical ">
〈label name="Visibility" inValue= "Visibility" />
<edit read[theta]nly=" false" type="text" mandatory=" false" name="edit data—Visibility" inValue= "@Global . gv一GetWeatherByCityStateResponse . GetWeatherByCityStateResult. Visibility" />
</region> -<region layout= "vertical ">
<label name=" Sunrise" in Value-" Sunrise" />
<edit read[theta]nly=" false" type="text" mandatory=" false" name="edit —data—Sunrise" inValue="@Global. gv一GetWeatherByCityStateResponse. GetWeatherByCityStateResult. Sunrise" />
</region> -<region layout= "vertical ">
〈label name=" Sunset" inValue=" Sunset" /〉
<edit readOnly=" false" type="text" mandatory:" false" name="edit data—Sunset" inValue= "@Global . gv一GetWeatherByCityStateResponse . GetWeatherByCityStateResult. Sunset" />
</region>
-<region layout- "vertical ">
<label name="City" inValue="City" />
<edit readOnly=" false" type="text" mandatory=" false" name="edit data City" inValue="@Global .
gv—GetWeatherByCityStateResponse .GetWeatherByCityStateResult. City" />
</region>
-<region layout= "vertical "> <label name=" State" inValue=" State" /〉
<edit readOnly=" false" type="text" mandatory=" false" name="edit data—State" inValue= "@Global . gv—GetWeatherByCityStateResponse . GetWeatherByCityStateResult. State" />
</region> -<region layout= "vertical "> <label name="Moonrise" inValue="Moonrise" />
<edit readOnly=" false" type="text" mandatory-" false" name="edit data—Moonrise" inValue= "@Global . gv一GetWeatherByCityStateResponse . GetWeatherByCityStateResult. Moonrise" />
</region> -<region layout= "vertical ">
<label name="Moonset" inValue="Moonset" />
<edit read[theta]nly=" false" type="text" mandatory=" false" name="edit data—Moonset" inValue= "@Global . gv一GetWeatherByCityStateResponse . GetWeatherByCityStateResult. Moonset" />
</region> -<region layout= "vertical "〉
<label name="Precipitation" inValue=" Precipitation" />
<edit read[theta]nly=" false" type="text" mandatory=" false" name="edit data—Precipitation" inValue= "@Global. gv一GetWeatherByCityStateResponse . GetWeatherByCityStateResult. Precipitation" />
</region> -<region layout= "vertical ">
<label name="Country" inValue- "Country" />
<edit readOnly=" false" type="text" mandatory=" false" name= " edit data—Country" inValue= "@Global . gv—GetWeatherByCityStateResponse . GetWeatherByCityStateResult. Country" /〉
</region> -<region layout= "vertical "> -<button name= "Close" inValue= "Close" >
<onClick transition="scri[rho]t—inGetWeatherByCityStateSoapOut—onClose" transaction="none" />
</button> </region> -<mcnu>
-<item name="menu—inGetWeatherByCityStateSoapOut" inValue="Close">
<onClick transition="script—inGetWeatherByCityStateSoapOut_onClose" transaction="ncme'' />
</item>
</menu>
</screen>
-<screen name="scr—OutGetWeatherByCityStateSoapIn" layout= "vertical" dialog= " false" title= " OutGetWeatherByCityStateSoapIn" > -<region layout- "vertical "> 〈label name="City" inValue="City" />
<edit read[theta]nly=" false" type="text" mandatory=" false" name="edit data—City" mapping= "Global . gv一GetWeatherByCityState . City" inValue=" @GlobaI. gv—GetWeatherByCityState . City" />
</region〉陽<region layout= "vertical ">
<label name="State" inValue=" State" />
<edit read[theta]nly=" false" type="text" mandatory=" false" name="edit data—State" mapping="Global .gv—GetWeatherByCityState. State" inValue="@Global. gv—GetWeatherByCityState. State" />
</region> -<region layout= "vertical ">
<label name= "LicenseKey" inValue="LicenseKey" />
<edit read[theta]nly=" false" type="text" mandatory=" false" name= " edit data—LicenseKey" mapping= "Global . gv一Get WeatherByCity State . LicenseKey" inValue= "@Global . gv—GetWeatherByCityState . LicenseKey" />
</region> -<region layout= "vertical ">
-<button name=" Submit" inValue=" Submit ">
<onClick transition- " script—outGetWeatherByCityStateSoapIn—onSubmit" transaction="none" />
</button>
</region>
<menu /〉
</screen>
-<screen name-"scr一inGet"WeatherBylPSoapOut" layout= "vertical" dialog=" false" title="inGetWeatherByIPSoapOut"> -<region layout= "vertical "〉
<label name="Error" inValue=" Error" /> -<button name= "Details" inValue= "Details ">
<onClick transition="scr—Err" transaction="none" />
</button>
</region> -<region layout="verticar>
〈label name="LastUpdated" inVaiue="Last[upsilon][rho〗dated" />
<edit readOnly=" false" type="text" mandatory^" false" name= " edit data—LastUpdated" inValue= "@Global .
gv—GetWeatherByIPResponse .GelfWeatherByIPResult丄astUpdated7〉
</region〉 -<region layout= "vertical ">
<label name= "TemperatureF" inValue="TemperatureF" />
<edit readOnly=" false" type="text" mandatory^" false" name= " edit data—TemperatureF" inValue= "@Global .
gv一GetWeatherByIPResponse .GetWeatherBylPResult .TemperatureF" />
</region> -<region layout= "vertical ">
<label name="Windchill" inValue-"Windchill" />
141
<edit readOnly=" false" type="text" mandatory-" false" name- " edit data—Windchill " inValue- "@Global.
gv一GetWeatherByIPResponse.GetWeatherByIPResult .Windchill" />
</region> -<region layout- "vertical ">
<label name="HeatIndex" inValue="HeatIndex" />
<edit readOnly=" false" type="text" mandatory-" false" name="edit data—Heatlndex" inValue= "@Global .gv一GetWeatherByIPResponse . GetWeatherBylPResult .Heatlndex" />
</region〉 -<region layout二 "vertical ">
〈label name="Humidity" inValue="Humidity" />
<edit read[theta]nly^" false" type="text" mandatory=" false" name= " edit data—Humidity" inValue= "@Global . gv—GetWeatherByIPResponse . GetWeatherBylPResult. Humidity" />
</region> -<region layout- "vertical ">
〈label name="Dewpoint" inValue="Dewpoint" />
<edit read[theta]nly=" false" type="text" mandatory-" false" name= " edit data—Dewpoint " inValue= "@Global . gv_GetWeatherByIPResponse . GetWeatherBylPResult. Dewpoint" />
</region> -<region layout- "vertical ">
<label name="Wind" inValue="Wind" />
<edit read[theta〗nly=" false" type="text" mandatory=" false" name="edit data—Wind" inValue= "@Global . gv一GetWeatherByIPResponse . GetWeatherBylPResult .Wind" />
</region> -<region layout="vertical ">
<label name=" Pressure" inValue=" Pressure" />
<edit readOnly=" false" type-"text" mandatory:" false" name="edit data—Pressure" inValue="@Global . gv—GetWeatherByIPResponse . GetWeatherBylPResult. Pressure" />
</region> -<region layout= "vertical ">
<label name="Conditions" inValue= "Conditions" />
<edit read[theta]nly=" false" type="text" mandatory^" false" name= " edit data—Conditions " inValue="@Global . gv—GetWeatherByIPResponse . GetWeatherBylPResult. Conditions " />
</region> -<region layout= "vertical ">
<label name= "Visibility" in Value- "Visibility" />
<edit readOnly二" false" type="text" mandatory=" false" name= " edit data—Visibility" inVaIue= "@Gobal . gv_GetWeatherByIPResponse . GetWeatherBylPResult .Visibility" /〉
</region> -<region layout= "vertical "〉
〈label name=" Sunrise" inValue=" Sunrise" />
<edit readOnly=" false" type="text" mandatory^" false" name="edit data—Sunrise" inValue="@Global . gv—GetWeatherByIPResponse. GetWeatherBylPResult, Sunrise" /〉
</region> -<region layout= "vertical "〉
<label name=" Sunset" inValue=" Sunset" />
<edit read[theta]nly=" false" type="text" mandatory=" false" name= " edit data—Sunset " inValue= "@Global . gv一GetWeatherByIPResponse . GetWeatherBylPResult. Sunset" />
</region>
-<region layout= "vertical "> 〈label name="City" inValue="City" />
<edit read[theta]nly=" false" type="text" mandatory=" false" name="edit data—City" invalue- "@Global . gv—GetWeatherBylPResponse . GetWeatherByIPResult .City" />
</region> -<region layout^ "vertical ">
〈label name=" State" inValue=" State" />
<edit readOnly=" false" type="text" mandatory=" false" name="edit data—State" inValue="@Global . gv一GetWeatherByIPResponse. GetWeatherByIPResult. State" />
</region> -<region layout= "vertical ">
〈label name="Moonrise" inValue="Moonrise" />
<edit readOnly=" false" type="text" mandatory^" false" name="edit data—Moonrise" inValue="@Global , gv—GetWeatherBylPResponse . GetWeatherByIPResult. Moonrise" />
</region> -<region layout= "vertical ">
〈label name="Moonset" inValue="Moonset" />
<edit read[theta]nly=" false" type="text" mandatory^" false" name= " edit data—Moonset" inValue="@Global. gv_GetWeatherByIPResponse .GetWeatherByIPResult .Moonset" />
</region> -<region layout^ "vertical ">
<label name=" Precipitation" inValue=" Precipitation" />
<edit read[theta]nly^" false" type="text" mandatory-" false" name= " edit data_Precipitation" in Value- "@Global . gv—GetWeatherBylPResponse . GetWeatherByIPResult. Precipitation" />
</region> -<region layout= "vertical "〉 <label name= "Country" inValue= "Country" />
<edit readOnly=" false" type="text" mandatory-" false" name= " edit data—Country" inValue= "@Global . gv—GetWeatherByIPResponse . GetWeatherByIPResult. Country" />
</region> -<region layout= "vertical "> -<button name="Close" inValue="Close">
<onClick transition="script—inGetWeatherByIPSoapOut—onClose"
transaction="none" />
</button>
</region〉 -<menu>
-<item name="menu—inGetWeatherByIPSoapOut" inVaue="CIose">
<coClick transition="script—inGetWeatherByIPSoapOut—onClose"
transaction="none" />
</item>
</menu>
</screen>
-<screenname="scr—outGetWeatherByIPSoapIn" layout="vertical" dialog-"false" title="outGetWeatherByIPSoapIn"> -<region layout= "vertical "> 〈label name="IPAddress" inValue="IPAddress" />
<edit readOnly=" false" type="text" mandatory=" false" name- " edit data—IPAddress " mapping- "Global . gv—GelfWeatherByIP . IPAddress " inValue="@Global. gv—GetWeatherByIP . IPAddress" />
</region> -<region layout: "vertical "> <label name="LicenseKey" inValue="LicenseKey" />
<edit readOnly=" false" type="text" mandatory-" false" name= " edit data—LicenseKey" mapping- "Global . gv一GetWeatherByIP . LicenseKey" inValue= "@Global. gv一GetWeatherByIP . LicenseKey" />
</region> -<region layout- "vertical "> -<button name=" Submit" inValue=" Submit ">
<onClick transition- " script一outGetWeatherByIPSoapIn一onSubmit " transactiorF^'none" />
</button>
</rsgion>
<menu />
</screen>
-<screen name="scr—inGetWeatherHistoricalByZipSoapOut" layout= "vertical" dialog=" false" title="inGetWeatherHistoricaEByZipSoapOut"> -<region layout= "vertical ">
<label name="Error" inValue="Error" /> -<button name= "Details" inValue= "Details ">
<onClick transition="scr—Err" transaction "none" />
</button>
</region> -<region layout= "vertical ">
<label name="LastUpdated" inValue="LastUpdated" />
<edit readOnly=" false" type="text" mandatory=" false" name="edit data—LastUpdated" inValue=" @Global.
gv—GetWeatherHistoricalByZipResponse.GetWeatherHistoricalByZi pResult丄astUpdated" />
</region> -<region layout="vertical">
〈label name= "TemperatureF " inValue="TemperatureF" />
<edit readOnly=" false" type="text" mandatory^" false" name= " edit data_TemperatureF" inValue="@Global .
gv—GetWeatherHistoricalByZipResponse . GetWeatherHistoricalByZi pResult .TemperatureF" />
</region> -<region layout= "vertical ">
〈label name="Windchill" inValue-"Windchill" />
<edit readOnly=" false" type="text" mandatory-" false" name= " edit data—Windchill" inValue="@Global .
gv—GetWeatherHistoricalByZipResponse .GetWeatherHistoricalByZi pResult .Windchill" />
</region> -<region layout= "vertical ">
<label name="HeatIndex" inValue="HeatIndex" />
<edit readOnly=" false" type="text" mandatory=" false" name= " edit data—Heatlndex" inValue= "@Global .
gv—GetWeatherHistoricalByZipResponse . GetWeatherHistoricalByZi pResult .Heatlndex" />
</region> -<region layout= "vertical ">
<label name= "Humidity" inValue="Humidity" />
<edit readOnly=" false" type="text" mandatory=" false" name=" edit data—Humidity" inValue= "@Global .
gv—GetWeatherHistoricalByZipResponse . GetWeatherHistoricalByZi pResult .Humidity" />
</region> -<region layout="verticar>
<label name="Dewpoint" inValue="Dewpoint" /><edit readOnly=" false" type="text" mandatory-" false" name="edit data一Dewpoint" inValue= "@Global .
gv—GetWeatherHistoricalByZipResponse . GetWeatherHistoricalByZi pResult .Dewpoint" />
</region> -<region layout= "vertical ">
<label name="Wind" inValue="Wind" />
<edit readOnly=" false" type="text" mandatory^" false" name="edit data—Wind" inVa lue= "@Global . gv—GetWeatherHistoricalByZipResponse . GetWeatherHistorica旧yZi pResult. Wind" />
</region>
-<region layout= "vertical "> <label name=" Pressure" inValue=" Pressure" />
<edit readOnly=" false" type="text" mandatory=" false" name=" edit data—Pressure" inValue= "@Global . gv一GetWeatherHistoricalByZipResponse . GetWeatherHistoricalByZi pResult. Pressure" />
</region> -<region layout= "vertical ">
<label name="Conditions" inValue="Conditions" />
<edit readOnly=" false" type="text" mandatory^" false" name="edit data—Conditions" inValue= "@Global .
gv一Get"WeatherHistoricalByZipResponse . Get"W^eatherHistoricalByZi pResult .Conditions" />
</region>
-<region layout= "vertical "> <label name= "Visibility" inValue= "Visibility"
/>
<edit readOnly=" false" type="text" mandatory=" false" name="edit data—Visibility" inValue= "@Global .
gv一GetWeatherHistoricalByZipResponse . GetWeatherHistoricalByZi
pResult .Visibility" />
</region> -<region layout- "vertical ">
〈label name=" Sunrise" inValue=" Sunrise" />
<edit readOnly=" false" type="text" mandatory-" false" name=" edit data—Sunrise" inValue= "@Global . gv—GefWeatherHistoricalByZipResponse . GetWeatherHistoricalByZi pResult, Sunrise" />
</region> -<region layout= "vertical ">
〈label name=" Sunset" inValue=" Sunset" />
<edit readOnly=" false" type="text" mandatory-" false" name= " edit data—Sunset " inValue="@Global .
gv—Get\VeatherHistoricalByZipResponse .Get\VeatherHistoricalByZi pResult . Sunset" />
</region> -<region layout= "vertical ">
<label name="City" inValue="City" />
<edit readOnly=" false" type="text" mandatory=" false" name="edit data—City" inValue= "@Global . gv—GetWeatherHistoricalByZipResponse . GetWeatherHistoricalByZi pResult. City" />
</region> -<region layout= "vertical">
<label name-"State" inValue=" State" />
<edit readOnly=" false" type-"text" mandatory=" false" name="edit data—State" inValue= "@Global . gv—GetWeatherHistoricalByZipResponse . GetWeatherHistoricalByZi pResalt. State" />
</region> -<region layout= "vertical ">
<label name="Moonrise" inValue="Moonrise" />
<edit readOnly=" false" type="text" mandatory=" false" name="edit data—Moonrise" inVaue= "@Global .
gv—GetWeatherHistorica旧yZipResponse . GetWeatherHistoricalByZi pResult .Moonrise" />
</region> -<region layout= "vertical ">
〈label name="Moonset" inValue="Moonset" />
<edit readOnly=" false" type="text" mandatory^" false" name= " edit data—Moonset" inValue= "@Global . gv_GetWeatherHistoricalByZipResponse . GetWeatherHistoricalByZi pResult .Moonset" />
</region> -<region layout- "vertical ">
〈label name=" Precipitation" inValue=" Precipitation" />
<edit readOnly=" false" type="text" mandatory=" false" name="edit data—Precipitation" inValue= "@Global .
gv_GetWeatherHistoricalByZi[rho]Response . GetWeatherHistoricalByZi pResult. Precipitation" />
</region> -<region layout= "vertical ">
<label name= "Country" inValue="Country" />
<edit readOnly=" false" type="text" mandatory=" false" name=" edit data—Country" inValue= "@Global . gv—GetWeatherHistoricalByZipResponse . GetWeatherHistoricalByZi pResult .Country" />
</region> -<region layout- "vertical "> -<button name= "Close" inVaIue="Close">
<onClick transition="script—inGetWeatherHistoricalByZipSoapOut—onCIose" transaction="none" />
</button></region> -<menu>
-<item name="menu—inGetWeatherHistoricalByZipSoapOut" inValue= "Close" >
<onClick transition="script—inGetWeatherHistoricalByZipSoapOut_onClose" transaction="none" /> </item> </m6nu> </screen>
-<screen name="scr—outGetWeatherHistoricalByZipSoapIn" layout= "vertical" dialog=" false" title="outGefWeatherHistoricalByZipSoapIn"> -<region layout= "vertical "> <labd name="PostalCode" inValue="PostalCode" />
<edit readOnly=" false" type="text" mandatory=" false" name= " edit data—PostalCode" mapping-" Global .gv一GetWeatherHistoricalByZip. PostalCode" inValue="@Global. gv—GetWeatherHistorica旧yZip. PostalCode"
/>
</region> -<region layout= "vertical "> <label name="Date" inValue-"Date" />
<edit readOnly=" false" type="text" mandatory^" false" name="edit data_Date" mapping="Global .gv—GetWeatherHistoricalByZip.Date" inValue= "@Global. gv—GetWeatherHistorica旧yZip . Date" />
</region> -<region layout= "vertical ">
<label name="Time" inValue="Time" />
<edit readOnly=" false" type="text" mandatory:" false" name="edit data—Time" mapping= "Global . gv—GetWeatherHistoricalByZip . Time" inValue= "@Global. gv一GetWeatherHistoricalByZip . Time" />
</region> -<region layout^ "vertical "> 〈label name="LicenseKey" inValue="LicenseKey" />
<edit read[theta]nly=" false" type="text" mandatory:" false" name= " edit data一LicenseKey" mapping- "Global . gv一GetWeatherHistoricalByZip . LicenseKey" inValue="@Global . gv—Get WeatherHistoricalByZip. LicenseKey7> </region>
-<region layout= "vertical ">
-<button name=" Submit" inValue=" Submit ">
〈cnClick tmnsition= "
script—outGetV/eatherHistoricalByZipSoapIn—onSubmit " transaction-"none"
/>
</button> </region> <menu /> </scresn>
-<screen name="scr—inGetWeatherByWMOIDSoapOut" layout= "vertical" dialog= " false" title= " inGetWeatherByWMOIDSoapOut" > -<region layout="vertical ">
<label name="Error" inValue="Error" /> -<button name="Details" inValue= "Details ">
<onClick transition="scr—Err" transaction="none" />
</button>
</region> -<region layout= "vertical ">
<label name="LastUpdated" inValue="LastUpdated" />
<edit readOnly=" false" type="text" mandatory=" false" name= " edit data一LastUpdated" inValue="@Global . gv—GetWeatherByWMOIDResponse .GetWeatherByWMOIDResult. LastUpda ted" /> </region> -<region layout- "vertical ">
<label name="TemperatureF" inValue="TemperatureF"/>
<edit readOnly=" false" type="text" mandatory=" false" name= " edit data—TemperatureF" inValue= "@Global .
gv—GetWeatherByWMOIDResponse . GetWeatherByWMOIDResult . Tempemt ureF" />
</region> -<region layout= "vertical ">
<label name="Windchill" inValue="Windchm" />
<edit readOnly=" false" type="text" mandatory=" false" name="edit data—Windchill" inValue= "@Global . gv—GetWeatherByWMOIDResponse . GetWeatherByWMOIDResult .Windchil 1" />
</region> -<region layout= "vertical" >
<label name="HeatIndex" inValue="HeatIndex" />
<edit readOnly=" false" type="text" mandatory^" false" name="edit data—Heatlndex" inValue= "@Global . gv—GetWeatherByWMOIDResponse . GetWeatherByWMOIDResult. Heatlnde x" />
</region> -<region layout= "vertical ">
〈label name= "Humidity" inValue-"Humidity" />
<edit readOnly=" false" type="text" mandatory^" false" name= " edit data Humidity" inValue= "@Global . gv—GetWeatherByWMOIDResponse . GetWeatherByWMOIDResult. Humidity" />
</region> -<region layout= "vertical ">
<label name="Dewpoint" inVaIue="Dewpoint" /〉 <edit readonly-" false" type="text" mandatory^" false" name= " edit data—Dewpoint " inValue= "@Global . gv—GetWeatherByWMOIDResponse . GetWeatherByWMOIDResult. Dewpoint" />
</region> -<region layout= "vertical "〉
〈label name="Wind" inValue="Wind" />
<edit readOnly=" false" type="text" mandatory=" false" name="edit data—Wind" inValue="@Global .
gv—GetWeatherByWMOIDResponse.GetWeatherByWMOIDResult .Wind" />
</region> -<region layout= "vertical ">
<label name=" Pressure" inValue-" Pressure" />
<edit readOnly=" false" type="text" mandatory-" false" name= " edit data—Pressure" inValue="@Global . gv一GetWeatherByWMOIDResponse . GetWeatherByWMOIDResult. Pressure" />
</region> -<region layout= "vertical ">
<label name="Conditions" inValue="Conditions" />
<edit readOnly=" false" type="text" mandatoiy=" false" name= " edit data—Conditions " inValue= "@Global . gv—GetWeatherByWMOIDResponse . GetWeatherByWMOIDResult. Conditio ns" />
</region> -<region layout= "vertical ">
<label name="Visibility" inValue= "Visibility" />
<edit readOnly="false" type="text" mandatory=" false" name="edit data—Visibility" inValue= "@Global . gv—GetWeatherByWMOIDResponse . GetWeatherByWMOIDResult .Visibili ty" />
</region> -<region layout= "vertical ">
<label name=" Sunrise" inValue=" Sunrise" />
<edit readOnly=" false" type="text" mandatory=" false" name="edit data—Sunrise" inValue="@Global .
gv—GetWeatherByWMOIDResponse ,GetWeatherByWMOIDResult . Sunrise"
/>
</region> -<region layout= "vertical "> <label name="Sunset" inValue=" Sunset" />
<edit readOnly=" false" type="text" mandatory-" false" name= " edit data—Sunset" inValue= "@Global . gv—GetWeatherByWMOIDResponse . GetWeatherByWMOIDResult. Sunset" />
</region> -<region layout= "vertical ">
<label name="City" inValue="City" />
<edit readOnly=" false" type="text" mandatory-" false" name="edit data—City" inValue="@Global . gv一GetWeatherByWMOIDResponse . GetWeatherByWMOIDResult. City" />
</region> -<region layout= "vertical ">
<label name="State" inValue=" State" />
<edit readOnly=" false" type="text" mandatory^" false" name="edit data—State" inValue="@Global . gv一GetWeatherByWMOIDResponse . GetWeatherByWMOIDResult. State" />
</region> -<region layout= "vertical ">
<label name="Moonrise" inValue="Moonrise" />
<edit readOnly=" false" type="text" mandatory=" false" name="edit data—Moonrise" inValue= "@GlobaI . gv一GetWeatherByWMOIDResponse . GetWeatherByWMOIDResult. Moonrise" />
</region> -<region layout= "vertical "> 〈label name="Moonset" inValue="Moonset" />
<edit read0nly=" false" type="text" mandatory^" false" name= " edit data—Moonset " inValue= "@Global . gv—GetWeatherByWMOIDResponse . GetWeatherByWMOIDResult .Moonset7>
</region> -<region layout= "vertical ">
〈Iabel name=" Precipitation" inVaIue=" Precipitation" />
<edit read0nly=" false" type="text" mandatory^" false" name= " edit data—Precipitation" inValue="@Global . gv—GetWeatherByWMOIDResponse . GetWeatherByWMOIDResult. Precipit ation" />
</region> -<region layout- "vertical ">
<label name= "Country" inValue= "Country" /> <edit readOnly=" false" type="text" mandatory="false" name="edit data—Country" inValue= "@Globa. gvGetWeatherByWMOIDResponse . GetWeatherByWMOIDResult . Country" />
</region> -<region layout= "vertical "> -<button name="Close" inValue="Close">
<onClick transition="scriptjnGetWeatherByWMOIDSoapOut—onClose" transaction=''none" />
</button>
</region> -<menu〉
-<item name="menu—inGefWeatherByWMOIDSoapOut" inValue="Close"> <onClick transition: " script—inGetWeatherByWMOIDSoapOut一onClose" transaction=''none'' />
</item>
</m6nu>
</scre6n〉
-<screenname="scr—outGetWeatherByWMOIDSoapIn'' layout:"vertical" dialog-" false" title="outGetWeatherByWMOIDSoapIn"> -<region layout="verticaI"> 〈label name="額OID" inValue="WMOID" />
<edit readOnly="false" type="text" mandatory=" false" name="edit data一WMOID" mapping= "Global . gv—GetWeatherByWMOID .WMOID" inValue= "@Global. gv一GetWeatherByWMOID .WMOID" />
</region〉 -<region layout= "vertical ">
<label name="LicenseKey" inValue="LicenseKey" />
<edit readOnly="false" type="text" mandatory=" false" name= " edit data一LicenseKey" mapping="Global . gv—GetWeatherByWMOID . LicenseKey" inValue= "@Global .gv—GetWeatherByWMOID. LicenseKey" />
</region> -<ragion layout="vertical"> -<button name=" Submit" inValue=" Submit ">
<onClick transition- " script—outGet"WeatherByWMOIDSoapIn_onSubmit " transaction="none" />
</button>
</region>
<menu />
</scre6n〉
-<screenname="scr—inGetWMOIDByCitySoapOut"layout= "vertical" dialog=" false" title="inGetWMOIDByCitySoapOut"> -<region layout= "vertical "> 〈label name-"WMOIDItem" inValue="WMOIDItem" />
-<button name= "Details" inValue= "Details ">
<onClick transition="scr—WMOID" transaction="none7>
</button>
</region> -<region Iayout= "vertical ">
<label name="Error" inValue=" Error" />
-<button name="Details" inValue= "Details ">
<onClick transition-"scr—Err" transactions "none" />
</button>
</region> -<region layout= "vertica!["> -<button name="Close" inValue="Close">
〈onClick transition="script—inGetWMOIDByCitySoapOut—onClose"
transaction="none" />
</button>
</region> -<menu〉
-<item name="menu—inGetWMOIDByCitySoapOut" inValue="Close">
〈onClick transition=" script—inGetWMOIDByCitySoapOut一onClose"
transaction="none" />
</item>
</msnu>
</scr66n〉
-<screen name="scr_WMOID" layout= "vertical" dialog="true" title-"WMOID" >
-<region layout="vertical "> 〈label name="City" inValue="City" />
<edit readOnly=" false" type="text" mandatory^" false" name="edit data—City" inValue="@Global .gv一GetWMOIDByCityResponse.GetWMOIDByCityResult .WMOIDItem.Cit y"/>
</region> -<region layout= "vertical ">
<label name="Region" inValue= "Region" />
<edit readOnly=" false" type="text" mandatory=" false" name="edit data—Region" inValue="@Global. gv—GetWMOIDByCityResponse.GetWMOIDByCityResult .WMOIDItem.Reg ion" />
</region> -<region layout= "vertical ">
<label name="Country" inValue= "Country" />
<edit readOnly="false" type="text" mandatory-" false" name= " edit data—Country" inValue="@Global. gv—GetWMOIDByCityResponse.GetWMOIDByCityResult .WMOIDItern.Co un try" />
</region> -<region layout="verticar'>
〈label name= "WMOID" inValue= "WMOID" /〉
<edit readOnly="false" type="text" mandatory-" false" name="edit data—WMOID" inValue="@Global. gv—GetWMOIDByCityResponse.Get丽OIDByCityResult .WMOIDItem.W MOI D" />
</region> -<region layout= "vertical "> -<button name="Close" inValue= "Close" >
<onClick transition- " script—WMOID—back" transactions "none" />
</button>
</region> <menu / > </screen>
-<screen name= " scr—outGetWMOIDByCitySoapIn" layout= "vertical " dialog= " false" title= "outGetWMOIDByCitySoapIn" > -<region layout= "vertical " > 〈label name= "City" inValue= "City" />
<edit readOnly="false" type="text" mandatory-" false" name="edit data—City" mapping= "Global . gv_GetWMOIDByCity.City" inValue="@Global.gv—GetWMOIDByCity.City" />
</region> -<region layout- "vertical ">
〈label name="LicenseKey" inValue="LicenseKey" />
<edit readOnly="false" type="text" mandatory^" false" name= " edit data—LicenseKey" mapping= "Global . gv—GetWMOIDByCity. LicenseKey" inValue="@Global. gv一GetWMOIDByCity.LicenseKey" />
</region> -<region layout= "vertical "> -<button name=" Submit" inValue=" Submit ">
<onClick transition="script_outGetWMOIDByCitySoapIn—onSubmit"
transaction="none" />
</button>
</region〉
<menu /〉
</screen>
<script name="script—inGetWeatherByZipSoapOut—onClose" /> <script name="script—Err—back" />
<script name="inGetWeatherByZipSoapOut—onMsgArrive" /> <script name="script—outGetWeatherByZipSoapIn—onSubmit" /> <script name= " script—inGetWeatherByCityStateSoapOut—onClose" /〉 <script name="inGetWeatherByCityStateSoapOut—onMsgArrive" /> <script name="script—outGetWeatherByCityStateSoapIn—onSubmit7〉 <script name="script—inGetWeatherByIPSoapOut—onClose"/> <script name=" inGetWeatherByIPSoapOut一onMsgArrive" /> <script name-"script一outGetWeatherByIPSoapIn一onSubmit" /> <script name="script—inGetWeatherHistoricalByZipSoapOut—onClose" /> <script name="inGetWeatherHistoricalByZipSoapOut—onMsgArrive" /> <script name="script—outGetWeatherHistoricalByZipSoapIn—onSubmit" /> <script name="script—inGetWeatherByWMOIDSoapOut—onClose" /> <script name="inGetWeatherByWMOIDSoapOut—onMsgArrive" /> <script name="script—outGetWeatherByWMOIDSoapIn—onSubmit" /> <script name-"script一inGetWMOIDByCitySoapOut一onClose" /> 〈script name=" script—WMOID_back" /〉
<script name= " inGetWMOIDByCitySoapOut—onMsgArrive" /> <script name= " script—outGetWMOIDByCitySoapIn一onSubmit" /> </application>
Weather, script
以下定义可以在提供给装置100时增加上面给出的XML定义300的示 例应用105工作流脚本(例如,工作流组件406)。
function script—inGetWeatherByZipSoapOut—onClose ( ) {scr—Main.display
();}
flmction script—Err—back( ){Screen . back O ; } function
inGetWeatherByZipSoapOut一onMsgArrive ( )
{ scr_inGetWeatherByZipSoapOut. display ( ); }
flmction
script_outGetWeatherByZipSoapIn—onSubmit ( )
{outGetWeatherByZipSoapIn.parameters=Global. gv一GetWeatherByZip;
OutGetWeatherByZipSoapIn . send (); scr—Main.display ();}
function script—inGetWeatherByCityStateSoapOut一onClose ( ) { scr—Main .
display O 5 }
fUnction
inGetWeatherByCityStateSoapOut—onMsgArrive ( )
{scr—inGetWeatherByCityStateSoapOu t .display (); }
flmction
script—outGetWeatherByCityStateSoapIn一onSubmit ( )
{outGetWeatherByCityStateSoapI n.parameters=Global .
gv—GefWeatherByCityState; outGetWeatherByCityStateSoapIn . send (); scr—Main . display (); }
function script—inGetWeatherByIPSoapOut一onClose( ) {scr_Main. display
();}
function
inGetWeatherBylPSoapOut—onMsgArrive() { scr—inGetWeatherBylPSoapOut .
display
function
script—outGetWeatherByIPSoapIn一onSubmit ( ) {outGetWeatherBylPSoapIn .
parameters=G lobal. gv一GetWeatherByIP;
outGetWeatherBylPSoapIn . send ();
scr—Main . display 0 ; }
function
script—inGetWeatherHistoricalByZipSoapOut—onClose() { scr—Main.
display(); }
fUnction
inGetWeatherHistoricalByZipSoapOut—onMsgArrive() {scr—inGetWeatherHistoricalByZ ipSoapOut. display (); }function
script—outGet^^eatherHistoricalByZipSoapIn一onSubmit()
{ outGetWeatherHistoricalByZipSoapIn.parameters-Global .
gv一GetWeatherHistoricalByZip;
outGetWeatherHistoricalByZipSoapIn . send ();
scr一Main . display (); }
flmction script一inGetWeatherByWMOIDSoapOut—onClose ( ) { scr—Main .
display 0 0
flmction
inGetWeatherByWMOIDSoapOut—onMsgArrive()
{ scr—inGetWeatherByWMOIDSoapOut. displa y () ; }
function
script—outGetWeatherByWMOIDSoapIn一onSubmit()
{outGetWeatherByWMOIDSoapIn.parameters-Global . gv—GetWeatherByWMOID; outGetWeatherByWMOIDSoapIn . send (); scr—Main . display (); }
function script—inGetWMOIDByCitySoapOut—onClose ( ) {scr—Main.display
();}
function script—WMOID一back () { Screen.back (); } flinction
inGetWMOIDByCitySoapOut—onMsgArrive() {scr—inGetWMOIDByCitySoapOut .display (); } function
script—outGetWMOIDByCitySoapIn一onSubmit()
{outGetWMOIDByCitySoapIn . parameters=Global . gv—GetWMOIDByCity ; outGetWMOIDByCitySoapIn . send (); scr—Main . display ();}lO.dtd (DTD (Document Type Definition)(文件类型定义)
以下定义应用105的示例文件结构。 <! ENTITY % commonFieldAttrs 'name CDATA舰QUIRED
type (string integer decimal boolean date data enumeration) "string"
component IDREF #IMPLIED
array (true false) "false"
<! ENTITY % commonCtrlAttrs 'name CDATA #REQUIRED inValue CDATA #IMPUED placement CDATA麵PL正D style IDREF #IMPLIED
,>
<! ENTITY % nestedCtrlElements'(region | label | separator | edit |textarea I image | singleChoice | multiChoice | button) *,> <!—root element: application -->
<! ELEMENT application (desc , dependency*, resource*, global*,
enumeration*, data*, message*, style*, screen*, script*) >
<!—URI will contain version information-)
<! —entry: main screen or first script to be executed—>
<! —dependency : could be multiple-->
<!—icon: icon resource—>
<!ATTLIST application
name CDATA #REQUIRED
uri CDATA #REQUIRED
entry IDREF釘MPL正D
vendor CDATA #IMPUED
version CDATA #IMPLIED
size CDATA #IMPUED
icon CDATA#IMPLED
persistence (reliable | performant) "performant" messageDelivery (standard | bestEffort | reliable ) "standard"
>
<! ELEMENT desc (#PCDATA)> <!ELEMENT dependency EMPTY> <! ATTLIST dependency
type (application | application | runtime | feature) "application
value CDATA IMPLIED
version CDATA IMPLIED
>
<! ELEMENT resource EMPTY>
<! --mimeType: text/xml, image/gif, image/jpeg, media/pme, ?—> <!ATTUST resource
name ID舰QUIRED
url CDATA #REQUIRED
mimeType CDATA #REQUIRED
deferred (true | false) "false"
>
<! ELEMENT global (value*) > <! ATTLIST global
o/ocommonFieldAttrs;
>
<! ELEMENT enumeration (value十)> <! ATTLIST enumeration
name ID #REQUIRED
>
<! ELEMENT value (#PCDATA)> <! ELEMENT data ( field* )>
<!—if key is not defined then the data is single instanced—>
<!-- Phase 2.0: data will include readonly (true | false) "false"—> <! ATTLIST data
name ID #REQUIRED
prototype CDATA #IMPUED
persist (true | false)弁IMPL正D
key CDATA顯PLIED
>
<! ELEMENT field EMPTY>
<! —default: default value for the field (e.g. true , @current , 12/07/03 @F:DD/MM/YY )—> < ! ATTLIST field
%commonFieldAttrs;
default CDATA #IMPUED
>
<! —script is used only for incoming messages :—>
<!—maps message to data—>
<! —script to process the msg-->
<!ELEMENT message ((field mappedField) *, alert )>
<!—prototype: parent message-->
<!—mapping :mapped data cmp-->
<! ATTLIST message
name ID #REQUIRED
prototype IDREF #IMPUED
script IDREF #IMPLIED
secure (true | false) #IMPLIED
>
<!—attrib mapping maps mfield to data, field—> 〈!ELEMENT mappedField EMPTY> <! ATTLIST mappedFieldname CDATA舰QUIRED mapping CDATA麵PLIED
>
<!ELEMENT alert EMPTY> <!-- perhaps an inbox alert later —> <!ATTLIST alert
beep (true | false) "false"
ribbon (true | false) "false"
dialogText CDATA #IMPUED
>
<!ELEMENT Style EMPTY〉 <!ATTLIST style
name ID #REQUIRED
font CDATA tt證LIED
size CDATA謹PL正D
bold (true | false) "false"
italic (true | false) "false"
underline (true | false) "false"
fgColor CDATA釘MPLIED
bgColor CDATA #IMPUED
bglmage IDREF #IMPUED
>
<!ELEMENT screen (parain*, var*, (%nestedCtrlElements; | repetition):
menu , onlnit ) >
<!--no menu for dialog-->
<!—attr refreshMsg points to message—>
〈!ATTLIST screen
name ID #REQUIRED
title CDATA tt酵L正D
dialog (true | false) "false"
layout (grid | flow | vertical) #REQUIRED
style IDREF #IMPUED
refreshMsg IDREFS #IMPLIED
>
<!-- local variable for a screen; can be mapped to —> <! ELEMENT var EMPTY> <!ATTLIST雷
name CD ATA #REQUIRED
component IDREF舰QUIRED
>
<! ELEMENT region (condition , %nestedCtrlElements;) > 〈!ATTLIST region
layout (grid | flow | vertical) #REQUIRED
placement CD ATA #IMPUED
style IDREF #IMPLIED
>
<!— item/control visibility condition—〉 <!ELEMENT condition EMPTY> 〈!ATTLIST condition
params CD ATA IMPLIED
script IDREF #REQUIRED
onTrue (show | hide) "show"
>
<!ELEMENT onlnit EMPTY〉 <!ATTLIST onlnit
params CDATA#IMPLIED
script IDREF弁IMPLIED
>
<! ELEMENT onChange EMPTY>
< !ATTLIST onChange
params CDATA #IMPUED script IDREF #IMPLIED

<!ELEMENT onFocusOut EMPTY〉 <!ATTLIST onFocusOut
params CDATA #IMPLIED
script IDREF #IMPUED
>
<!— transaction can be used to accept/rollback changes on the screen—>
<!ELEMENT onClick EMPTY>
<!ATTUST onClick
params CDATA #IMPUED
transition IDREF #IMPLIED
transaction (commit | rollback | none) "none"
>
<!— repetition control is a hydri,d of a region and a choice —> <!—its layout is inherited from the screen —> <! ELEMENT repetition %nestedCtrlElements;>
< !ATTLIST repetition
%commonQrl Attrs; mapping CDATA #IMPLIED collapsible (true | false) "false"
>
<! ELEMENT menu (item*)>
<! ELEMENT item (condition , onClick) >
<!ATTLIST item
name CDATA #REQUIRED
inValue CDATA IMPLIED

<!ELEMENT separator (condition ) > <!ATTLIST separator
%commonCtrl Attrs;
isWhitespace (true | false) "false"
>
<!ELEMENT label (condition , onInit )> <!ATTLIST label
9/ocommonCtrl Attrs;
>
<! ELEMENT edit (condition , onlnit , onFocusOut ) > <!ATTUST edit
%coiranonCtrl Attrs;
mapping CDATA麵PL正D
readonly (true | false) "false"
mandatory (true | false) "false"
type (number | currency | date | time | percentage | text | URL password i phone | email) "text"
format CDATA #IMPUED

<!--The textarea is multiline with dynamic scrollbar--> <!ELEMENT textarea (condition , onlnit , onFocusOut ) > <! ATTLIST textarea
%commonCtrl Attrs;
mapping CDATA #IMPLIED
readonly (true | false) "false"
mandatory (true | false) "false"
visibleRows CDATA #IMPLIED>
<! ELEMENT image (condition , onlnit ) > <!ATTUST image
o/ocommonCtrl Attrs;
resource IDREF ttlMPLIED
>
<!--readonly implies to selection change: if RO=true user cannot change selection-)
<!ELEMENT singleChoice (condition , onlnit , onChange )> <!ATTLIST singleChoice
%commonCtrl Attrs;
mapping CDATA ttlMPLIED
format CDATA #IMPUED
type (list I dropdown | radio) "radio"
visibleRows CDATA弁IMPL正D
>
〈!ELEMENT multiChoice (condition , onlnit , onChange )〉 <! ATTLIST multiChoice
%commonCtrl Attrs;
mapping CDATA麵PLIED
format CDATA #IMPLIED
type (list checkbox)—"checkbox"
mandatory (true | false) "false"
visibleRows CDATA針MPLIED
>
<! ELEMENT button (condition , onlnit , onClick)〉 <! ATTLIST button
%commonCtrl Attrs;
resource IDREF #IMPLIED>
<! ELEMENT script (param*)> <! ATTLIST script
name ID #REQUIRED
>
<! ELEMENT param EMPTY> <!ATTLISTparam
name CDATA ^REQUIRED
component IDREF #REQUIRED
>
尽管在这里披露了一个或多个示例系统和方法,熟悉本领域的人员应 当知道可以有许多变化,包括在图案648的说明中为了举例说明而使用的 适当编辑器600和阅读器602的替代,并且这些变化包括在本申请的范围 内。此外,应当知道,用户界面202和显示器206可以一起定义为工具116 的用户界面。尽管在提供的示例中使用了 XML和ECMAScript的一个子集, 但是,也可以将其他语言和语言变体用于定义组件应用程序。例如,可以 用建议的E4X标准脚本编写语言代替ECMAScript。此外,除了上述XML 之外的其他结构化定义语言可以包括资源描述框架(RDF), XSLT,和 XHTML,但不限于此。
权利要求
本发明的实施例其中要求独占优先权或专用权,定义如下1.一种用于生成屏幕组件的系统,所述系统被配置成在装置的图形用户界面上显示的屏幕中显现数据结构,所述屏幕组件用于包括在在装置上执行的应用中,并具有以用于定义数据结构的显现的结构化定义语言表达的定义,显现的数据结构与和通过网络在装置和数据源之间通信的消息相关联的数据内容有关,所述系统包括分析器模块,用于分析一组预定义消息和用结构化定义语言表达的数据定义,以识别对应的数据结构和与消息有关的消息细节,预定义消息和数据定义用于包括在应用中;屏幕模板,用于提供要在图形用户界面上显示的屏幕的代表示例;和屏幕组件生成模块,用于将预定义消息和数据细节应用程序到所述屏幕模板,以生成所述屏幕组件;其中预定义消息和数据定义和屏幕组件随后被组装到应用中。
1. 一种用于生成屏幕组件的系统,所述系统被配置成在装置的图形用 户界面上显示的屏幕中显现数据结构,所述屏幕组件用于包括在在装置上 执行的应用中,并具有以用于定义数据结构的显现的结构化定义语言表达 的定义,显现的数据结构与和通过网络在装置和数据源之间通信的消息相 关联的数据内容有关,所述系统包括分析器模块,用于分析一组预定义消息和用结构化定义语言表达的数 据定义,以识别对应的数据结构和与消息有关的消息细节,预定义消息和 数据定义用于包括在应用中;屏幕模板,用于提供要在图形用户界面上显示的屏幕的代表示例;和屏幕组件生成模块,用于将预定义消息和数据细节应用程序到所述屏 幕模板,以生成所述屏幕组件;其中预定义消息和数据定义和屏幕组件随后被组装到应用中。
2. 根据权利要求1所述的系统,进一步包括工作流模块,用于提供预 定义消息和数据细节的屏幕工作流,从而能够配置屏幕工作流以在屏幕组 件的生成中使用。
3. 根据权利要求2所述的系统,进一步包括脚本生成器,用于生成与 屏幕组件中定义的控制相关联的脚本。
4. 根据权利要求1所述的系统;其中所述屏幕组件代表从包括对话 框,到装置的输入消息,来自装置的输出消息,和数据组件的组中选择的 屏幕。
5. 根据权利要求4所述的系统;其中数据结构是从包括复杂类型,和简单类型的组中选择的。
6. 根据权利要求5所述的系统;其中复杂数据类型是从包括阵列, 堆栈,链接的列表,树,和类的组中选择的。
7. 根据权利要求5所述的系统;其中简单数据类型是从包括无线列 举,专用选择控制,字符串,布尔符号,日期,小数,和整数的组中选择 的。
8. 根据权利要求1所述的系统;其中所述屏幕组件代表包括如以预定 义消息和数据定义中描述的所有数据源操作的主控制台屏幕。
9. 根据权利要求1所述的系统,进一步包括映射模块,用于识别预定义消息定义和数据定义之间的字段级映射。
10. 根据权利要求9所述的系统;其中字段级映射将消息定义的特定字 段链接到数据定义的命名字段。
11. 一种用于生成屏幕组件的方法,所述屏幕组件被配置成在装置的图 形用户界面上显示的屏幕中显现数据结构,所述屏幕组件用于包括在用于 在装置上执行的应用中,并具有以用于定义数据结构的显现的结构化定义 语言表达的定义,显现的数据结构与通过网络在装置和数据源之间通信的 消息相关联的数据内容有关,所述方法包括步骤分析一组预定义消息和用结构化定义语言表达的数据定义,以识别对 应的数据结构和与消息有关的消息细节,预定义消息和数据定义用于包括在应用中;访问用于提供要在图形用户界面上显示的屏幕的代表示例的屏幕模 板;禾口将预定义消息和数据细节施加到屏幕模板上以生成屏幕组件; 其中预定义消息和数据定义和屏幕组件随后被组装到应用中。
12. 根据权利要求11所述的方法,进一步包括提供预定义消息和数据 细节的屏幕工作流,使得屏幕工作流被配置为供屏幕组件的生成而使用的 步骤。
13. 根据权利要求12所述的方法,进一步包括生成与屏幕组件中定义 的控制相关联的脚本的步骤。
14. 根据权利要求11所述的方法;其中屏幕组件代表从包括对话框, 进入到装置的消息,从装置外出的消息,和数据组件的组中选择的屏幕。
15. 根据权利要求14所述的方法;其中数据结构是从包括复杂类型, 和简单类型的组中选择的。
16. 根据权利要求15所述的方法;复杂数据类型是从包括阵列,堆 栈,链接的列表,树,和类的组中选择的。
17. 根据权利要求15所述的方法;其中简单数据类型是从包括无线 列举,专用选择控制,字符串,布尔符号,日期,小数,和整数的组中选 择的。
18. 根据权利要求11所述的方法,进一步包括将屏幕组件表示为主控制台屏幕的步骤,所述主控制台屏幕包括如在预定义消息和数据定义中描 述的所有数据源操作。
19. 根据权利要求11所述的方法,进一步包括识别预定义消息定义和 数据定义之间的字段级映射的步骤。
20. 根据权利要求19所述的系统;其中字段级映射将消息定义的特定字段链接到数据定义的命名的字段。
21. —种用于生成屏幕组件的计算机程序产品,所述屏幕组件被配置成 在装置的图形用户界面上显示的屏幕中显现数据结构,所述屏幕组件用于 包括在用于在装置上执行的应用中,并具有以用于定义数据结构的显现的 结构化定义语言表达的定义,显现的数据结构与通过网络在装置和数据源 之间通信的消息相关联的数据内容有关,所述计算机程序产品包括计算机可读介质;存储在计算机可读介质上的分析器模块,用于分析一组预定义消息和 用结构化定义语言表达的数据定义以识别对应的数据结构和与消息有关 的消息細节,预定义消息和数据定义用于包括在应用中;屏幕模板模块计算机可读介质,用于提供要在图形用户界面上显示的 屏幕的代表示例;和耦合到模板模块的屏幕组件生成模块,用于将预定义消息和数据细节 施加到屏幕模板,以生成屏幕组件;其中预定义消息和数据定义和屏幕组件随后被组装到应用中。
全文摘要
一种用于生成屏幕组件的系统和方法,所述屏幕组件被配置成在装置的图形用户界面上显示的屏幕中显现数据结构。屏幕组件包括在用于在装置上执行的应用程序中,并具有以用于定义数据结构的显现的结构化定义语言表达的定义。显现的数据结构与通过网络在装置和数据源之间通信的消息相关联的数据内容有关。该系统和方法包括分析器模块,用于分析一组预定义消息和用结构化定义语言表达的数据定义,以识别对应的数据结构和与消息有关的消息细节,预定义消息和数据定义用于包括在应用中;屏幕模板,用于提供要在图形用户界面上显示的屏幕的代表示例;和屏幕组件生成模块,用于将预定义消息和数据细节应用程序到所述屏幕模板,以生成所述屏幕组件;其中预定义消息和数据定义和屏幕组件随后被组装到应用中。
文档编号G06F9/44GK101198929SQ200680021854
公开日2008年6月11日 申请日期2006年4月18日 优先权日2005年4月18日
发明者丹尼尔·马德苏, 布赖恩·R·戈林, 迈克尔·谢菲尔德 申请人:捷讯研究有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1