具体实施方式
网络系统
参考图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接收网关AG URL和MDS115维修手册中的网关AG公共密钥。运行时环境RE利用这种信息连接到网关AG,以进行最初的握手(信息交换)。装置100供应或BES 113(根据域)将MDS 115维修手册提供到装置100。应当认识到,如果需要,网络10中可以有一个以上的网关AG。一旦被初始化,装置100可以经过网关AG以通信方式直接从应用系统信息中心库114直接存取(例如,下载/上载)应用105,和/或与数据源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定义了四种操作类型,例如,但不限于:操作可以接收消息但是不返回回答的单向(One-way)操作类型;操作可以接收请求并返回回答的请求-回答(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”>
<input message=”getTermRquest”/>
<output message=”getTermResponse”/>
</operation>
</portType>
<binding type=”glossaryTerms”name=”b1”>
<soap:binding stype=”document”
transport=http://schemas.xml soap.org/soap/http/>
<operation>
<soap:operation
soapAction=”http://example.com/getTerm”/>
<input>
<soap:body use=”literal”/>
</input>
<output>
<soap: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/DVD ROMS之类的光学可读介质、和存储卡。在每种情况下,计算机可读介质212可以采用小盘、软盘、盒式磁带、硬盘驱动器、固态存储卡、或提供在存储模块210中的RAM的形式。应当注意,以上列出的示例计算机可读介质212可以单独使用或组合使用。
再参考图2,设计工具116作为用于开发应用105的应用程序开发环境在计算机201上操作。工具116的开发方法理念可以基于建立应用程序视觉、数据、消息传送行为、和运行时导航模型的视觉“拖放”系统。可以将工具116构造为对于一般化的综合设计环境(IDE)框架的一组插件程序,例如,但不限于,Eclipse框架,或可以将工具116配置为不使用插件程序结构的完全设计体系结构。仅仅是为了举例说明的目的,现在把工具116描述为一种使用Eclipse框架的插件程序设计环境。
参考图2和6,Eclipse提供了一种可以扩展以提供客户编辑器、向导、项目管理、和其他多种不同功能的基本的一般工具116环境。设计Eclipse平台以便建立能够用于创建诸如网站、嵌入式Java TM程序、C++程序、和Enterprise JavaBeans TM之类的多种应用程序的综合开发环境(IDE)。导航器示图230显示用户(例如,开发人员)的工作区中的文件;文本编辑器部分232显示工具116的用户正在加工以开发应用105和相关的组件400、402、404、406(见图4)的文件;任务示图部分234显示工具116的用户的任务列表;和概要阅读器部分236显示,例如,正在设计/编辑的应用105的内容概要,和/或通过提供诸如在另一个示图中选择的对象的性质之类的有关当前选择的对象的信息添加其他示图。应当认识到,工具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_1.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 MarkupLanguage(XML)和ECMAScript的子集写的人为产品301的软件应用程序。XML和ECMAScript是允许软件开发人员以可移动和平台独立的方式开发组件应用105的基于标准的语言。组件应用105的方框图包括数据组件400,显现组件402,和消息组件404,这些组件是由工作流组件406通过与提供在装置100上的客户运行时环境RE(见图1)互动而协调的。结构化定义语言(例如,XML)可以用于将组件400、402、404构造为一系列元数据记录,这些元数据记录包括多个代表资源的特定属性从而使每个元素能够具有一个或更多的值的预定义元件。每个元数据模式一般具有定义的特征,例如,但不限于:有限数量的元素、每个元素的名称、和每个元素的意义。示例元数据模式包括,例如,但不限于:Dublin Core(DC),Anglo-American Cataloging Rules(AACR2),Government InformationLocator Service(GILS),Encoded Archives Dscription(EAD),IMS GlobalLearning Consortium(IMS),和Australian Government Locator Service(AGLS)。编码语法允许通过运行时环境RE(见图1)处理的组件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(见图1)到达时要执行的动作。显现、工作流、和消息处理过程是由工作流组件406定义的。如上所述,用一种编程语言(例如,面向对象的编程语言)和/或诸如,但不限于,ECMAScript之类的脚本语言将工作流组件406写为一系列的指令,和可以被编译成本机代码并通过运行时环境206执行。工作流组件406的一个例子可以是给数据赋值,操作屏幕,或发送消息105。如同显现组件一样,可以创建多个工作流定义,以支持不同装置100之间变化的能力和特征。ECMA(EuropeanComputer Manufactures Association(欧洲计算机制造商协会))Script是一种标准脚本语言,其中可以将脚本称为一个指令序列,这个指令序列是由另一个程序翻译或执行的,而不是由计算机处理器翻译和执行。脚本语言的一些其他例子是Perl,Rexx,VBScript,JavaScript,和Tcl/Tk。脚本语言一般是用于操纵、定制、和自动化诸如装置100之类的现有系统的设施的指令性语言。
参考图4,应用105是利用组件体系结构构造的,以便当装置100(见图1)接收到来自于应用网关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 CDATA#IMPLIED
vendor CDATA#IMPLIED
version CDATA#IMPLIED
transportKey CDATA#IMPLIED
installNotifURL CDATA#IMPLIED
registerURL CDATA#IMPLIED
>
<!ELEMENT desc(#PCDATA)>
<!ELEMENT iconUrl(#PCDATA)>
<!ELEMENT res(#PCDATA)>
<!ATTLIST res
name CDATA#REQUIRED
url CDATA#REQUIRED
type(xml|image|sound|any)#REQUIRED
deferred(true|false)”false”
>
示例数据组件400
<!ELEMENT wcData(dfield+)>
<!ATTLIST wcData
name CDATA#REQUIRED
persisted(true|false)”true”
>
<!ELEMENT dfield(#PCDATA)>
<!ATTLIST dfield
name CDATA#REQUIRED
type(String|Number|Boolean|Date|Any)”Any”
array(true|false)”false”
cmp(true|false)”false”
cmpName CDATA#IMPLIED
key(0|1|2)”0”
>
示例消息组件404
<!ELEMENT wcMsg(mfield*)>
<!ATTLIST wcMsg
name CDATA#REQUIRED
mapping CDATA#IMPLIED
>
<!ATTLIST wcMsg
pblock CDATA#IMPLIED
>
<!ELEMENT mfield(#PCDATA)>
<!ATTLIST mfield
name CDATA#REQUIRED
type(String|Number|Boolean|Date|Array|XML)#IMPLIED
mapping CDATA#IMPLIED
>
示例显现组件402
<!ELEMENT wcScr(layout?,menu?,refresh?,event?)>
<!ATTLIST wcScr
name CDATA#REQUIRED
title CDATA#IMPLIED
main(true|false)”false”
dialog(true|false)”false”
param CDATA#IMPLIED
>
<!ELEMENT style(font?)>
<!ATTLIST style
name CDATA#REQUIRED
bgColor CDATA#IMPLIED
>
<!ELEMENT font EMPTY>
<!ATTLIST font
name CDATA#REQUIRED
color CDATA#IMPLIED
size CDATA#IMPLIED
bold(true|false)”false”
italic(true|false)”false”
underline(true|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 CDATA#IMPLIED
placement CDATA#IMPLIED
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 CDATA#IMPLIED
pblock CDATA#IMPLIED
param CDATA#IMPLIED
acceptChanges(true|false)”false”
>
<!ELEMENT condition EMPTY>
<!ATTLIST condition
pblock CDATA#REQUIRED
param CDATA#IMPLIED
result(true|false)”true”
>
<!ELEMENT event EMPTY>
<!ATTLIST event
type(onlnit|onClick|onChange|onFocusOut)”onlnit”
pblock CDATA#IMPLIED
screen CDATA#IMPLIED
param CDATA#IMPLIED
>
<!ELEMENT separator EMPTY>
<!ELEMENT label(condition?,event?)>
<!ATTLIST label
name CDATA#REQUIRED
value CDATA#REQUIRED
placement CDATA#IMPLIED
style CDATA#IMPLIED
>
<!ELEMENT edit(condition?,event)>
<!ATTLIST edit
name CDATA#REQUIRED
value CDATA#IMPLIED
mapping CDATA#IMPLIED
type(char|number|date|pwd|phone|email)”char”
readOnly(true|false)”false”
placement CDATA#IMPLIED
style CDATA#IMPLIED
>
<!ELEMENT textarea(condition?,event?>
<!ATTLIST textarea
name CDATA#REQUIRED
value CDATA#IMPLIED
mapping CDATA#IMPLIED
readOnly(true|false)”false”
placement CDATA#IMPLIED
style CDATA#IMPLIED
>
<!ELEMENT image(condition?,event?>
<!ATTLIST image
name CDATA#REQUIRED
resName CDATA#REQUIRED
placement CDATA#IMPLIED
>
<!ELEMENT choice(condition?,event?,entry?)>
<!ATTLIST choice
name CDATA#REQUIRED
value CDATA#IMPLIED
mapping CDATA#IMPLIED
type(singleList|multiList|dropdown|checkbox|radio)”singleL
ist”
readOnly(true|false)”false”
placement CDATA#IMPLIED
style CDATA#IMPLIED
>
<!ELEMENT entry(#PCDATA)>
<!ELEMENT button(condition?,event?)>
<!ATTLIST button
name CDATA#REQUIRED
label CDATA#REQUIRED
image(true|false)”false”
placement CDATA#IMPLIED
style CDATA#IMPLIED
>
示例工作流组件406
<!ELEMENT wcFlow(pblock+)>
<!ELEMENT pblock(#PCDATA)>
<!ATTLIST pblock
id CDATA#REQUIRED
param CDATA#IMPLIED
>
如下所示,为了处理其他组件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=″1″/>
<dfield name=″passwordHash″type=″String″/>
<dfield name=″street″type=″String″/>
<dfield name=″city″type=″String″/>
<dfield name=″postal″type=″String″/>
<dfield name=″phone″type=″String″/>
</wcData>
<wcData name=″OrderStatus″>
<dfield name=″confNumber″type=″Number″key=″1″>
<dfield name=″status″type=″String″/>
<dfield name=″datetime″type=″Date″/>
</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″/>
<dfield name=″orderStatus″cmp=″true″cmpName=″OrderStatus″/>
</wData>
<wcData name=″Special″>
<dfield name=″desc″key=″1″type=″String″/>
<dfield name=″price″type=″Number″/>
</wcData>
<wcMsg name=″inAddSpecial″mapping=″Special″>
</wcMsg>
<wcMsg name=″inRemoveSpecial″pblock=″mhRemoveSpecial″>
<mfield name=″desc″mapping=″Special.desc″/>
</wcMsg><wcMsg name=″inOrderStatus″>
<mfield name=″orderld″mapping=″Order.orderld″/>
<mfield name=″status″mapping=″Order.orderStatus″/>
</wcMsg>
<wcMsg name=″inUserlnfo″mapping=″User″>
</wcMsg>
<wcMsg name=″out[theta]rder″>
<mfield name=″special″mapping=″Order.special″/>
<mfield name=″user″mapping=″Order.user″/>
<mfield name=″datetime″mapping=″Order.datetime″/>
</wcMsg>
<wcScr name=″scrSpecials″title=″Specials″main=″true″>
<layout type=″flow″>
<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″/>
</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″>
<event type=″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=″lbl Street″value=″Street:/>
<edit name=″street″ mapping=″User.street″
type=″char″/>
</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:″/>
<edit name=″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″/>
</item>
</menu>
</wcScr>
<wcScr name=″scrOrderStatus″title=″Order status″param=″Order[]″>
<layout type=″vertical″param=″%″>
<layout type=″flow″>
<label name=″lblSpecialr″value=″Special:″/>
<label name=″lblSpecialMapped″
value=″@Order[].special″/>
</layout>
<layout type=″flow″>
<label name=″lblConfNumber″ value=″Confirmation
number:″/>
<label name=″lblConfNumberMapped″
value=″@Order[].orderStatus.confNumber″/>
</layout>
<layout type=″glow″>
<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:″/>
<label name=″lblConfDateMapped″
value=″@Order[].orderStatus.datetime″/>
</layout>
<separator/>
</layout>
<menu>
<item name=″continue″label=″Continue″>
<action screen=″scrSpecials″/>
</item>
</menu>
<refresh>
<msg>inOrderStatus</msg>
</refresh>
</wcScr>
<wcScr name=″scrOrdersList″title=″Previous Orders″>
<layout type=″vertical″>
<label name=″lbllnstructions″value=″Select one or more order:
″/>
<choice name=″ml[theta]rderl_ist″value=″@Order[].datetime+
′-′+@Order[].special″mapping=″Order[]″type=″multil_ist″/>
</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();
}else{
Dialog.displayflnvalid login!″);
}
</pblock>
<pblock id=″ahSendOrder″param=″User″>
Order.orderld=Util.guid();
Order.special=scrSpecials.sISpecials.selected;
Order,user=User;
Order.datetime=scrDelivery.date;
OrderStatus.confNumber=Util.guid();
OrderStatus.status=″Sent.Pending response.″;
OrderStatus.date=Util.currentDate();
Order.orderStatus=OrderStatus;
outOrder.send();
scrOrderStatus.display(Order);
</pblock>
<pblock id=″mhRemoveSpecial″param=″inRemoveSpecial″>
Special.desc=inRemoveSpecial.desc;
Special.deleteO;
</pblock>
</wcFlow>
</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。orderId主关键字段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的orderId字段关键码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;开发途径(Development 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的说明(例如,消息,操作,数据类型)提供界面;和/或为通知服务(例如,通过网络向装置100(见图1)发送通知的那些通知服务)的识别提供准备。后端连接器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中,意味着第三部件可以通过建立新的唯一SkinId(一个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),例如,将EclipseUI框架连接到工具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。
下面的命令是可以影响UI层606的其他有关模块601的示例命令:ComponentAdded-组件(即,屏幕,数据等等)已经添加到应用105;ComponentRemoved-组件已经从应用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和11,示出了运行时建立服务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,如果成功,这个命令触发数据模型608的DataBindingChanged和ScreenParameterListChanged。屏幕编辑器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中或从其去除字段时发送的AddRemoveFields。消息编辑器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;在开发人员要脚本的列表以访问屏幕导航事件时发送的QueryScript;在开发人员要在上面键入屏幕转变的回答消息(包括通知)的列表时发送的QueryArrivingMessages;在开发人员要把工作流中已经不存在的新屏幕、消息、或脚本添加到工作流中时发送的AddComponent,如果成功,这个命令触发数据模型608的ComponentAdded;和在开发人员把新导航添加到工作流时发送的ChangeNavigation,如果成功,这个命令触发数据模型608的NavigationChanged。
工作流编辑器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的示例输入事件可以包括,但不限于,以下事件:例如,ComponentRemoved,开发人员(工具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数据库)的注册器请求ServicesInterface(服务界面)。返回可以通过名称或通过迭代法查询的这种类型的服务的列表。
编辑器716可以编辑的示例命令包括以下命令:例如,在开发人员添加新消息时发送的AddComponent,如果成功,这个命令触发数据模型608的CompoenetAdded;和在开发人员将消息连接到选定后端数据源106时发送的SpecifyMapping,但不限于此。编辑器716的示例输入事件包括以下事件:例如,ComponentRemoved,开发人员(工具116的用户)用其检查,看看组件是否是消息,后端观测器为该消息调节它的映射;ComponentRenamed具有与ComponentRemoved相同的效益;和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,但不限于此。
阅读器822的示例输入事件包括以下事件:例如,用于在添加了组件时,导航器822刷新它的项目应用105的视图的ComponentAdded,和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,以及装置100的用户作出的数据输入,但不限于此。
生成的组件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相关联的消息的脚本,例如,但不限于此:
outGetQuickQuotesSoapIn.parameters=gv_GetQuickQuotesSoapIn.parameters;
outGetQuickQuotesSoapIn.Header=gv_GetQuickQuotesSoapIn.Header;
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,并且是与上面的格式相同的格式的,即,例如:
无线列举:专用选择控制(格式下拉);
字符串:编辑框(格式文本);
布尔型:多选择控制(格式检验栏);
日期:编辑框(格式日期);
二进制、长和整数:编辑框(格式文本或数字);和
无线数据组件:“Details”按纽,
但不限于。如上所述,应当知道,数据组件的布尔类型的可选实施例是,类型可以如下表示:对于结合于外出消息的屏幕,表示为单一选择控制(格式单选按纽);和对于结合于进入消息的屏幕,表示为编辑框(格式文本)。应当知道,这个可选实施例可以提供表示布尔值的更为方便和自然的方式,因为单选按钮控制更适合于表示布尔值(真或假)。
消息和数据组件的生成屏幕的所有控制可以具有初始值和输出映射。对于进入无线消息的屏幕624的(和也用于结合于这些进入消息的细节屏幕(未示出)的)控制322,初始值可以具有如下示例格式:
对于阵列:@gv_QuickQuote_Array[].Outcome;和
对于非阵列:@gv_WRecipe.Name。
对于结合于外出消息的屏幕626和它们的细节屏幕628(见图26e),初始值可以是空白。输出映射用于其值要进一步发送(例如,发送到细节屏幕628)的控制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)基础上,进一步分解,例如,但不限于:
步骤S10,对于结合与输入454的选定数据源106操作的所有无线消息(进入或外出),在通过分析器456分析以产生细节458a,b,c时,创建代表消息字段524的类型526的(见图24a),与每个无线数据组件相关联的无线全局变量;
步骤S20,在步骤S10创建的全局变量可以用于通过引擎464(例如)(如果开发人员使用引擎464的话),创建无线消息与无线数据组件之间的字段级映射911(见图20a)。这样,在运行时,可以将无线数据组件的值绑定到无线消息;
步骤S30,对于每个无线消息(进入的或外出的),通过引擎464根据工作流461创建对应于无线屏幕组件402,从而对于结合与(在装置100与应用网关AG之间通信的,见图1)无线消息的每个上述屏幕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项目,问题包括,例如:对于诸如Web Services、在前的应用程序、当前数据库配置、或这些元件的某种组合之类的现有元件的框架的限制,但不限于此。然后,开发人员在1404审阅可能影响途径图案650选择的设计参数,这些设计参数可以包括以下参数:例如,有具有充分了解的工作流和/或需要通过应用105模拟的屏幕的现有应用程序操作;可能有要连接在后端上的特殊数据源106,和希望根据这个特殊数据源106规划模型化应用105;可能有应用程序应当与之互动,因此不能对该WebServices(数据源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被禁止使用对应的WebServices界面,那么在步骤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中存在的问题是:你如何聪明和有效地建立加工现有WebServices或其他数据源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的其他设施)指导开发人员,仅通过示例的方式:
1.在步骤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”,和“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 name=”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 script=”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();
</script>
<script name=”sendMsgBGotoB”params=”b”>
B.send(b)
ScrB.display();
</script>
示例B:(不正确方式)
<script name=”fromScreen”>
<button name=”submitToScreenAOrB”>
<event script=”sendAndBranchAOrB”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.可以是另一种数据类型(例如,Data1.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.如果一个映射的数据类型是其他数据类型的嵌套字段:Data1.x,x的类型是Data2,
I.工具116推荐将Data2的实例设置到Data1字段x。
II.生成执行设置操作的工作流组件406的脚本
ii.如果一个映射的数据类型是其他数据类型上的嵌套集合的基本类型:Data1.x,x的类型是Data2,
I.工具116推荐可以执行附加(add)或除去(remove),
II.开发人员选择首选的选项和生成工作流组件406的相关脚本;
3.在字段映射被规定为没有被主要关键映射相关的数据类型的情况下
a.工具116可以提示开发人员是否应当用该字段值更新这个数据类型的集合中的每个实例,
i.可以经过where字句规定整个集合的子集,
I.工具116提示数据类型的条件字段,
II.工具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.开发人员可以测试选择控制是否为空(真或假),
II.开发人员可以测试是否选择了特定索引,
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(即,方案),
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.开发人员可以指示增加另一个过滤器部件(布尔表达式),与&&或||运算符结合;
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的堆叠(垂直)布置1602,
ii.对于少于4个可视通知信息字段1604,推荐字段的排成一行(流水)布置,
b.开发人员指示用户是否要
i.观看结果和在同页上修改过滤器,
I.优点:翻动较少的页
II.缺点:焦点浏览每个可编辑过滤器字段,
III.参考图17看下面合并的屏幕讨论,
ii.观看结果和再在一个分离页上修改过滤器,
I.优点:通知的快速滚动,
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.开发人员指示给最终过滤部件加入运算符&&,
k.开发人员从通知指出字段weatherOriginal,
l.开发人员指示运算符!=,
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=″1.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:
secure=″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=″s0:PostalCode″map:mapType=″
element″
map:name=″PostalCode″/>
<map:field map:mapName=″s0:LicenseKey″map:mapType=″
element″
map:name=″LicenseKey″/>
</map:component>
<map:component map:mapName=″s0:GetWeatherByZipSoapOut″
map:mapType=″message″map:name=″inGetWeatherByZipSoapOut″map:
secure=″false″>
<map:field map:mapName=″parameters″map:mapType=″part″
map:name=″parameters″/>
</map:component>
<map:component map:map Name=″s0:GetWeatherByZipResponse″
map:map Type=″element″map:name=″GetWeatherByZipResponse″>
<map:field map:map Name=″sO:GetWeatherByZipResult″
map:mapType=″element″map:name=″GetWeatherByZipResult″/>
</map:component>
<map : component map :mapName= ″ s0 :Weather″
map:mapType=″complexType″map:name=″Weather″>
<map:field map :mapName= ″ s0 : Error″ map :mapType=″
element″
map:name=″Error″/>
<map:field map:mapName=″s0:LastUpdated″map:mapType=″
element″
map:name=″LastUpdated″/>
<map : field map :mapName= ″ s0 :TemperatureF″
map:mapType=″element″
map:name=″TemperatureF″/>
<map:field map:mapName=″s0:Windchill″ map :mapType=″
element″
map:name=″Windchill″/>
<map:field map:mapName=″s0:HeatIndex″map:mapType=″
element″
map:name=″HeatIndex″/>
<map:field map:mapName=″s0:Humidity″map:mapType=″
element″
map:name=″Humidity″/>
<map: field map:mapName=″s0 :Dewpoint″
map:mapT[gamma]pe=″element″
map:name=″Dewpoint″/>
<map:field map:mapName=″s0:Wind″ map:mapType=″element″
map:name=″Wind″/>
<map:field map:mapName=″s0:Pressure″map:mapType=″
element″
map:name=″Pressure″/>
<map:field map:mapName=″s0:Conditions″map:mapType=″
element″
map:name=″Conditions″/>
<map:field map :mapName=″s0:Visibility″map:mapType=″
element″
map:name=″Visibility″/>
<map:field map:mapName=″s0:Sunrise″map:mapType=″
element″
map:name=″Sunrise″/>
<map:field map:mapName=″s0:Sunset″map:mapType=″
element″
map:name=″Sunset″/>
<map:field map:mapName=″s0:City″map:mapType=″
element″
map:name=″City″/>
<map:field map:mapName=″s0:State″map :mapType=″
element″
map:name=″State″/>
<map:field map:mapName=″s0:Moonrise″map:mapType=″
element″
map:name=″Moonrise″/>
<map: field map : mapName=″s0 :Moonset″
map:mapType=″element″
map:name=″Moonset″/>
<map: field map:mapName=″s0 : Precipitation″
map:mapType=″element″
map:name=″Precipitation″/>
<map:field map:mapName=″s0:Country″map:mapType=″
element″
map:name=″Country″/>
</map:component>
<map:component map:mapName=″s0:Err″map :mapType=″
complexType″
map:name=″Err″>
<map:field map:mapName=″s0:Desc″map:mapType=″element″
map:name=″Desc″/>
<map:field map:mapName=″sO:Number″map:mapType=″
element″
map:name=″Number″/>
<map: field map:mapName=″s0:Location″ map :mapType=″
element″
map:name=″Location″/>
</map:component>
<map: component map:mapName= ″
s0 :GetWeatherByCityStateSoapIn″ 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=″s0:GetWeatherByCityState″
map:mapType=″element″map:name=″GetWeatherByCityState″>
<map:field map:mapName=″s0:City″map :mapType=″element″
map:name=″City″/>
<map:field map:mapName=″s0:State″map:mapType=″element″
map:name=″State″/>
<map:field map:mapName=″s0:LicenseKey″map:mapType=″
element″
map:name=″LicenseKey″/>
</map:component>
<map : component map :mapName= ″s0 :
GetWeatherByCityStateSoapOut″
map:mapType=″message″map:name=″inGetWeatherByCityStateSoapOut
″
map:secure=″false″>
<map:field map:mapName=″parameters″map:mapType=″part″
map:name=″parameters″/>
</map:component>
<map : component map :mapName= ″s0 :
GetWeatherByCityStateResponse″
map:mapType=″element″map:name=″GetWeatherByCityStateResponse″>
<map:field map:mapName=″s0:GetWeatherByCityStateResult″
map:mapType=″element″map:name=″GetWeatherByCityStateResult″/>
</map:component>
<map:component map:mapName=″s0:GetWeatherByIPSoapIn″
map :mapType=″message″ map:name=″outGetWeatherByIPSoapIn″
map:secure=″false″>
<map:field map:mapName=″parameters″map:mapType=″part″
map:name=″parameters″/>
</map:component>
<map : component map:mapName=″sO :GetWeatherByIP″
map:mapType=″element″map:name=″GetWeatherByIP″>
<map:field map:mapName=″s0:IPAddress″map:mapType=″
element″map:name=″IPAddress″/>
<map:field map:mapName=″s0: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:component>
<map:component map:mapName=″s0:GetWeatherByIPResponse″
map:mapType=″element″map:name=″GetWeatherByIPResponse″>
<map: field map:mapName=″s0 :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
″
map:name=″parameters″/>
</map:component>
<map : component
map:mapName=″s0:GetWeatherHistoricalByZip″map:mapType=″element″
map:name=″GetWeatherHistoricalByZip″>
<map:field map:mapName=″s0:PostalCode″map:mapType=″
element″
map:name=″PostalCode″/>
<map:field map:mapName=″s0:Date″map:mapType=″
element″map:name=″Date″/>
<map:field map:mapName=″s0:Time″map:mapType=″
element″
map:name=″Time″/>
<map:field map:mapName=″s0: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 : component
map:mapName=″s0: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= ″ s0 :
GetWeatherByWMOIDSoapIn″map:mapType=″message″map:name=″
outGetWeatherByWMOIDSoapIn″map:secure=″false″>
<map:field map:mapName=″parameters″map:mapType=″part″
map:name=″parameters″/>
</map:component>
<map:component map:mapName=″s0:GetWeatherByWMOID″
map:mapType=″element″map:name=″GetWeatherByWMOID″>
<map:field map:mapName=″s0:WMOID″map:mapType=″
element″map:name=″WMOID″/>
<map:field map:mapName=″s0:LicenseKey″map;mapType=″
element″map:name=″LicenseKey″/>
</map:component>
<map : component map :mapName= ″ s0 :
GetWeatherByWMOIDSoapOut″map:mapType=″message″map:name=″
inGetWeatherByWMOIDSoapOut″map:secure=″false″>
<map:field map:mapName=″parameters″map:mapType=″part″
map:name=″parameters″/>
</map:component>
<map: component
map:mapName=″s0:GetWeatherByWMOIDResponse″map:mapType=″
element″map:name=″GetWeatherByWMOIDResponse″>
<map:field map:mapName=″s0: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:component>
<map: component map:mapName=″s0 :GetWMOIDByCity″
map:mapType=″element″map:name=″GetWMOIDByCity″>
<map:field map:mapName=″s0:City″map:mapType=″element″
map:name=″City″/>
<map:field map:mapName=″s0:LicenseKey″map:mapType=″
element″map:name=″LicenseKey″/>
</map:component>
<map:component map:mapName=″s0:
GetWMOIDByCitySoapOut″map:mapType=″message″map:name=″
inGetWMOIDByCitySoapOut″map:secure=″false″>
<map:field map:mapName=″parameters″map:mapType=″part″
map:name=″parameters″/>
</map:component>
<map:component map:mapName=″s0:GetWMOIDByCityResponse″
map:mapType=″element″map:name=″GetWMOIDByCityResponse″>
<map: field map:mapName=″s0:GetWMOIDByCityResult″
map:mapType=″element′map:name=″GetWMOIDByCityResult″/>
</map:component>
<map:component map:mapName=″s0:WMOIDInfo″
map:mapType=″complexType″map:name=″WMOIDInfo″>
<map:field map:mapName=″s0:WMOIDItern″map:mapType=″
element″map:name=″WMOIDItern″/>
<map:field map:mapName=″s0:Error″map:mapType=″
element″map:name=″Error″/>
</map:component>
<map : component map :mapName=″s0:WMOID″
map:mapType=″complexType″map:name=″WMOID″>
<map:field map:mapName=″s0:City″map:mapType=″element″
map;name=″City″/>
<map:field map:mapName=″s0:Region″map:mapType=″
element″map:name=″Region″/>
<map:field map:mapName=″s0:Country″map:mapType=″
element″map:name=″Country″/>
<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 : output map : 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=″gualifie d″
targetNamespace=″http://www.serviceobj ects.com/″>
<s:element name=″GetWeatherByZip″>
<s:complexType>
<s:sequence>
<s: element minoccurs=″0″maxoccurs=″1″ name=″PostalCode″
type=″s:string″/>
<s:element minoccurs=″0″maxoccurs=″1″name=″LicenseKey″
type=″s:string″/>
</s:sequence>
</s:complexType>
</s:element>
<s:element name=″GetWeatherByZipResponse″><s:complexType>
<s:sequence>
<s: element minoccurs=″0″ maxoccurs=″1″
name=″GetWeatherByZipResult″type=″s0:Weather″/>
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name=″Weather″>
<s:sequence>
<s: element minoccurs=″0″ maxoccurs=″1″ name=″Error″
type=″s0:Err″/>
<s: element minoccurs=″0″ maxoccurs=″1″ name=″LastUpdated″
type=″s:string″/>
<s: element minoccurs=″0″maxoccurs=″1″name=″TemperatureF″
type=″s:string″/>
<s:element minoccurs=″0″maxoccurs=″1″name=″Windchill″type=″s:
string″/>
<s:element minoccurs=″0″maxoccurs=″1″name=″HeatIndex″type=″
s:string″/>
<s:element minoccurs=″0″maxoccurs=″1″name=″Humidity″type=″s:
string″/>
<s:element minoccurs=″0″maxoccurs=″1″name=″Dewpoint″type=″s:
string″/>
<s:element minoccurs=″0″maxoccurs=″1″name=″Wind″ type=″s:
string″/>
<s:element minoccurs=″0″maxoccurs=″1″name=″Pressure″type=″s:
string″/>
<s:element minoccurs=″0″maxoccurs=″1″name=″Conditions″type=″
s:string″/>
<s:element minoccurs=″0″maxoccurs=″1″name=″Visibility″type=″s:
string″/>
<s:element minoccurs=″0″maxoccurs=″1″name=″Sunrise″type=″s:
string″/>
<s:element minoccurs=″0″maxoccurs=″1″name=″Sunset″type=″s:
string″/>
<s:element minoccurs=″0″maxoccurs=″1″name=″City″type=″s:
string″/>
<s:element minoccurs=″0″maxoccurs=″1″name=″State″type=″s:
string″/>
<s:element minoccurs=″0″maxoccurs=″1″name=″Moonrise″type=″s:
string″/>
<s:element minoccurs=″0″maxoccurs=″1″name=″Moonset″type=″s:
string″/>
<s:element minoccurs=″0″maxoccurs=″1″name=″Precipitation″
type=″s:string″/>
<s:element minoccurs=″0″maxoccurs=″1″name=″Country″type=″s:
string″/>
</s:sequence>
</s:complexType>
<s:complexType name=″Err″>
<s:sequence>
<s:element minoccurs=″0″maxoccurs=″1″name=″Desc″type=″s:
string″/>
<s:element minoccurs=″0″maxoccurs=″1″name=″Number″type=″s:
string″/>
<s:element minoccurs=″0″maxoccurs=″1″name=″Location″type=″s:
string″/>
</s:sequence>
</s:complexType>
<s:element name=″GetWeatherByCityState″>
<s:complexType>
<s:sequence>
<s:element minoccurs=″0″maxoccurs=″1″name=″City″type=″s:
string″/>
<s:element minoccurs=″0″maxoccurs=″1″name=″State″type=″s:
string″/>
<s: element minoccurs=″0″ maxoccurs=″1″ name=″LicenseKey″
type=″s:string″/>
</s:sequence>
</s:complexType>
</s:element>
<s:element name=″GetWeatherByCityStateResponse″>
<s:complexType>
<s:sequence>
<s: element minoccurs=″0″ maxoccurs=″1″
name=″GetWeatherByCityStateResult″type=″s0:Weather″/>
</s:sequence>
</s:complexType>
</s:element>
<s:element name=″GetWeatherByIP″>
<s:complexType>
<s:sequence>
<s:element minoccurs=″0″maxoccurs=″1″name=″IPAddress″
type=″s:string″/>
<s:element minoccurs=″0″maxoccurs=″1″ name=″LicenseKey″
type=″s:string″/>
</s:sequence>
</s:complexType>
</s:element>
<s:element name=″GetWeatherByIPResponse″>
<s:complexType>
<s:sequence>
<s: element minoccurs=″0″ maxoccurs=″1″
name=″GetWeatherByIPResult″type=″s0:Weather″/>
</s:sequence>
</s:complexType>
</s:element>
<s:element name=″GetWeatherHistoricalByZip″>
<s:complexType>
<s:seguence>
<s:element minoccurs=″0″maxoccurs=″1″name=″PostalCode″
type=″s:string″/>
<s:element minoccurs=″0″ maxoccurs=″1″ name=″Date″
type=″s:string″/>
<s:element minoccurs=″0″maxoccurs=″1″name=″Time″type=
″s:string″/>
<s:element minoccurs=″0″maxoccurs=″1″name=″LicenseKey″
type=″s:string″/>
</s:sequence>
</s:complexType>
</s:element>
<s:element name=″GetWeatherHistoricalByZipResponse″>
<s:complexType>
<s:sequence>
<s: element minoccurs=″0″ maxoccurs=″1″
name=″GetWeatherHistoricalByZipResult″type=″s0:Weather″/>
</s:sequence>
</s:complexType>
</s:element>
<s:element name=″GetWeatherByWMOID″>
<s:complexType>
<s:sequence>
<s:element minoccurs=″0″maxoccurs=″1″name=″WMOID″
type=″s:string″/>
<s:element minoccurs=″0″maxoccurs=″1″name=″LicenseKey″
type=″s:string″/>
</s:sequence>
</s:complexType>
</s:element>
<s:element name=″GetWeatherByWMOIDResponse″>
<s:complexType>
<s:sequence>
<s: element minoccurs=″0″ maxoccurs=″1″
name=″GetWeatherByWMOIDResult″type=″s0:Weather″/>
</s:sequence>
</s:complexType>
</s:element>
<s:element name=″GetWMOIDByCity″>
<s:complexType>
<s:sequence>
<s:element minoccurs=″0″maxoccurs=″1″name=″City″type=
″s:string″/>
<s:element minoccurs=″0″maxoccurs=″1″name=″LicenseKey″
type=″s:string″/>
</s:sequence>
</s:complexType>
</s:element>
<s:element name=″GetWMOIDByCityResponse″>
<s:complexType>
<s:sequence>
<s: element minoccurs=″0″ maxoccurs=″1″
name=″GetWMOIDByCityResult″type=″s0:WMOIDInfo″/>
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name=″WMOIDInfo″>
<s:sequence>
<s: element min0ccurs=″0″ maxoccurs=″unbounde d″
name=″WMOIDItem″type=″s0:WMOID″/>
<s:element minoccurs=″0″ maxoccurs=″1″ name=″Error″
type=″s0:Err″/>
</s:sequence>
</s:complexType>
<s:complexType name=″WMOID″>
<s:sequence>
<s:element min0ccurs=″0″maxoccurs=″1″name=″City″type=″s:
string″/>
<s:element minoccurs=″0″maxoccurs=″1″name=″Region″type=″s:
string″/>
<s:element minoccurs=″0″maxoccurs=″1″name=″Country″
type=″s:string″/>
<s: element minoccurs=″0″ maxoccurs=″1″ 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=″s0:GetWeatherByZip″ name=″parameters″/>
</message>
<message name=″GetWeatherByZipSoapOut″>
<part element=″s0:GetWeatherByZipResponse″name=″parameters″/>
</message>
<message name=″GetWeatherByCityStateSoapIn″>
<part element=″s0:GetWeatherByCityState″name=″parameters″/>
</message>
<message name=″GetWeatherByCityStateSoapOut″>
<part element=″s0 :GetWeatherByCityStateResponse″ name=
″parameters″/>
</message>
<message name=″GetWeatherByIPSoapIn″>
<part element=″s0:GetWeatherByIP″name=″parameters″/>
</message>
<message name=″GetWeatherByIPSoapOut″>
<part element=″s0:GetWeatherByIPResponse″name=″parameters″/>
</:message>
<message name=″GetWeatherHistoricalByZipSoapIn″>
<part element=″s0:GetWeatherHistoricalByZip″ name=″parameters″/>
</message>
<message name=″GetWeatherHistoricalByZipSoapOut″>
<part element=″s[theta] :GetWeatherHistoricalByZipResponse″
name=″parameters″/>
</message>
<message name=″GetWeatherByWMOIDSoapIn″>
<part element=″s0:GetWeatherByWMOID″name=″parameters″/>
</message>
<message name=″GetWeatherByWMOIDSoapOut″>
<part element=″s0 :GetWeatherByWMOIDResponse″
name=″parameters″/>
</message>
<message name=″GetWMOIDByCitySoapIn″>
<part element=″s0:GetWMOIDByCity″name=″parameters″/>
</message>
<message name=″GetWMOIDByCitySoapOut″>
<part element=″s0: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=″s0: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=″s0:Weather″name=″Body″/>
</message>
<message name=″GetWeatherByIPHttpGetIn″>
<part name=″IPAddress″type=″s:string″/>
<part name=″LicenseKey″type=″s:string″/>
</message>
<message name=″GetWeatherBylPHttpGetOut″>
<part element=″s0:Weather″name=″Body″/>
</message>
<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″/>
</message>
<message name=″GetWeatherHistoricalByZipHttpGetOut″>
<part element=″s0: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=″s0:Weather″name=″Body″/>
</message>
<message name=″GetWMOIDByCityHttpGetIn″>
<part name=″City″type=″s:string″/>
<part name=″LicenseKey″type=″s:string″/>
</message>
<message name=″GetWMOIDByCityHttpGetOut″>
<part element=″s0:WMOIDInfo″name=″Body″/>
</message>
<message name=″GetWeatherByZipHttpPostIn″>
<part name=″PostalCode″type=″s:string″/>
<part name=″LicenseKey″type=″s:string″/>
</message>
<message name=″GetWeatherByZipHttpPostOut″>
<part element=″s0: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=″s0: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=″s0: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″/>
</message>
<message name=″GetWeatherHistoricalByZipHttpPostOut″>
<part element=″s0: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″/>
</message>
<message name=″GetWMOIDByCityHttpPostIn″>
<part name=″City″type=″s:string″/>
<part name=″LicenseKey″type=″s:string″/>
</message>
<message name=″GetWMOIDByCityHttpPostOut″>
<part element=″s0:WMOIDInfo″name=″Body″/>
</message>
<portType name=″DOTSFastWeatherSoap″>
<operation name=″GetWeatherByZip″>
<documentation>Returns the weather for a given US postal code.</documentation>
<input message=″s0:GetWeatherByZipSoapIn″/>
<output message=″s0:GetWeatherByZipSoapOut″/>
</operation>
<operation name=″GetWeatherByCityState″>
<documentation>Returns the weather for a given US city and state.</documentation>
<input message=″s0:GetWeatherByCityStateSoapIn″/>
<output message=″s0:GetWeatherByCityStateSoapOut″/>
</operation>
<operation name=″GetWeatherByIP″>
<documentation>Returns the weather for a given IP Address.
</documentation>
<input message=″s0:GetWeatherByIPSoapIn″/>
<output message=″s0:GetWeatherByIPSoapOut″/>
</operation>
<operation name=″GetWeatherHistoricalByZip″>
<documentation>Returns historical weather information for a
given US postal code,date,and time.</documentation>
<input message=″s0:GetWeatherHistoricalByZipSoapIn″/>
<output message=″s0:GetWeatherHistoricalByZipSoapOut″/>
</operation>
<operation name=″GetWeatherByWMOID″>
<documentation>Returns the weather for a given WMOID.Also
see the GetWMOIDByCity method.</documentation>
<input message=″s0:GetWeatherByWMOIDSoapIn″/>
<output message=″s0:GetWeatherByWMOIDSoapOut″/>
</operation>
<operation name=″GetWMOIDByCity″>
<documentation>Returns the WMOIDs for a partial city match.
</documentation>
<input message=″s0:GetWMOIDByCitySoapIn″/>
<output message=″s0:GetWMOIDByCitySoapOut″/>
</operation>
</portType>
<portType name=″DOTSFastWeatherHttpGet″>
<operation name=″GetWeatherByZip″>
<documentation>Returns the weather for a given US postal code.
</documentation.>
<input message=″s0:GetWeatherByZipHttpGetIn″/>
<output message=″s0:GetWeatherByZipHttpGetOut″/>
</operation>
<operation name=″GetWeatherByCityState″>
<documentation>Returns the weather for a given US city and state.
</documentation>
<input message=″sO:GetWeatherByCityStateHttpGetIn″/>
<output message=″s0:GetWeatherByCityStateHttpGetOut″/>
</operation>
<operation name=″GetWeatherByIP″>
<documentation>Returns the weather for a given IP Address.
</documentation>
<input message=″s0: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=″s0:GetWeatherHistoricalByZipHttpGetln″/>
<output message=″s0:GetWeatherHistoricalByZipHttpGetOut″/>
</operation>
<operation name=″GetWeatherByWMOID″>
<documentation>Returns the weather for a given WMOID.Also
see the GetWMOIDByCity method.</documentation>
<input message=″s0:GetWeatherByWMOIDHttpGetIn″/>
<output message=″s0:GetWeatherByWMOIDHttpGetOut″/>
</operation>
<operation name=″GetWMOIDByCity″>
<documentation>Returns the WMOIDs for a partial city match.
</documentation>
<input message=″s0:GetWMOIDByCityHttpGetln″/>
<output message=″s0:GetWMOIDByCityHttpGetOut″/>
</operation>
</portType>
<portType name=″DOTSFastWeatherHttpPost″>
<operation name=″GetWeatherByZip″>
<documentation>Returns the weather for a given US postal
code.</documentation>
<input message=″s0:GetWeatherByZipHttpPostIn″/>
<output message=″s0:GetWeatherByZipHttpPostOut″/>
</operation>
<operation name=″GetWeatherB[gamma]CityState″>
<documentation>Returns the weather for a given US city and
state.</documentation>
<input message=″s0:GetWeatherByCityStateHttpPostIn″/>
<output message=″s0:GetWeatherByCityStateHttpPostOut″/>
</operation>
<operation name=″GetWeatherByIP″>
<documentation>Returns the weather for a given IP Address.
</documentation>
<input message=″s0:GetWeatherBylPHttpPostln″/>
<output message=″s0:GetWeatherByIPHttpPostOut″/>
</operation>
<operation name=″GetWeatherHistoricalByZip″>
<documentation>Returns historical weather information for a
given US postal code,date,and time.</documentation
<input message=″s0:GetWeatherHistoricalByZipHttpPostIn″/>
<output
message=″s0:GetWeatherHistoricalByZipHttpPostOut″/>
</operation>
<operation name=″GetWeatherByWMOID″>
<documentation>Returns the weather for a given WMOID.Also
see the GetWMOIDByCity method.</documentation>
<input message=″s0:GetWeatherByWMOIDHttpPostIn″/>
<output message=″s0:GetWeatherByWMOIDHttpPostOut″
/>
</operation>
<operation name=″GetWMOIDByCity″>
<documentation>Returns the WMOIDs for a partial city match.
</documentation>
<input message=″s0:GetWMOIDByCityHttpPostIn″/>
<output message=″s0: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″/>
</input>
<output>
<soap:body use=″literal″/>
</output>
</operation>
<operation name=″GetWeatherByCityState″>
<soap : operation soapAction=″http: //www.
serviceobjects.com/GetWeatherByCityState″style=″document″/>
<input>
<soap:body use=″literal″/>
</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″/>
</input>
<output>
<soap:body use=″literal″/>
</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″/>
</output>
</operation>
<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″/>
</output>
</operation>
<operation name=″GetWMOIDByCity″>
<soap : operation soapAction=″http: //www.
serviceobjects.com/GetWMOIDByCity″style=″document″/>
<input>
<soap:body use=″literal″/>
</input>
<output>
<soap:body use=″literal″/>
</output>
</operation>
</binding>
<binding name= ″DOTSFastWeatherHttpGet″type= ″ s0:
DOTSFastWeatherHttpGet″>
<http:binding verb=″GET″/>
<operation name=″GetWeatherByZip″>
<http:operation location=″/GetWeatherByZip″/>
<input>
<http:urlEncoded/>
</input>
<output>
<mime:mimeXml part=″Body″/>
</output>
</operation>
<operation name=″GetWeatherByCityState″>
<http:operation location=″/GetWeatherByCityState″/>
<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=″/GetWeatherHistoricalByZip″/>
<input>
<http:urlEncoded/>
</input>
<output>
<mime:mimeXml part=″Body″/>
</output>
</operation>
<operation name=″GetWeatherByWMOID″>
<http:operation location=″/GetWeatherByWMOID″/>
<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=″s0: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=″GetWeatherByCityState″>
<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=″/GetWeatherByIP″/>
<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″/>
</output>
</operation>
</binding>
<service name=″DOTSFastWeather″>
<documentation>For more information on our web services,visit
us at<a href=′http://www.serviceobjects.com/products/default.asp′target=
′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=″s0 :DOTSFastWeatherSoap″
name=″DOTSFastWeatherSoap″>
<soap:address location=″http://ws2.serviceobjects.
net/fw/FastWeather.asmx″/>
</port>
<port binding=″s0 :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>
</definitions>
Weather.xml
以下定义用于(准备提供给装置100的)可展开应用105 jar文件中的内含的示例XML定义300(例如,表示组件400,402,404)。
<?xml version=″1.0″encoding=″iso-8859-1″?>
<!DOCTYPE application(View Source for full doctype...)>
_<application uri=″myhitechcomp. superdep. finejob/FastWeather″
name=″FastWeather″ size=″16.12.15.2200″ entry=″scr_Main″ yendor=
″Research In Motion″ version=″1 .1.0″ persistence=″performant″
messageDeliver[gamma]=″standard″>
<global name=″gv_GetWeatherByZipRes[rho]onse″ type=″data″
component=″GetWeatherByZipResponse″array=″false″/>
<global name=″gv_GetWeatherByZip″ type=″data″
component=″GetWeatherByZip″array=″false″/>
<global name=″gv_GetWeatherByCityStateResponse″ type=″data″
component=″GetWeatherByCityStateResponse″array=″false″/>
<global name=″gv_GetWeatherByCityState″ type=″data″
component=″GetWeatherByCityState″array=″false″/>
<global name=″gv_GetWeatherByIPResponse″ type=″data″
component=″GetWeatherByIPResponse″array=″false″/>
<global name=″gv_GetWeatherByIP″ ty[rho]e=″data″
component=″GetWeatherByIP″array=″false″/>
<global name=″gv_GetWeatherHistoricalByZipResponse″ type=″data″
component=″GetWeatherHistoricalByZipResponse″array=″false″/>
<global name=″gv_GetWeatherHistoricalByZip″ type=″data″
component=″GetWeatherHistoricalByZip″array=″false″/>
<global name=″gv_GetWeatherByWMOIDResponse″ type=″data″
component=″GetWeatherByWMOIDResponse″array=″false″/>
<global name=″gv_GetWeatherByWMOID″type=″data″
component=″GetWeatherByWMOID″array=″false″/>
<global name=″gv_GetWMOIDByCityResponse″type=″data″
component=″GetWMOIDByCityResponse″array=″false″/>
<global name=″gv_GetWMOIDByCity″ type=″data″
component=″GetWMOIDByCity″arrays″false″/>
- <data name=″GetWeatherByZip″persist=″false″key=″″>
<field name=″PostalCode″type=″string″array=″false″/>
<field name=″LicenseKey″type=″string″array=″false″/>
</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″array=″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″/>
<field 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=″GetWeatherByCityState″persist=″false″key=″″>
<field name=″City″type=″string″array=″false″/>
<field name=″State″type=″string″array=″false″/>
<field name=″LicenseKey″type=″string″array=″false″/>
</data>
-<data name=″GetWeatherByCityStateResponse″persist=″false″key=″″>
<field name=″GetWeatherByCityStateResult″ type=″data″ component=
″Weather″array=″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″array=″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=″GetWeatherHistoricalByZipResponse″persist=″false″key=″″>
<field name=″GetWeatherHistoricalByZipResult″type=″data″component=
″Weather″array=″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″array=″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″array=″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=″outGetWeatherByZipSoapIn″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″/>
</message>
-<message name=″outGetWeatherByIPSoapIn″script=″″>
<mappedField name=″parameters″mapping=″Global.gv_GetWeatherByIP″
/>
<alert beep=″false″ribbon=″false″/>
</message>
-<message name=″inGetWeatherByIPSoapOut″ script=″
inGetWeatherByIPSoapOut_onMsgArrive″>
<mappedField name= ″parameters″ mapping=
″Global.gv_GetWeatherByIPResponse″/>
<alert beep=″false″ribbon=″false″/>
</message>
-<message name=″outGetWeatherHistoricalByZipSoapIn″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″>
<mappedField name= ″parameters″ mapping= ″Global.
gv_GetWMOIDByCityResponse″/>
<alert beep=″false″ribbon=″false″/>
</message>
-<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_outGetWeatherByZipSoapIn″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_outGetWeatherByIPSoapIn″transactions″none″/>
</button>
</region>
-<region layout=″vertical″>
<label name=″GetWeatherHistoricalByZip″
inValue=″GetWeatherHistoricalByZip″/>
-<button name=″Go″inValue=″Go″>
<onClick transition=″scr_outGetWeatherHistoricalByZipSoapIn″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/>
</screen>
-<screen name=″scr_inGetWeatherByZipSoapOut″ layout= ″vertical″
dialog=″false″tille=″inGetWeatherByZipSoapOut″>
-<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_GetWeatherByZipResponse.
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=″Windchill″inValue=″Windchill″/>
<edit readOnly=″false″type=″text″mandatory=″false″name=″edit
data_Windchil ″inValue=″@Global.
gv_GetWeatherByZipResponse.GetWeatherByZipResult.Windchill″/>
</region>
-<region layout=″yertical″>
<label name=″HeatIndex″inValue=″HeatIndex″/>
<edit readOnly=″false″ type=″text″ mandatory=″false″ name= ″edit
data_HeatIndex″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_GetWeatherByZipResponse.
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″>
<label 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 readOnly=″ 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″ inValue= ″@Global . gv_GetWeatherByZipResponse.
GetWeatherByZipResult.Sunrise″/>
</region>
-<region layout=″vertical″>
<label name=″Sunset″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_inGetWeatherByZipSoapOut_onClose″
transaction=″none″/>
</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″in Value=″Number″/>
<edit readOnly=″ false″ type=″text″ mandatory=″ false″ name= ″ edit
data_Number″ inValue= ″@Global . gv_GetWeatherByZipResponse.
GetWeatherByZipResult.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.LicenseKey″
inValue=″@Global.gv_GetWeatherByZip.LicenseKey″/>
</region>
-<region layout=″vertical″>
-<button name=″Submit″ inValue=″Submit″>
<onClick transition= ″ script_outGetWeatherByZipSoapIn_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=″vertical″>
<label name=″LastUpdated″inValue=″LastUpdated″/>
<edit readOnly=″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=″@Global.
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_GetWeatherByCityStateResponse.
GetWeatherByCityStateResult.Windchill″/>
</region>
-<region layout=″vertical″>
<label name=″HeatIndex″inValue=″HeatIndex″/>
<edit readOnly=″false″type=″text″ mandatory=″ false″ name= ″ edit
data_HeatIndex″inValue=″@Global.gv_GetWeatherByCityStateResponse.
GetWeatherByCityStateResult.HeatIndex″/>
</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_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″ inValue= ″@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=″@Global.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″inValue=″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=″yertical″>
<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>
-<menu>
-<item name=″menu_inGetWeatherByCityStateSoapOut″inValue=″Close″>
<onClick transition=″script_inGetWeatherByCityStateSoapOut_onClose″
transaction=″none″/>
</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=″
@Global.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_GetWeatherByCityState.
LicenseKey″inValue=″@Global.gv_GetWeatherByCityState.LicenseKey″
/>
</region>
-<region layout=″vertical″>
-<button name=″Submit″in Value=″Submit″>
<onClick transition=″script_outGetWeatherByCityStateSoapIn_onSubmit″
transaction=″none″/>
</button>
</region>
<menu/>
</screen>
-<screen name=″scr_inGetWeatherByIPSoapOut″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=″vertical″>
<label name=″LastUpdated″inValue=″Last[upsilon][rho]dated″/>
<edit readOnly=″ false″type=″text″ mandatory=″ false″ name= ″ edit
data_LastUpdated″ inValue= ″@Global .
gv_GetWeatherByIPResponse.GetWeatherByIPResult.LastUpdated″/>
</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″/>
<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_HeatIndex″ 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″in Value=″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″inValue=″Visibility″/>
<edit readOnly=″false″type=″text″mandatory=″false″name=″edit
data_Visibility″ inValue= ″@Global . 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.
GetWeatherByIPResult.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_GetWeatherByIPResponse .
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_GetWeatherByIPResponse.
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″ inValue= ″@Global . gv_GetWeatherByIPResponse.
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″inValue=″Close″>
<coClick transition=″script_inGetWeatherByIPSoapOut_onClose″
transaction=″none″/>
</item>
</menu>
</screen>
-<screen name=″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_GetWeatherByIP.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″
transaction=″none″/>
</button>
</region>
<menu/>
</screen>
-<screen name=″scr_inGetWeatherHistoricalByZipSoapOut″layout=″vertical″
dialog=″false″title=″inGetWeatherHistoricalByZipSoapOut″>
-<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.LastUpdated″/>
</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_HeatIndex″ 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=″vertical″>
<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.
GetWeatherHistoricalByZi 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_GetWeatherHistoricalByZipResponse . GetWeatherHistoricalByZi
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_GetWeatherHistoricalByZipResponse.
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_GetWeatherHistoricalByZipResponse.GetWeatherHistoricalByZi 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″ inValue= ″@Global.
gv_GetWeatherHistoricalByZipResponse . 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″inValue=″Close″>
<onClick transition=″script_inGetWeatherHistoricalByZipSoapOut_onClose″
transaction=″none″/>
</button>
</region>
-<menu>
-<item name=″menu_inGetWeatherHistoricalByZipSoapOut″ inValue=
″Close″>
<onClick transition=″script_inGetWeatherHistoricalByZipSoapOut_onClose″
transaction=″none″/>
</item>
</menu>
</screen>
-<screen name=″scr_outGetWeatherHistoricalByZipSoapIn″layout=″vertical″
dialog=″false″title=″outGetWeatherHistoricalByZipSoapIn″>
-<region layout=″vertical″>
<label name=″PostalCode″inValue=″PostalCode″/>
<edit readOnly=″false″ type=″text″ mandatory=″false″ name= ″ edit
data_PostalCode″ mapping=″Global .gv_GetWeatherHistoricalByZip.
PostalCode″inValue=″@Global.gv_GetWeatherHistoricalByZip.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_GetWeatherHistoricalByZip.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_GetWeatherHistoricalByZip.
LicenseKey″/>
</region>
-<region layout=″vertical″>
-<button name=″Submit″ inValue=″Submit″>
<cnClick transition= ″
script_outGetWeatherHistoricalByZipSoapIn_onSubmit ″ transaction=″none″
/>
</button>
</region>
<menu/>
</screen>
-<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.
Temperat ureF″/>
</region>
-<region layout=″vertical″>
<label name=″Windchill″inValue=″Windchill″/>
<edit readOnly=″false″ type=″text″ mandatory=″false″ name=″edit
data_Windchill″inValue=″@Global.gv_GetWeatherByWMOIDResponse.
GetWeatherByWMOIDResult.Windchill″/>
</region>
-<region layout=″vertical″>
<label name=″HeatIndex″inValue=″HeatIndex″/>
<edit readOnly=″ false″type=″text″ mandatory=″ false″ name=″edit
data_HeatIndex″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″inValue=″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″mandatory=″ 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″in Value=″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=″@Global.gv_GetWeatherByWMOIDResponse.
GetWeatherByWMOIDResult.Moonrise ″/>
</region>
-<region layout=″vertical″>
<label name=″Moonset″inValue=″Moonset″/>
<edit readOnly=″false″ type=″text″mandatory=″false″name=″edit
data_Moonset″inValue=″@Global.gv_GetWeatherByWMOIDResponse.
GetWeatherByWMOIDResult.Moonset″/>
</region>
-<region layout=″vertical″>
<label name=″Precipitation″inValue=″Precipitation″/>
<edit readOnly=″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_dataCountry″inValue=″@Globa.
gv_GetWeatherByWMOIDResponse . GetWeatherByWMOIDResult.
Country″/>
</region>
-<region layout=″vertical″>
-<button name=″Close″inValue=″Close″>
<onClick transition=″script_inGetWeatherByWMOIDSoapOut_onClose″
transaction=″none″/>
</button>
</region>
-<menu>
-<item name=″menu_inGetWeatherByWMOIDSoapOut″inValue=″Close″>
<onClick transition= ″ script_inGetWeatherByWMOIDSoapOut_onClose″
transaction=″none″/>
</item>
</menu>
</screen>
-<screen name=″scr_outGetWeatherByWMOIDSoapIn″ layout=″vertical″
dialog=″false″title=″outGetWeatherByWMOIDSoapIn″>
-<region layout=″vertical″>
<label name=″WMOID″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_outGetWeatherByWMOIDSoapIn_onSubmit″
transaction=″none″/>
</button>
</region>
<menu/>
</screen>
-<screen name=″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=″none″/>
</button>
</region>
-<region layout=″vertical″>
<label name=″Error″inValue=″Error″/>
-<button name=″Details″inValue=″Details″>
<onClick transition=″scr_Err″transactions″none″/>
</button>
</region>
-<region layout=″vertical″>
-<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>
</menu>
</screen>
-<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=″vertical″>
<label name=″WMOID″inValue=″WMOID″/>
<edit readOnly=″false″ type=″text″ mandatory=″ false″ name=″edit
data_WMOID″ inValue=″@Global.
gv_GetWMOIDByCityResponse.GetWMOIDByCityResult .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_onSubmit″/>
<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_nGetWeatherByZipSoapOut_onClose( ){scr_Main.display
( );}
function script_Err_back( ){Screen.back( );}
function
inGetWeatherByZipSoapOut_onMsgArrive ( )
{scr_inGetWeatherByZipSoapOut.display( );}
function
script_outGetWeatherByZipSoapIn_onSubmit ( )
{outGetWeatherByZipSoapIn.parameters=Global.gv_GetWeatherByZip;
OutGetWeatherByZipSoapIn.send( );
scr_Main.display( );}
function script_inGetWeatherByCityStateSoapOut_onClose( ){scr_Main.
display( );}
function
inGetWeatherByCityStateSoapOut_onMsgArrive ( )
{scr_inGetWeatherByCityStateSoapOut.display( );}
function
script_outGetWeatherByCityStateSoapIn_onSubmit ( )
{outGetWeatherByCityStateSoapI n.parameters=Global.
gv_GetWeatherByCityState;
outGetWeatherByCityStateSoapIn.send( );
scr_Main.display( );}
function script_inGetWeatherByIPSoapOut_onClose( ) {scr_Main. display
( );}
function
inGetWeatherByIPSoapOut_onMsgArrive( ){scr_inGetWeatherByIPSoapOut.
display( );}
function
script_outGetWeatherByIPSoapIn_onSubmit( ){outGetWeatherByIPSoapIn.
parameters=G lobal.gv_GetWeatherByIP;
outGetWeatherByIPSoapIn.send( );
scr_Main.display( );}
function
script_inGetWeatherHistoricalByZipSoapOut_onClose( ) { scr_Main.
display( );}
function
inGetWeatherHistoricalByZipSoapOut_onMsgArrive( )
{scr_inGetWeatherHistoricalByZ ipSoapOut.display( );}
function
script_outGetWeatherHistoricalByZipSoapIn_onSubmit( )
{ outGetWeatherHistoricalBy ZipSoapIn . parameters=Global.
gv_GetWeatherHistoricalByZip;
outGetWeatherHistoricalByZipSoapIn.send( );
scr_Main.display( );}
function script_inGetWeatherByWMOIDSoapOut_onClose( ){scr_Main.
display( );}
function
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( );}
function
inGetWMOIDByCitySoapOut_onMsgArrive( )
{scr_inGetWMOIDByCitySoapOut.display( );}
function
script_outGetWMOIDByCitySoapIn_onSubmit( )
{outGetWMOIDByCitySoapIn.parameters=Global.gv_GetWMOIDByCity;
outGetWMOIDByCitySoapIn.send( );
scr_Main.display( );}
10.dtd(DTD(Document Type Definition)(文件类型定义)
以下定义应用105的示例文件结构。
<!ENTITY%commonFieldAttrs′name CDATA#REQUIRED
type(string integer decimal boolean date data enumeration)″string″
component IDREF#IMPLIED
array(true false)″false″
’>
<!ENTITY%commonCtrlAttrs′name CDATA#REQUIRED
inValue CDATA#IMPLIED
placement CDATA#IMPLIED
style IDREF#IMPLIED
’>
<!ENTITY%nestedCtrlElements′(region|label|separator|edit|textarea
|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#IMPLIED
vendor CDATA#IMPLIED
version CDATA#IMPLIED
size CDATA#IMPLIED
icon CDATA#IMPLIED
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,?-->
<!ATTLIST resource
name ID#REQUIRED
url CDATA#REQUIRED
mimeType CDATA#REQUIRED
deferred(true|false)″false″
>
<!ELEMENT global(value*)>
<!ATTLIST global
%commonFieldAttrs;
>
<!ELEMENT enumeration(value+)>
<!ATTL1ST 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#IMPLIED
persist(true|false)#IMPLIED
key CDATA#IMPLIED
>
<!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#IMPLIED
>
<!--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#IMPLIED
script IDREF#IMPLIED
secure(true|false)#IMPLIED
>
<!--attrib mapping maps mfield to data.field-->
<!ELEMENT mappedField EMPTY>
<!ATTLIST mappedField
name CDATA#REQUIRED
mapping CDATA#IMPLIED
>
<!ELEMENT alert EMPTY>
<!--perhaps an inbox alert later-->
<!ATTLIST alert
beep(true|false)″false″
ribbon(true|false)″false″
dialogText CDATA#IMPLIED
>
<!ELEMENT Style EMPTY>
<!ATTLIST style
name ID#REQUIRED
font CDATA ttIMPLIED
size CDATA#IMPLIED
bold(true|false)″false″
italic(true|false)″false″
underline(true|false)″false″
fgColor CDATA#IMPLIED
bgColor CDATA#IMPLIED
bglmage IDREF#IMPLIED
>
<!ELEMENT screen(parain*,var*,(%nestedCtrlElements;|repetition),
menu?,onlnit?)>
<!--no menu for dialog-->
<!--attr refreshMsg points to message-->
<!ATTLIST screen
name ID#REQUIRED
title CDATA ttIMPLIED
dialog(true|false)″false″
layout(grid|flow|vertical)#REQUIRED
style IDREF#IMPLIED
refreshMsg IDREFS#IMPLIED
>
<!--local variable for a screen;can be mapped to-->
<!ELEMENT var EMPTY>
<!ATTLIST var
name CDATA#REQUIRED
component IDREF#REQUIRED
>
<!ELEMENT region(condition?,%nestedCtrlElements;)>
<!ATTLIST region
layout(grid|flow|vertical)#REQUIRED
placement CDATA#IMPLIED
style IDREF#IMPLIED
>
<!--item/control visibility condition-->
<!ELEMENT condition EMPTY>
<!ATTLIST condition
params CDATA#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#IMPLIED
script IDREF#IMPLIED
>
<!ELEMENT onFocusOut EMPTY>
<!ATTLIST onFocusOut
params CDATA#IMPLIED
script IDREF#IMPLIED
>
<!--transaction can be used to accept/rollback changes on the screen-->
<!ELEMENT onClick EMPTY>
<!ATTLIST onClick
params CDATA#IMPLIED
transition IDREF#IMPLIED
transaction(commit|rollback|none)″none″
>
<!--repetition control is a hydrid of a region and a choice-->
<!--its layout is inherited from the screen-->
<!ELEMENT repetition%nestedCtrlElements;>
<!ATTLIST repetition
%commonCtrlAttrs;
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
%commonCtrlAttrs;
isWhitespace(true|false)″false″
>
<!ELEMENT label(condition?,onInit?)>
<!ATTLIST label
%commonCtrlAttrs;
>
<!ELEMENT edit(condition?,onlnit?,onFocusOut?)>
<!ATTLIST edit
%coiranonCtrlAttrs;
mapping CDATA#IMPLIED
readonly(true|false)″false″
mandatory(true|false)″false″
type(number|currency|date|time|percentage|text|URL
password|phone|email)″text″
format CDATA#IMPLIED
>
<!--The textarea is multiline with dynamic scrollbar-->
<!ELEMENT textarea(condition?,onlnit?,onFocusOut?)>
<!ATTLIST textarea
%commonCtrlAttrs;
mapping CDATA#IMPLIED
readonly(true|false)″false″
mandatory(true|false)″false″
visibleRows CDATA#IMPLIED
>
<!ELEMENT image(condition?,onlnit?)>
<!ATTLIST image
%commonCtrlAttrs;
resource IDREF ttIMPLIED
>
<!--readonly implies to selection change: if RO=true user cannot change
selection-->
<!ELEMENT singleChoice(condition?,onlnit?,onChange?)>
<!ATTLIST singleChoice
%commonCtrlAttrs;
mapping CDATA ttIMPLIED
format CDATA#IMPLIED
type(list|dropdown|radio)″radio″
visibleRows CDATA#IMPLIED
>
<!ELEMENT multiChoice(condition?,onInit?,onChange?)>
<!ATTLIST multiChoice
%commonCtrlAttrs;
mapping CDATA#IMPLIED
format CDATA#IMPLIED
type(list checkbox)″checkbox″
mandatory(true|false)″false″
visibleRows CDATA#IMPLIED
>
<!ELEMENT button(condition?,onlnit?,onClick)>
<!ATTLIST button
%commonCtrlAttrs;
resource IDREF#IMPLIED
>
<!ELEMENT script(param*)>
<!ATTLIST script
name ID#REQUIRED
>
<!ELEMENT param EMPTY>
<!ATTLIST param
name CDATA#REQUIRED
component IDREF#REQUIRED
>
尽管在这里披露了一个或多个示例系统和方法,熟悉本领域的人员应当知道可以有许多变化,包括在图案648的说明中为了举例说明而使用的适当编辑器600和阅读器602的替代,并且这些变化包括在本申请的范围内。此外,应当知道,用户界面202和显示器206可以一起定义为工具116的用户界面。尽管在提供的示例中使用了XML和ECMAScript的一个子集,但是,也可以将其他语言和语言变体用于定义组件应用程序。例如,可以用建议的E4X标准脚本编写语言代替ECMAScript。此外,除了上述XML之外的其他结构化定义语言可以包括:资源描述框架(RDF),XSLT,和XHTML,但不限于此。
1. 一种用于生成屏幕组件的系统,所述系统被配置成在装置的图形用户界面上显示的屏幕中显现数据结构,所述屏幕组件用于包括在在装置上执行的应用中,并具有以用于定义数据结构的显现的结构化定义语言表达的定义,显现的数据结构与和通过网络在装置和数据源之间通信的消息相关联的数据内容有关,所述系统包括:
11. 一种用于生成屏幕组件的方法,所述屏幕组件被配置成在装置的图形用户界面上显示的屏幕中显现数据结构,所述屏幕组件用于包括在用于在装置上执行的应用中,并具有以用于定义数据结构的显现的结构化定义语言表达的定义,显现的数据结构与通过网络在装置和数据源之间通信的消息相关联的数据内容有关,所述方法包括步骤:
21. 一种用于生成屏幕组件的计算机程序产品,所述屏幕组件被配置成在装置的图形用户界面上显示的屏幕中显现数据结构,所述屏幕组件用于包括在用于在装置上执行的应用中,并具有以用于定义数据结构的显现的结构化定义语言表达的定义,显现的数据结构与通过网络在装置和数据源之间通信的消息相关联的数据内容有关,所述计算机程序产品包括:
存储在计算机可读介质上的分析器模块,用于分析一组预定义消息和用结构化定义语言表达的数据定义以识别对应的数据结构和与消息有关的消息细节,预定义消息和数据定义用于包括在应用中;