CN1834908A - 用于将开发模式应用于基于组件的应用程序的系统和方法 - Google Patents

用于将开发模式应用于基于组件的应用程序的系统和方法 Download PDF

Info

Publication number
CN1834908A
CN1834908A CNA2006100678316A CN200610067831A CN1834908A CN 1834908 A CN1834908 A CN 1834908A CN A2006100678316 A CNA2006100678316 A CN A2006100678316A CN 200610067831 A CN200610067831 A CN 200610067831A CN 1834908 A CN1834908 A CN 1834908A
Authority
CN
China
Prior art keywords
name
pattern
data
module
message
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CNA2006100678316A
Other languages
English (en)
Other versions
CN100429620C (zh
Inventor
迈克尔·谢菲尔德
布赖恩·戈林
丹尼尔·马德苏
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
BlackBerry Ltd
Original Assignee
Research in Motion Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Research in Motion Ltd filed Critical Research in Motion Ltd
Publication of CN1834908A publication Critical patent/CN1834908A/zh
Application granted granted Critical
Publication of CN100429620C publication Critical patent/CN100429620C/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/34Graphical or visual programming

Abstract

公开一种用于协调应用程序开发的系统和方法。该系统和方法包括第一开发模式模块,被配置为与计算机用户接口所提供的开发环境交互,第一开发模式模块用于向用户接口的用户指导多个预定步骤,以通过经由用户接口的用户输入事件来协调应用程序组件的开发。第一开发模式模块被配置为基于以第一开发模式为中心的组件类型,从多个模式中选择,从而从多个类型中选择的组件类型包括数据、消息、屏幕和工作流中至少一个。该系统和方法还包括第一模块,用于通过与提供应用程序持久状态的开发环境的数据模型交互来开发至少一个组件的定义。利用通过用户接口传送到用户的多个预定步骤来协调第一模块的操作;所开发的组件实质上被组装为应用程序。

Description

用于将开发模式应用于基于组件的应用程序的系统和方法
技术领域
本申请大体上涉及基于组件的应用程序(component basedapplication)的开发及其在网络上的可用性。
背景技术
现在使用的无线设备的数量连续增长,如智能电话、具有无线通信能力的个人数字助理(PDA)、个人计算机、自助信息亭和双向寻呼机/通信设备等。例如,智能电话可以包括针对城市范围检索天气预报的应用程序,或PDA可以包括使用户能够购买杂货的应用程序。这些软件应用程序的优点在于与网络之间的连接性,以便向用户提供及时、有用的服务。然而,由于一些设备的受限资源以及将大量数据传送到设备的复杂性,开发和维护针对多种设备定制的软件应用程序仍然是困难且耗时的任务。
当前,移动通信设备被配置成用于通过基于因特网的浏览器和/或本机应用程序与网络服务进行通信。浏览器具有能够针对各种不同设备在交叉平台基础上进行操作的优点,但其缺点在于请求来自网络服务的页面(HTML格式的屏幕定义),这阻碍了包含在屏幕上的数据的持续性。浏览器的另一个缺点在于在运行时绘制(render)屏幕,这是资源密集的。本机应用程序(native application)的优点在于:专门针对移动设备的类型而开发,从而提供了针对每个运行时环境的相对优化的应用程序。但是,本机应用程序的缺点在于不是平台无关的,因而需要开发相同应用程序的多个版本,并且相对较大,因而给移动设备的资金资源造成严重的负担。此外,应用程序开发者需要精通如Java和C++等编程语言,以构建这些硬编码的本机应用程序。需要能够在开发针对具有其各自运行时环境(runtime envionment)的选定设备和终端的应用程序中起到帮助、并且能够有助于从多种后端数据源中进行选择的应用程序开发环境。
这里公开的系统和方法提供了一种基于组件的应用程序开发环境,以便缓解或减轻至少部分上述缺点。
发明内容
现有软件应用程序的优点在于与网络之间的连接性,以便向用户提供及时、有用的服务。然而,由于一些设备的受限资源以及将大量数据传送到设备的复杂性,开发和维护针对多种设备定制的软件应用程序仍然是困难且耗时的任务。现有应用程序生成环境并非基于组件应用程序体系结构,组件应用程序体系结构有助于生成运行在具有多种运行时环境的客户端上的应用程序。本机应用程序是现有应用程序的一个示例,现有应用程序具有以下缺点:非平台独立,从而需要开发并生成相同应用程序的多种版本,以及相对较大,从而给移动设备的资金资源造成严重的负担。
与现有应用程序生成环境相反,提供了一种用于协调应用程序开发的系统和方法,其中应用程序包括具有以结构化定义语言表达的定义的第一组件和具有指令序列的第二组件。这些组件定义了在设备与数据源之间通过网络传送的消息的设备运行时环境上的处理。系统和方法包括:第一开发模式,被配置为与计算机用户接口所提供的开发环境交互,第一模式用于向用户接口的用户指导多个预定步骤,以通过经由用户接口的用户输入事件来协调应用程序组件的开发。第一模式被配置为基于以第一开发模式为中心的组件类型从多个类型中选择组建类型,用于从多个类型中进行选择的组件类型包括数据、消息、屏幕和工作流中至少一个。系统和方法还包括第一模块,其与所选择的组件类型相对应,并且被配置为耦合到第一模式。第一模块用于通过与提供应用程序持久状态的开发环境的数据模型交互来开发至少一个组件的定义。利用通过用户接口传送到用户的多个预定步骤来协调第一模块的操作;其中,所开发的组件实质上被组装为应用程序。
因此,提供了一种用于协调应用程序开发的系统,其中应用程序包括具有以结构化定义语言表达的定义的第一组件和具有指令序列的第二组件,这些组件用于定义在设备与数据源之间通过网络传送的消息的设备运行时环境上的处理,所述系统包括:第一开发模式模块,被配置为与计算机用户接口所提供的开发环境交互,第一模式用于向用户接口的用户指导多个预定步骤,以通过经由用户接口的用户输入事件来协调应用程序组件的开发,第一模式被配置为基于以第一开发模式为中心的组件类型从多个模式中选择,用于从多个类型中进行选择的组件类型包括数据、消息、屏幕和工作流中至少一个;以及第一模块,其与所选择的组件类型相对应,并且被配置为耦合到第一模式,第一模块用于通过与提供应用程序持久状态的开发环境的数据模型交互来开发至少一个组件的定义,利用通过用户接口传送到用户的多个预定步骤来协调第一模块的操作;其中,所开发的组件实质上被组装为应用程序。
也公开了一种用于协调应用程序开发的方法,其中应用程序包括具有以结构化定义语言表达的定义的第一组件和具有指令序列的第二组件,这些组件用于定义在设备与数据源之间通过网络传送的消息的设备运行时环境上的处理,所述方法包括如下步骤:选择第一开发模式模块,第一模式模块被配置为与计算机用户接口所提供的开发环境交互;通过第一模式向用户接口的用户指导多个预定步骤,以通过经由用户接口的用户输入事件来协调应用程序组件的开发,第一模式模块被配置为基于以第一开发模式为中心的组件类型从多个模式中选择,用于从多个类型中进行选择的组件类型包括数据、消息、屏幕和工作流中至少一个;选择与所选择的组件类型相对应并且配置为耦合到第一模式的第一模块;以及利用第一模块通过与提供应用程序持久状态的开发环境的数据模型交互来开发至少一个组件的定义,利用通过用户接口传送到用户的多个预定步骤来协调第一模块的操作;其中,所开发的组件实质上被组装为应用程序。
也公开了一种用于协调应用程序开发的计算机程序产品,其中应用程序包括具有以结构化定义语言表达的定义的第一组件和具有指令序列的第二组件,这些组件用于定义在设备与数据源之间通过网络传送的消息的设备运行时环境上的处理,计算机程序产品包括:计算机可读介质;存储在计算机可读介质上的第一开发模式模块,被配置为与计算机用户接口所提供的开发环境交互,第一模式用于向用户接口的用户指导多个预定步骤,以通过经由用户接口的用户输入事件来协调应用程序组件的开发,第一模式被配置为基于以第一开发模式为中心的组件类型从多个模式中选择,用于从多个类型中进行选择的组件类型包括数据、消息、屏幕和工作流中至少一个;以及存储在计算机可读介质上的第一模块,其与所选择的组件类型相对应,并且被配置为耦合到第一模式,第一模块用于通过与提供应用程序持久状态的开发环境的数据模型交互来开发至少一个组件的定义,利用通过用户接口传送到用户的多个预定步骤来协调第一模块的操作;其中,所开发的组件实质上被组装为应用程序。
附图说明
通过下面对照附图进行的详细说明,这些和其它特点将变得更加清楚,在附图中:
图1是通信网络系统的方框图;
图2是用于开发和生成如图1所示的应用程序的工具的方框图;
图3是图1所示的组件应用程序包的方框图;
图4是示出了图3所示的应用程序的示例组件的方框图;
图5是示出了图3所示的样本组件应用程序的示例屏幕和工作流;
图6是图2所示的工具体系结构的方框图;
图7示出了图6的工具的编辑器;
图8示出了图6的工具的查看器;
图9示出了使用图6的工具的应用程序生效方法;
图10示出了使用图6的工具的应用程序生成方法;
图11示出了使用图10的应用程序构建可展开应用程序(deployable application)的方法;
图12示出了展开图11的应用程序的方法;
图13示出了图6的工具的向导;
图14示出了图13的向导模式的示例操作;
图15是图14的操作的另一实施例;
图16是图13的模式的示例屏幕;
图17是图16的屏幕的另一实施例;以及
图18是图16的屏幕的另一实施例。
具体实施方式
网络系统
参考图1,网络系统10包括移动通信设备100,用于通过与应用程序网关AG相连的无线网络102与一个或多个后端数据源106(如基于图解的服务,如网络服务等,或用于提供由应用程序105使用的企业服务的数据库)进行交互。设备100是诸如但不局限于以下设备:移动电话、PDA、双向寻呼机、双模式通信设备。网络10也可以具有通过局域网119相连的桌面计算机117。此后,为了简单起见,将网络10的设备100和桌面计算机117称为设备100。如本领域所知,应用程序网关AG和数据源106可以通过外联网(如因特网)和/或内联网相连。应用程序网关AG处理由应用程序105发起的请求/响应消息以及从数据源106推送到设备100的订阅通知。应用程序网关AG可以用作数据映射服务器,用于在设备100上的客户端运行时环境RE与数据源106的后端服务器之间传递消息。运行时环境RE是执行应用程序105组件并提供执行应用程序105所需的公共服务的智能容器。网关AG可以提供针对应用程序105的异步消息收发,并且可以集成遗留(legacy)后端数据源106,并与遗留后端数据源106进行通信。设备100在与数据源106进行通信时,发送和接收无线组件应用程序技术或无线组件应用程序105(如稍后进一步描述的那样),以及发送/接收与应用程序105的操作相关联的消息收发。在将应用程序105提供给设备100的对应运行时环境RE时,设备100可以通过执行应用程序105进行操作,作为数据源106的网络客户端。
为了满足与应用程序105相关联的适当消息收发,应用程序网关AG通过多种协议(诸如但不局限于HTTP、SQL和组件API)与数据源106进行通信,以便在将应用程序105提供给设备100时,将相关的商业逻辑(方法)披露给应用程序105。应用程序105可以类似于调用与对象(或功能)有关的方法地使用数据源106的商业逻辑。应当意识到,可以通过网络102和应用程序网关AG,与数据源106相关地将应用程序105直接下载/上载到设备100。例如,应用程序网关AG与供应服务器108和发现服务器110相连,用于提供用于优化空中提供应用程序105的机制,包括从设备100进行应用程序105发现的能力,如UDDI(例如)注册表(registry)112中所列出的那样。注册表112可以是由服务器110实现的发现服务的一部分,注册表112用于公布应用程序105。注册表112中的应用程序105信息可以包含但不局限于展开描述符DD(包含如应用程序105名称、版本和描述等信息)以及此应用程序105在应用程序仓库114中的位置。
再次参考图1,为了初始化运行时环境RE,RE接收MDS 115服务本(service book)中的网关AG URL和网关AG公用密钥。运行时环境RE使用这些信息与网关AG相连,以便进行初始握手。根据域,设备100供应或BES 116将MDS 115服务本推入设备100。应当意识到,根据需要,在网络10中可以存在多于一个网关AG。一旦初始化,设备100对应用程序105的访问(下载/上载)可以通过网关AG直接从应用程序仓库114进行通信,和/或与直接访问仓库114的数据源116(未示出)相关联。
应用程序设计用户接口或工具116
参考图1,可以将应用程序105存储在仓库114中,作为一系列程序包,可以由工作室开发工具116创建,由应用程序105的开发者所采用。开发设计工具116可以是用于开发有线和/或无线组件应用程序105包的RAD工具。工具116可以提供对应用程序105组件(参见图4)的可视设计的拖放图形解决方案的支持,应用程序105组件例如但不局限于屏幕402、数据元素400、消息404和应用程序工作流逻辑406,如稍后所述。将应用程序105包表示为可以由工具116通过自动代码生成处理自动产生的元数据(XML)。此工具116可以提供自动生成的代码,以包括(或增补)工业标准脚本语言(如JavaScript)或本领域公知的其他脚本/编程语言。通过服务器110的发现服务在注册表112中公布仓库114中应用程序105包的可用性。应当意识到根据应用程序网关AG和关联数据源106的特定网络10配置的使用情况,可以存在多于一个仓库114和关联注册表112。
参考图2,工具116在计算机201上操作,该计算机201可以通过如通过连接218与设备基础结构204相连的收发机200等网络连接接口与网络10相连。收发机200可以用于将完整的应用程序105上载到仓库114(参见图1)中,以及访问注册表112和所选的数据源106。再次参考图2,开发设计工具116还具有用户接口202,通过连接222与设备基础结构204相连,与用户(未示出)进行交互。用户接口202包括一个或多个用户输入设备,例如但不局限于键盘、数字键盘、履带轮(track wheel)、记录笔、鼠标、麦克风等,并与用户输出设备相连,如扬声器(未示出)和显示屏206。如果显示器206是触摸敏感的,则也可以将显示器206用作由设备基础结构204控制的用户输入设备。工具116的用户采用用户接口202,使用一系列编辑器600和查看器602(参见图6)来协调应用程序105的设计,使用多个向导604来辅助/驱动开发处理的工作流程。
再次参考图2,由设备基础结构204实现工具计算机201的操作。设备基础结构204包括计算机处理器208和关联存储器模块210。计算机处理器208通过执行相关指令,操纵工具116的网络接口200、用户接口202和显示器206的操作,所述相关指令是由驻留在存储器模块210中的操作系统和应用程序105设计编辑器600、向导604、对话605和查看器602提供的。此外,应当意识到设备基础结构204可以包括与处理器208相连的计算机可读存储介质212,用于向处理器208提供指令和/或加载/设计同样驻留(例如)在存储器模块210中的应用程序105。计算机可读介质212可以包括硬件和/或软件,例如,仅作为示例,磁盘、磁带、光学可读介质(如CD/DVD ROM)和存储卡。在每种情况下,计算机可读介质212可以采用设置在存储器模块210中的小盘、软盘、盒式磁带、硬盘驱动器、固态存储卡或RAM的形式。应当注意,可以单独或组合使用以上所列出的示例计算机可读介质212。
再次参考图2,设计工具116在作为开发应用程序105的应用程序开发环境的计算机201上进行操作。工具116的开发方法可以基于构建应用程序可视、数据、消息行为和运行时导航模型的可视“拖放”系统。可以将工具116构造为针对类集成设计环境(IDE)框架的一组插件,例如但不局限于Eclipse框架,或者可以将工具116配置为完整的设计框架,而不使用插件体系结构。只为了示例的目的,现在将工具116描述为使用Eclipse框架的插件设计环境。
参考图2和6,Eclipse提供基本的类工具116环境,可以扩展为提供定制编辑器、向导、项目管理和其他功能的主机。Eclipse平台设计用于构建集成开发环境(IDE),可以用于创建随着网站变化的应用程序,嵌入式Java TM程序、C++程序和企业JavaBeans TM。导航器视图230示出了用户(如开发者)工作空间中的文件;文本编辑器部分232示出了工具116的用户正在进行工作的文件的内容,以便开发应用程序105和所述关联组件400、402、404、406(参见图4);任务查看部分234示出了工具116的用户的待完成任务列表(to-do list);以及概况查看器部分236示出了正在设计/编辑的应用程序105的概况内容,和/或可以通过提供与当前选中的对象有关的信息,增补其他视图,如在另一视图中选中的对象的属性。应当意识到,工具116帮助开发者以结构化定义语言(如XML)来创建和修改组件400、402、404中的代码定义内容。此外,工具116帮助开发者创建、修改和生效定义内容在组件400、402、404之间的相关性,例如但不局限于消息/数据和屏幕/数据关系。还应当意识到可以根据需要,将由开发者使用的向导604和对话605内容在显示器上的显示(在使用编辑器600和查看器602期间)定位在部分230、232、234、236之一中和/或定位在专用向导部分(未示出)中。
以用于发现、集成和运行模块调用插件(即,编辑器600和查看器602)的机制来构建Eclipse平台。在通过计算机201的UI 202加载Eclipse平台时,在显示器206上向用户呈现由一组可用插件构成的集成开发环境(IDE),如编辑器600和查看器602。Eclipse平台的多种插件运行在显示器206上所指示的用户工作空间中的常规文件上。工作空间由一个或多个顶级项目构成,其中每个项目映射到文件系统中的对应用户专用目录,存储在存储器210中(和/或可以在网络10上访问),并使用导航器230进行导航。Eclipse平台UI范例基于编辑器、视图和透视图。从用户的观点来看,工作台显示器206由视图602和编辑器600可视地构成。透视图出现在编辑器600和视图602的选择和排列中,可以在显示器206上看到。编辑器600允许用户打开、编辑和保存对象。编辑器600遵循打开-保存-关闭的生命周期,非常类似于基于文件系统的工具。当激活时,选定编辑器600可以对工作台菜单和工具条进行动作。视图602提供与用户正在工作台中进行操作的一些对象有关的信息。查看器602可以通过提供与所编辑的文档有关的信息来辅助编辑器600。例如,查看器602可以具有比编辑器600简单的生命周期,由此通常立即保存使用查看器602做出的修改(如改变属性值),并在显示器206的其他有关部分中立即反映出这些变化。还应当意识到,显示器206的工作台窗口可以具有各个分离的透视图,在任意给定时刻,只有其中之一可视。每个透视图具有其自身的查看器602和编辑器600,对查看器602和编辑器600进行排列(平铺、层叠或分离)以便显示在显示器206上。
组件应用程序105
参考图3,应用程序105包具有应用程序元素或人造产物(artifact)301,例如但不局限于XML定义300、映射302、应用程序资源304和可选地用于本地化支持的资源束306。XML定义300是应用程序数据400、消息404、屏幕402组件和工作流406、部分原始应用程序105的XML编码。应当意识到,XML语法只用作可用于编码应用程序105的任何结构化定义语言的示例。应用程序映射302定义了将应用程序消息映射到数据源106的后端操作时的内容关系。应用程序开发者利用工具116来创建映射302,由此网关AG在设备100的运行时环境RE与数据源106之间通信应用程序105请求/响应消息期间利用此映射302信息。资源304是将其作为静态相关性与应用程序105打包在一起的一个或多个资源(图像、声音字节、媒体等)。例如,可以相对于资源文件夹(未示出)来定位资源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。所述容器管理应用程序105在设备100上的生命周期(供应、执行、删除等),并负责将表示应用程序105的元数据(XML)转换为设备100上的有效可执行形式。应用程序105是XML定义的可执行形式,如上所述,并且由运行时环境RE创建和维护。RE可以提供针对应用程序105的一组公用服务,以及提供对可选JavaScript或其他脚本语言的支持。这些服务包括对诸如但不局限于UI控制、数据持续性和异步客户端-服务器消息收发的支持。应当意识到,如果需要,这些服务可以一并作为应用程序105的一部分。
参考图4,组件应用程序105是可以具有以诸如可扩展标识语言(XML)和ECMAScript的子集编写的人造产物301的软件应用程序。XML和ECMAScript是基于标准的语言,允许软件开发者按照便携式和平台无关的方式开发组件应用程序105。组件应用程序105的方框图包括数据组件400、呈现组件402和消息组件404,通过在供应时与设备100(参见图1)上的运行时环境RE进行交互,与工作流组件406进行协作。可以使用结构化定义语言(如XML)将组件400、402、404构建为一系列元数据记录,由表示资源的特定属性的多个预定义元素构成,从而使每个元素可以具有一个或多个数值。每个元数据模式典型地已经定义了以下特性:诸如但不局限于,元素的限制数量、每个元素的名称和每个元素的含义。示例元数据模式包括但不局限于都柏林核(DC)、英美编目规则(AACR2)、政府信息定位符服务(GILS)、编码档案描述(EAD)、IMS全球学习论坛(IMS)和澳大利亚政府定位符服务(AGLS)。编码语法允许运行时环境RE(参见图1)对组件400、402、404的元数据进行处理,并且编码方案包括但不局限于XML、HTML、XHTML、XSML、RDF、及其可读编目(MARC)和多用途因特网邮件扩展(MIME)。设备100的客户端运行时环境RE对组件400、402、404的元数据描述符进行操作,以提供应用程序105的可执行版本。
再次参考图4,数据组件400定义了由组件应用程序105使用的数据实体。数据组件400定义了描述数据实体需要哪些信息,以及以何种形式来表达这些信息。例如,数据组件400可以定义以下信息:诸如但不局限于,包括由格式化为数字的惟一标识符构成的订单、格式化为字符串的项目列表、以日期-时间为格式的创建所述订单的时间、格式化为字符串的订单的状态、以及根据数据组件400中的另一个的定义进行格式化的、下了所述订单的用户。
再次参考图4,消息组件404定义了由组件应用程序105使用的消息的格式,用于与外部系统进行通信,如网络服务等。例如,消息组件404之一可以描述以下信息:诸如但不局限于,发布订单的消息(包括该订单的惟一描述符)、订单的状态、以及与订单相关联的注释。应当意识到,链接或包含相似数据定义的数据400和消息404组件可以共享组件的数据定义内容。
再次参考图4,呈现组件(representation component)402定义了组件应用程序105在其由设备100的用户接口显示时的外观和行为。呈现组件402可以规定GUI屏幕和控制、以及在用户使用用户接口与组件应用程序105进行交互时要执行的动作。例如,呈现组件402可以定义屏幕、标签、编辑框、按钮和菜单、以及在用户在编辑框中进行输入或按下按钮时所要采取的动作。应当意识到,链接或包含相似数据定义的数据400和呈现组件402可以共享组件的数据定义内容。
参考图1和4,应当意识到,在上述客户端组件应用程序105定义主机模型中,呈现组件402可以根据设备100的客户端平台和环境发生变化。例如,在一些情况下,网络服务顾客不需要可视呈现。组件应用程序105的组件400、402、404、406的应用程序定义可以位于网络服务仓库114中,作为平台中性数据400、消息404、工作流406组件描述符与一组针对多种预定义客户端运行时RE的平台专用呈现组件402描述符的打包束。当发布针对应用程序105的发现或展开请求消息时,作为此请求消息的一部分指定客户端类型。为了在针对通信设备100的不同客户端平台打包组件应用程序105时不重复数据、消息和工作流元数据,应用程序定义可以作为一束与不同呈现组件402集合相链接的平台中性组件定义。对于这些网络服务顾客,客户端应用程序105将包含通过工作流组件406与数据400和消息404组件相链接的选中呈现组件402。
再次参考图4,组件应用程序105的工作流组件406定义了在执行动作时要发生的处理,如由上述呈现组件402规定的动作,或者在消息从应用程序网关AG(参见图1)到达时要执行的动作。呈现、工作流和消息处理由工作流组件406来定义。以编程语言(例如,面向对象的编程语言)和/或脚本语言(例如但不限于ECMAScript),将工作流组件406编写为一系列指令,并可以汇编(例如)为本机代码,并由运行时环境206来执行,如上所述。工作流组件406的示例可以是将数值分配给数据、操纵屏幕、或发送消息105。针对呈现组件,可以创建多个工作流定义,以支持随着设备100而改变的能力和特征。ECMA(欧洲计算机制造商联盟)脚本是标准脚本语言,其中脚本可以表示由除计算机处理器之外的另一程序解译或执行的指令序列。脚本语言的一些其他示例是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所定义。
参考图4,以下示例示出了如何使用结构化定义语言(例如但不局限于XML)、以及平台中性脚本/编程语言(例如但不局限于ECMAScript)与符合以下文档型定义(DTD)的定义组件一起来表达网络服务客户端应用程序105:<!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#IMPUED><!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)"true"><!ELEMENT condition EMPTY><!ATTLIST condition
pblock CDATA#REQUIRED
param CDATA#IMPUED
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)"singleList"
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>
显示在图5中的示例组件应用程序105由以下XML和mEScript来表示,包括作为“wcData”的数据组件400、作为“wcMsg”的消息组件404、作为“wcScr”的呈现组件402和作为“wcFlow”的工作流组件406(用于处理其他组件400、402、404):<!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.example.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"/>
</wcData>
<wcData name="Special">
   <dfield name="desc"key="1"type="String"/>
   <dfield name="price"type="Number"/>
</wcData>
<wcMsg name="inAddSpecial"mapping="Special">
</wcMsg>
<wcMsg name="inRemoveSpeciar"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="outOrder">
     <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="User Name:"/>
             <edit name="edUserName"type="char"/>
         </layout>
         <layout type="flow">
             <label name="lblPassword"value="Password:"/>
             <edit name="edPassword"type="pwd"/>
         </layout>
         <button name="btnLogin"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="lblStreet"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="Teleohone:"/>
            <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="sendOrder"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="flow">
            <label name="lblStatus"value="Status:"/>
            <label name="lblStatusMapped"value="@Order[].orderStatus.status"/>
        </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="mlorderList"value="@Order[].datetime+′-′+@Order[].special"mapping="Order[]"type="multiList"/>
    </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="ahLogin"param="User.name">
         if(User.passwordHash==Util.md5(scrLogin.edPassword)){
             Application.authenticatedUser=User;
             scrLogin.back();
        }     else   {
             Dialog.display("Invalid login!");
        }
    </pblock>
    <pblock id="ahSendorder"param="User">
        Order.orderld=Util.guid();
        Order.special=scrSpecials.slSpecials.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.delete();
    </pblock>
</wcFlow></wcApp>
如以上所给出,XML元素定义了示例组件应用程序105,包括wcApp元素、wcData元素、wcSrc元素和wcFlow元素。参考图4,wcApp元素是定义了组件应用程序105的顶级元素。wcData元素定义了示例数据元素400,由一组命名、类型字段组成。wcMsg元素定义了示例消息组件404,类似地定义了一组命名、类型字段。wcScr元素定义了示例呈现组件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的维护,包括在设备100上修改和更新组件应用程序105。
设计工具116体系结构
图6示出了用于设计组件应用程序105的总体设计工具116结构。设计工具116接口(UI 202和显示器206一参见图2)主要是图形和文本编辑器600、查看器602、对话605和向导604的面向用户的模块601集合。使用拖放编辑系统和向导驱动具体方案,通过这些编辑器600中的一个或多个来实现与开发者/用户的大多数外部交互。次要的非面向用户的系统接口是“后端”,由此工具116与诸如网络服务和SQL数据库等摘要数据源106相连。如上所述,可以在Eclipse平台上构建工具116,由此用户接口系统组件可以是但不局限于:编辑器600、查看器602、对话(未示出)和向导604的组件,例如,是扩展了Eclipse类并利用Eclipse框架的插件模块601。如图所示,工具116与后端数据源106和UDDI仓库114和注册表112进行通信。这些外部系统106、112、114可以不是工具116的一部分,但为了完整的目的,仍然将其示出。
工具116具有主要由编辑器600和查看器602构成的UI层606,通过工作流向导605发挥辅助作用。层606能够访问扩展窗口小部件集和图形库,对于Eclipse,已知为标准窗口小部件工具箱(SWT)。UI层606模块601也可以使用称为JFace的高级工具箱,包含标准查看器类(如列表、树和表格等)和用于向菜单和工具栏中添加命令的动作框架。工具116也可以使用图形编辑框架(GEP)来实现绘图编辑器,如工作流编辑器702和关系编辑器704(参见图7)。UI层606模块601可以遵循模型-视图-控制器的设计模式,其中每个模块601既是视图,又是控制器。数据模型608、610表示应用程序105的持续状态,在数据模型层612和工具116体系结构中实现。层606、612的分离保持了多个视图中的呈现专用信息,并设置多个UI模块601(例如,编辑器600和查看器602)来响应数据模型608、610的变化。编辑器600和查看器602的开发者在显示器202(参见图2)上的操作由向导604加以辅助,用于指导应用程序105的开发。应用程序开发模式或开发指导948(参见图13)。所述模式落入以下通用类之一中:例如但不局限于:推荐模式654;开发方案模式650;生效模式660;消息收发模式658;屏幕模式656和脚本模式652,如参考图13进一步描述的那样。
工具116数据模型608、610可以基于Eclipse建模框架(EMF)。EMF是框架和代码生成工具。框架提供模型608、610改变通知、持续性支持和通常用于操纵EMF对象的有效反映API。使用代码生成工具来产生模型608、610实现,并创建适配器,用于将模型层与UI层606的用户接口模块601相连。
工具116服务层614提供了针对UI层606的工具,如生效620、本地化624、生成622、构建626和展开628,稍后将进一步描述。工具116可以使用Eclipse扩展点机制,加载针对两种服务的附加插件:后端连接器616和具有关联呈现环境630的设备皮肤(device skin)管理器618。
后端连接器616定义了提供给工具116的Eclipse扩展点,用于通信或获得与不同后端数据源106有关的信息,以便获得所选数据源106的消息格式。后端连接器616可以用作连接和调查后端数据源106服务的接口,如网络服务和SQL数据库等。后端连接器616有利于构建适当的应用程序消息和数据组,以便在应用程序105运行在设备上时允许其与这些服务之间的通信。后端连接器616可以支持对多种不同类型的数据源106的访问,例如但不局限于通过基于通信连接器的体系结构暴露各个直接通信接口。在运行时,工具116读取插件注册表,将所贡献的后端扩展名添加到后端连接器616的集合中,例如但不局限于针对网络服务的连接器。
后端连接器616可以负责(例如但不局限于):连接后端数据源106(如网络服务、数据库等)中所选择的一个(或多个);提供用于访问后端数据源106的描述(如消息、操作、数据类型)的接口;和/或提供通知服务(将通知通过网络10推送到设备100的那些服务-参见图1)的标识。后端连接器616可以提供针对后端数据源106(如网络服务、SQL数据库或其他)的接口,以便访问数据源描述,并且可以提供后端消息收发的具体实现细节与由设计时数据模型608维护的类消息收发描述302之间的一定程度的概要(abstraction)。例如,后端连接器616可以用于产生针对应用程序105的适当消息404和数据400组件集,并且由模型生效器620使用,作为生效任务的一部分,以验证正在开发的应用程序105中的现有消息映射302关系是否健全。例如,可以将后端连接器616实现为使用API呼叫作为协议来访问底层后端数据源106的接口(例如,使用针对网络服务的WSDL接口)。
设备皮肤管理器618管理Eclipse扩展点,例如,允许工具116仿真不同的设备100(参见图1),从而可以规定(应用程序105的)不同目标设备100的感观。在运行时,工具116读取插件注册表,并将所需的皮肤扩展名或呈现环境630添加到由管理器618管理的设备环境630的集合中,例如但不局限于针对通用BlackBerry TM或其他设备100的环境630。皮肤管理器618由测试/预览查看器806使用,以便加载看起来适合于所仿真的设备100的可视元素(由数据模型608、610的屏幕组件402所定义),即与特定的环境630相兼容的元素。不同的皮肤或呈现环境/格式630是“可插入”到工具116的管理器618中的,意味着第三方可以通过创建新的惟一的SkinId(Eclipse扩展点)并实现用于创建由仿真设备100的运行时环境RE所支持的屏幕元素的实例的适当接口,来实现其自己的呈现环境630。为了加载新的呈现环境630,测试/预览查看器806首先向管理器618请求特定环境630的实例。然后,管理器618例示环境630,并且测试/预览查看器806使用特定的环境6320,根据模型608、610的屏幕组件402构建屏幕元素。例如,通过使用Eclipse框架的定制Eclipse扩展点,将呈现环境630(如皮肤插件)识别为皮肤管理器618。
参考图6,UI层606由一组编辑器600、查看器602、向导604和对话605构成。UI层606使用模型-视图-控制器(MVC)的模式,其中每个UI模块601既是视图,又是控制器。UI层模型610利用由MVC模式定义的一些有关控制逻辑,与数据模型608、610进行交互。编辑器600是在工具116的用户选择“保存”之前不会提交模型608、610的变化的模块601。编辑器600的一个示例是脚本编辑器706(参见图7),稍后将进行描述。查看器602是在用户进行改动时立即将改动提交给模型608、612的模块601。查看器602的一个示例是导航器(项目视图)802(参见图8)。向导604是由一系列一个或多个对话605逐步驱动的模块601,其中每个对话605通过用户接口202(参见图2)从工具116的用户处收集特定的信息。在工具116的用户选择如“完成”等确认按钮之前,并不使用向导604将任何改变应用于设计时模型608。应当意识到,在示例插件设计工具116环境中,模块610可以扩展两种接口:Eclipse扩展点和扩展点接口。扩展点将系统中已经定义的惟一包或插件声明为功能扩展的入口点,如编辑器600、向导604或项目。扩展点接口允许工具116定义其自己的插件接口,例如,针对皮肤618和后端616连接器。
再次参考图6,工具116中的模块601(主要是编辑器600和查看器602)是数据模块608、610的观察器,并用于与所述应用程序的数据模块608、610(例如,组件400、402、404、406-参见图4)进行交互,或测试和修改数据模块608、610。当数据模块608、610改变时,通过更新应用程序105的呈现,通知和响应数据模块608、610。例如,工具116使用Eclipse建模框架(EMF)将Eclipse UI框架与工具116数据模块608、610相连,由此模块601可以使用标准的Eclipse接口来提供用于在显示器206(参见图2)上显示和编辑对象的信息。通常,EMP框架实现这些标准接口,并通过调用知道如何访问驻留在存储器210中的数据模块608、610的、所生成的适配器来适配对这些接口的调用。设计时数据模型608是正在开发的应用程序105的当前版本,并且由用户访问,采用模块601与模型608的关联数据进行交互。模块601还可以触发与设计时数据模块608有关的生效动作。模块601也可以引起根据驻留在存储器210中的设计时数据模型608生成一些或全部应用程序105。通常,设计时数据模型608通过接口UI202(参见图2)接受影响模型608的状态的一组命令,并且可以作为响应,产生一组事件。所述每个模块601(编辑器600和查看器602)包括影响模块601和数据模块608配对的命令和事件组。
参考图6和8,运行时数据模块610表示正在通过工具116进行开发的仿真应用程序105的状态,用作设计时数据模型608的基础和内容。运行时数据模块610存储以下主要项目的数值,例如但不局限于:数据组件400(参见图4);全局变量;消息组件404;资源304、306(参见图3);屏幕组件402和样式。在应用程序105仿真期间,为了测试和预览的目的(例如),运行时数据模块610与设计时数据模型608和测试/预览查看器806进行合作。查看器806也可以与皮肤管理器616进行合作,以便针对特定的设备100类型来仿真运行时数据模块610。运行时数据模块610还通过桥613向查看器806以及UI层606的其他关联模块601通知对模块601做出的变化。例如,在模块610的状态改变时,可以将API调用用作关联模块601的通知器。
参考图6和4,设计时数据模型608表示应用程序105开发项目的状态,并在模块608的状态已经改变并保存和加载来自存储器210的对象时,通过通知模块601,与UI层606的模块601进行交互。模型608的主要责任是定义应用程序105,包括但不局限于以下项目:数据组件400定义;全局变量定义;消息组件404定义;资源304、306定义;屏幕组件402定义;脚本406;样式定义和后端数据源106映射302描述符。设计时数据模型608响应于每个编辑器600、查看器602的命令。设计时数据模型608还响应于模块608的变化,向模块601发射事件,以及通过在数据模型608发生改变时通知相应的模块601,与其他模块601进行合作/通信(模块601-模块601交互)。数据模型608依赖于接口,以便串行化针对存储器210的模型608内容检索和存储。
以下将描述工具116编辑器602和查看器602用于与数据模型608进行交互的机制。EMF.Edit框架是由Eclipse框架提供的可选框架。工具116可以使用EMF.Edit框架和所产生的代码(例如)作为EclipseUI框架与工具数据模型608之间的桥或耦合613。根据模型-视图-控制器模式,编辑器600和查看器602并不直接知道模型608,而是依赖于提供显示和编辑608中的数据所需的信息的接口。
通常,例如,树查看器使用TreeContentProvider和LabelProvider接口来查询树的结构,并分别获得树中的每个节点的文本和图标。表格查看器和列表查看器按照类似的方式进行操作,但使用结构化的ContentProvider和LabelProvider接口。数据模型608中的每个类均为变化通知器,即无论何时属性或引用发生变化,则发射事件。例如,在EMF中,将通知观察器称为适配器,因为其不仅观察状态变化,而且可以通过支持附加的接口扩展其所附属的类的行为(无需子类)。通过适配器工厂(adapter factory)将适配器附属于模型对象。请求适配器工厂以特定类型的扩展来视频对象。适配器工厂负责创建适配器或返回现有适配器,模型对象并不知道对其本身的适配。工具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之一中添加或移除了参数;FieldMappingChanged-已经改变了消息等级、字段等级或原型映射;MessageContainmentChanged-已经改变了包含关系;MessageFieldChanged-已经针对消息404和/或屏幕402组件添加或移除了消息字段,或者改变了消息字段的属性;DataFieldChanged-已经针对消息404、数据400和/或呈现402组件添加或移除了数据字段,或者改变了数据字段的属性;NavigationChanged-在工作流组件406中,已经改变了可能包含导航代码的脚本;LocalizedStringChanged-已经添加、移除或改变了文字串;以及ExitCodeChanged-已经在工作流组件406的脚本中添加或移除了退出代码。
服务层614的模型生效620提供了针对UI层606的工具,例如使设计时数据模型608生效。模型生效器620用于检查应用程序105消息的设计时数据模型608呈现是否与消息收发操作的后端数据源106呈现一致。模型生效器620可以负责使要产生的应用程序105的模型608呈现生效,例如但不局限于以下元素:工作流组件406的工作流健全;组件400、402、404、406的参数和字段级映射的一致性;屏幕组件402的屏幕控制映射和屏幕刷新消息;组件400、402、404、406间和内的消息和/或数据复制。生效620的另一功能可以是使后端数据源106消息收发关系的模型608呈现生效。为了实现此职责,生效器与设计时数据模型608、应用程序生成器622和后端连接器616进行合作。通过应用程序生成器622进行请求模型生效器620使模型608(或模型608的一部分-根据需要)生效的请求,例如,使用工具用户接口202,经由将生成器622与生效器620相连的生效模型接口(未示出)。反过来,模型生效器620利用设计时数据模型608以及后端连接器616作为生效任务的一部分,设计时数据模型608包含应用程序105和映射文件元模型信息,后端连接器616支持对后端数据源106的接口。
参考图6和9,示出了模型608生效序列900。首先,请求901生效器620使模型608生效。生效器从数据模型608中获得902所有组件400、402、404、406,并依次生效903每个组件400、402、404、406的内容。然后,生效器620从数据模型608获得904后端映射302,然后,获得905后端数据源106的映射信息。进行比较906,以便使模型608生效907。
再次参考图6,本地化服务624负责(例如但不局限于):支持用户可视串的构建时间本地化;支持附加的本地化设置(例如,缺省时间和日期显示格式、缺省数字显示格式、缺省货币格式等);以及创建资源束文件306(和资源304),可以由构建服务626在准备可展开应用程序105(例如应用程序jar文件)时使用。例如,可以将本地化服务624实现为用于收集驻留在设计时数据模型608中的资源304、306的资源模块,以便将其包括在可展开应用程序105中。JAR文件可以是包含收集到单一文件中并进行了压缩以便有效地下载到设备100中的、针对应用程序的类、图像和声音文件。例如,本地化服务624由应用程序生成器622使用,来产生语言专用资源束306。构建服务626实现了资源束306的准备,并将资源束306与可展开应用程序105打包在一起。本地化服务624与工具编辑器600和查看器602进行交互(提供与之的接口),用于设置或操纵应用程序105的语言串和本地设置。
参考图6,应用程序生成器622可以负责(例如但不局限于):根据组件400、402、404生成应用程序XML;生成映射302描述符;优化组件400、402、404描述的字段次序;以及生成所需的相关性和脚本变换,以便存储在存储器210中。应用程序生成器622与设计时数据模型608合作,以获得包括应用程序105的开发组件400、402、404的内容。应用程序生成器622利用模型生效器620来检查应用程序105定义(组件400、402、404、406的定义)和映射302描述信息是否正确。然后,应用程序生成器622产生XML代码,包括和/或增补工作流组件406的脚本、和基于保存在设计时数据模型608中的关系的映射302文件描述符。应用程序生成器622使用本地化服务624产生语言资源束306,例如,通过资源束接口(未示出)。通过开发者使用工具116的UI 202访问的生成应用程序接口(即通过用户输入事件,如鼠标点击和/或按键)来启动应用程序生成器622生成处理。应当意识到,可以将生成器622配置为模块集合,例如但不局限于:用于产生XML 301(可以包括关联脚本)的代码模块和用于产生映射302描述符的映射模块。
参考图6和10,示出了生成针对应用程序105的应用程序人造产物301的序列1000,包括生成映射302文件。在步骤1001,由生效器620执行模型608的生效。在步骤1002,生成器622通过从模型608中获得1003组件400、402、404、406,并产生1004相应的XML 300,生成应用程序语言描述符(如XML)300(可以包括关联脚本)。在步骤1005,生成器622通过从数据模型608获得1006映射、然后生成1007后端映射描述符,生成后端映射302文件描述符。在步骤1008,本地化服务624准备资源束306(和资源304),以添加到应用程序105上,如以上参照图3所述。将所生成的应用程序105的人造产物310存储在存储器210中。
再次参考图2和6,工具116可以是运行在单一桌面计算机210上的工具。工具116提供了主要的开发能力,封装了针对应用程序105开发的开发、预览、生效和生成功能。但是,应当意识到,可以将构建服务626和/或安全服务632打包成分离的实体,以允许“本土”开发者手动且与工具116的其他应用程序开发分离地创建应用程序,而仍然利用可展开应用程序105包(例如,jar)的准备和安全方案。还应当意识到,也可以单独打包展开服务628,以允许“本土”开发者生成和展开适当的应用程序描述符文件。因此,工具116可以使用外部构建626和展开628服务工具、内部构建626和展开服务(如图6所示)或其配置,如本领域普通技术人员显而易见的那样。
参考图3和6,构建服务626提供用于构建应用程序105的可扩展形式的接口,并负责(例如但不局限于):产生显性文件(manifestfile),和产生可展开应用程序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,检索可用应用程序XML 300(可以包括关联脚本)。在步骤1104,服务626检索资源304、306,然后产生1105显性文件。在步骤1106,签署显性文件,然后生成1107应用程序jar文件。然后,使可展开应用程序105可用(例如存储在存储器210中),以便由展开服务628最终展开。
参考图6,安全服务532用于以根据jar文件内容产生的摘要来签署显性jar,并且具有两个主要的职责。第一个也是最重要的,安全服务可以用于产生可以包括在每个应用程序105 jar文件中的IDE(集成设计环境)标记。其次,安全服务632可以提供初始化工具116的安全基础设施的手段。构建服务626在构建时与安全服务632进行交互,以产生可以作为每个可展开应用程序105 jar显性文件的一部分的IDE标记。安全服务632也可以与构建配置元素(未示出-可以在服务632的外部)进行交互,用于允许安全服务的配置,例如但不局限于:已签署证书的初始建立;产生新的密钥;产生密钥请求;以及安装已签署的证书,如本领域所公知。
再次参考图6,展开服务628与UDDI仓库114相连,以安装/公布所产生的应用程序描述符文件,并且可以负责产生应用程序105的展开描述符。展开服务628在展开时使用可用的应用程序105 jar文件。尽管展开服务628并不安装应用程序105 jar文件,但服务628内部检查(introspect)jar文件,以确定支持何种语言(例如,在资源束306中显示)。可以将此信息添加到描述符文件中。
参考图6和12,示出了将应用程序105展开到UDDI(例如)仓库114中的序列1200。在步骤1201,开发者内部或外部发起展开服务628(在工具116的内部或作为分离工具)。在步骤1202,服务628检索可用应用程序jar。在步骤1203,服务628生成应用程序105的展开描述符,以及在步骤1204,通过仓库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提供商接口来获得绘制正在编辑的对象所需的信息。可以用实现了UI提供商接口的EMF核心对象来配置编辑器600,例如在使用Eclipse平台时,例如,ContentProvider、LabelProvider。EMF提供商对象通过委托(delegating)知道如何访问数据模块608的已生成适配器(项目提供商)来适配UI调用。
通常,编辑器600创建改变模型608的命令,从而可以通过取消API(未示出)来取消改变。这些改变可以由针对正在进行的开发任务的适当向导来辅助。可以用被称为编辑域的、保持命令堆栈的EMF核心对象来配置编辑器600。编辑域使用适配器工厂来找出能够创建该命令的适配器。所产生的适配器类(项目提供商)创建命令。编辑器600通过使用命令堆栈来执行命令。此外,使用Eclipse框架作为示例,EMF模型608是变化通知器。因为项目提供商是通知观察器,在数据模型608改变时,通知项目提供商。项目提供商之后通知提供商。提供商告知编辑器600和属性页,以便在变化通知之后进行刷新。
脚本编辑器706
脚本编辑器706是受限文本编辑器,用于编写应用程序105组件的命令(如JavaScript),例如但不局限于工作流组件406-参见图4。开发者域编辑器706之间的交互可以由脚本模式652(参见图13)辅助或者由其驱动,脚本模式652可以包括模式652(例如但不局限于):消息定向652a、控制条件652b和消息接收652c,稍后将进行描述。在用户不能在组件应用程序105中进行定义的情况下,可以限制如创建函数等一些语法。可以由脚本编辑器706编辑的示例命令可以包括以下命令(例如但不局限于):SaveScript,在用户保存应用程序105的脚本时使用。如果成功,SaveScript可以触发数据模型608命令NavigationChanged、LocalizedStringChanged和ExitCodeChanged。脚本编辑器706的示例输入事件可以包括以下事件(例如但不局限于):ComponentRemoved,由此如果移除的组件(400、402、404、406)影响了脚本的输入参数或由脚本使用的全局变量,脚本编辑器706提示工具116的用户修改后的脚本无效;以及ComponentRenamed,与ComponentRemoved相同。脚本编辑器706的示例接口通过实现org.eclipse.ui.editors.texteditors层次的子类,扩展了Eclipse框架的org.eclipse.ui.editors扩展点。工具116与组件(例如工作流406)中脚本的创建和/或修改进行合作,以及与影响到应用程序105的其他关联组件的已创建/已修改脚本的相互关系进行合作。
屏幕编辑器708
屏幕编辑器708负责帮助工具116的用户定义和布局与设备100上的数据的显示相关联的应用程序105的屏幕组件402中的结构化定义语言代码(如XML)。开发者与编辑器708之间的交互可以由屏幕模式656(参见图13)来辅助,或由其驱动,屏幕模式656可以包括模式656(例如但不局限于):幻灯片放映656a、表格656b、访问设备数据656c、条件屏幕控制656b和数据表656e,稍后将进行描述。可以将要包括在屏幕组件402中的UI控制放置在显示器206(参见图2)的编辑器部分232中的表格画布(未示出)上。屏幕编辑器708还可以编辑包括事件句柄的控制属性。
可以由屏幕编辑器708编辑的示例命令可以包括以下命令(例如但不局限于):ButtonChange,在开发者改变按钮控制时,(向数据模型608)发送此命令,如果成功,此命令将触发数据模型608的NavigationControlChange;MenuItemChange,在开发者改变菜单项时,发送此命令,如果成功,此命令将触发数据模型608的NavigationControlChanged;ChangeScript,在开发者改变菜单项时,发送此命令,如果成功,此命令将触发数据模型608的NavigationControlChanged;QueryMessages,在开发者需要应用程序105的屏幕可以发送或刷新的可用消息的列表时,发送此命令,并返回可用消息的列表;QueryData,在开发者需要绑定控制的可用数据对象的列表时,发送此命令,并返回可用数据的列表;NonNavigationControlChange,在修改了不影响导航(如标签、文本字段)的控制时,发送此命令;以及DataBindingChange,在改变数据绑定时,发送此命令,如果成功,此命令将触发数据模型608的DataBindingChanged和ScreenParameterListChanged。屏幕编辑器708的示例输入事件可以包括以下事件(例如但不局限于):ComponentRemoved,由此屏幕开发者(工具116的用户)可以检查组件是否是消息,以及关联屏幕组件402是否正用于导航,屏幕组件402所具有的数据对象是否对绑定或处理屏幕组件402的屏幕事件的脚本(例如,工作流组件406)进行控制;ComponentRenamed,与ComponentRemoved相同;ScreenParameterListChanged修改屏幕组件402,例如,如果正在使用的参数被改变,屏幕组件402必须调整参数或警告开发者那些相关性将不再有效且必须改变;MessageFieldChanged,由此屏幕开发者检查所述字段是否正在被屏幕组件402所使用;以及DataFieldChanged,由此屏幕开发者检查是否有任何控制与已经被改变的字段绑定,并适当地通知开发者。
屏幕编辑器708的示例接口使用GEF图形编辑器和/或VE编辑器,扩展了Eclipse框架的org.eclipse.ui.editors。工具116协调组件(例如屏幕402)中屏幕定义的创建和/或修改,以及协调影响到应用程序105的其他关联组件的已创建/已修改屏幕定义(以及关联数据定义)的相互关系。
数据编辑器710
数据编辑器710负责通过向开发者提供编辑数据组件400字段和属性的能力,帮助工具116的用户创建和修改应用程序105的数据组件400(以及可能的屏幕402和消息404组件)中的结构化定义语言代码(如XML)。开发者与编辑器710之间的交互可以由模式684(参见图13)来辅助,或由其驱动,模式684包括数据组件400方案,稍后将进行描述。通过取现有数据的对象的原型或根据对消息组件404中的消息对象的数据定义映射,通过刮擦(scratch)来创建新数据对象。
可以由数据编辑器710编辑的示例命令可以包括以下命令(例如但不局限于):AddRemoveFields,在开发者在数据对象定义中添加或移除字段时,发送此命令,如果成功,此命令将触发数据模型608的DataFieldChanged;LinkToExternalData,在开发者将数据对象定义链接到(应用程序105)外部的数据对象时,发送此命令,所述外部数据对象例如但不局限于日历或联系数据对象,如果成功,此命令将触发数据模型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可以包括模式658(例如但不局限于):消息内容目标658a和通知构建器658b,稍后将进行描述。消息设计器向开发者提供对组件消息(要发送给和来自后端数据源106(与设备100有关))的创建和编辑。这些消息可以包括请求/响应对,以及订阅/通知/退订通知消息。可以通过取现有消息的原型或通过根据数据源106(如WSDL和JDBC/SQL)的后端服务进行模板化,来创建消息定义。
可以由消息编辑器712编辑的示例命令可以包括以下命令(例如但不局限于):AddRemoveFields,在开发者在消息组件404中的消息中添加或移除字段时,发送此命令。消息编辑器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)来辅助,或由其驱动,模式648与应用程序工作流配置相关联,稍后将进行描述。工作流编辑器702定义形成了组件应用程序105的可视部分的核心的屏幕到屏幕过渡。可视地绘制屏幕和由于用户/脚本事件所引起的屏幕之间的过渡。
可以由工作流编辑器702编辑的示例命令可以包括以下命令(例如但不局限于):QueryScreens,在开发者需要从中选择屏幕的屏幕列表时(例如,在向工作流中添加新屏幕时),发送此命令;QueryScripts,在开发者需要脚本列表以调用屏幕导航事件时,发送此命令;QueryArrivingMessages,在开发者需要协调屏幕过渡的响应消息列表(包括通知)时,发送此命令;AddComponent,在开发者需要向工作流中添加工作流中并不存在的新屏幕、消息或脚本时,发送此命令,如果成功,此命令将触发数据模型608的ComponentAdded;以及ChangeNavigation,在开发者需要向工作流中添加新导航时,发送此命令,如果成功,此命令将触发数据模型608的NavigationChanged。
工作流编辑器702的示例输入事件可以包括以下事件(例如但不局限于):ComponentRemoved,由此工组流开发者(工具116的用户)可以检查组件是否是工作流对象(屏幕、脚本、到达消息),然后,工作流通过删除与此对象定义之间的所有关系来更新其自身;ComponentRenamed,由此工组流开发者(工具116的用户)可以检查组件是否是工作流对象,然后,工作流以组件的新名称更新其视觉;NavigationControlChanged,由此工作流开发者(工具116的用户)检查工作流是否必须根据控制概率来改变其导航视图,例如,如果已经在工作流中的屏幕商添加了按钮,则更新视图,以便在屏幕商示出新导航节点可用;ScreenParameterListChanged,由此工作流开发者(工具116的用户)检查屏幕参数列表是否已经改变,以及屏幕是否在工作流中,然后开发者更新屏幕中所涉及的任何导航的视图;NavigationChanged,由此工作流开发者(工具116的用户)检查是否发生了可能的导航改变,开发者找出并解析此改变,并对视图进行必要的更新;以及ExitCodeChanged,由此工作流开发者(工具116的用户)检查是否增加/移除了退出点,然后更新编辑器视图,以可视地反映。工作流编辑器702的示例接口使用GEF图形编辑器,扩展了org.eclipse.ui.editors。
消息-数据关系编辑器704
消息编辑器704负责帮助工具116的用户创建和修改应用程序105的互相关消息404和数据400组件中的结构化定义语言代码(如XML)。开发者与编辑器712之间的交互可以由模式648(参见图13)来辅助,或由其驱动,模式648与消息-数据关系配置相关联,稍后将进行描述。消息/数据关系编辑器704创建和编辑消息组件404和数据组件400之间的关系。这些映射影响到在运行应用程序105时如何将数据组件400组装成到达设备100的消息。例如,数据400和消息404组件之间共有的数据对象定义可以使数据对象驻留在数据组件400中,而只有将消息组件404与数据组件400中的数据对象定义进行链接的数据映射定义(声明了何处可以找到数据对象定义)驻留在消息组件404中,反之亦然。针对屏幕402和数据400组件之间共有的数据对象定义,可以采用类似的配置,由此数据对象定义驻留在一个组件中,而数据映射定义驻留在另一关联组件中,稍后将参照屏幕-数据关系查看器804(参见图8)对其进行描述。
可以由编辑器704编辑的示例命令可以包括以下命令(例如但不局限于):AddComponent,在用户向关系图中添加新的数据或消息时(同样具有向正在开发的应用程序105中添加组件的效果),发送此命令,如果成功,此命令将触发数据模型608的ComponentAdded;QueryMessages,在开发者需要消息列表以进行映射时,发送此命令;QueryData,在开发者需要数据列表以进行映射时,发送此命令;ChangeMessageLevelMapping,在开发者改变消息级映射时,发送此命令,如果成功,此命令将触发数据模型608的FieldMappingChanged;ChangeFieldLevelMapping,在开发者改变字段级映射时,发送此命令,如果成功,此命令将触发数据模型608的FieldMappingChanged;ChangePrototype,在开发者改变(添加/移除)数据对象之间的原型关系时,发送此命令,如果成功,此命令将触发数据模型608的FieldMappingChanged;以及ChangeContainment,在开发者改变数据对象之间的包含关系时,发送此命令,如果成功,此命令将触发数据模型608的MessageContainmentChanged。
编辑器704的示例输入事件可以包括以下事件(例如但不局限于):ComponentRemoved,由此开发者(工具116的用户)检查移除的对象是否是消息或数据,关系映射器删除涉及移除对象的任何关系;ComponentRenamed,由此开发者(工具116的用户)检查任何映射关系中是否设计重命名的对象,以新名称更新映射对象的可视呈现;MessageFieldChanged,由此开发者(工具116的用户)检查所述消息是否出现在关系编辑器中,然后在消息的可视呈现中反映字段变化,如果映射中涉及所述字段,则反映出所述变化,并且需要向开发者警告破裂的映射(例如,如果字段已经被移除);以及DataFieldChanged,与MessageFieldChanged相同,除了以数据代替消息以外。
编辑器704的示例接口使用GEF图形编辑器,扩展了org.eclipse.ui.editors。工具116协调组件(例如消息/数据404/400)中消息/数据定义的创建和/或修改,以及协调影响到应用程序105的其他关联组件的已创建/已修改消息/数据定义的相互关系。
本地化编辑器714
本地化编辑器714向开发者提供收集应用程序105端用户(设备100的端用户)可见的所有串,并在同一场所对其进行编辑。编辑器714还向开发者提供将针对每个串的多资源映射创建为不同的语言。可以由编辑器714编辑的示例命令可以包括以下命令(例如但不局限于):ChangeLocalizeString,在开发者添加、删除或修改本地化串时,发送此命令。编辑器704的示例输入事件可以包括以下事件(例如但不局限于):LocalizedStringChanged,用于确定在脚本编辑器中何时改变了文字串或者在屏幕编辑器708中何时改变了标签。本地化编辑器714可以通过扩展编辑器部分来扩展org.eclipse.ui.editors。
后端可视化编辑器716
后端可视化器716向开发者示出了消息组件404与驱动组件404的后端数据源106(网络服务、SQL等-参见图1)之间的关系。开发者与编辑器716之间的交互可以由模式648(参见图13)来辅助,或由其驱动,模式648与设备运行时环境RE(参见图1)和后端数据源106之间的消息和/或数据关系配置相关联,稍后将进行描述。编辑器716还向开发者提供向有正在开发的应用程序105支持的源列表中添加新源106。除了与设计时数据模型608进行交互以外,如针对使用所接收到的命令和事件的其他模块601所描述的那样,后端可视化编辑器716与后端连接器616(参见图6)进行合作。后端连接器616为可视化器提供从已知服务类型(例如网络服务、SQL数据库)的注册表请求ServicesInterface。返回此类型服务的列表,并且可以按照名称或迭代(iteration)进行查询。
可以由编辑器716编辑的示例命令可以包括以下命令(例如但不局限于):AddComponent,在开发者添加新消息时,发送此命令,如果成功,此命令将触发数据模型608的ComponentAdded;以及SpecifyMapping,在开发者将消息与选定后端数据源106相连时,发送此消息。编辑器716的示例输入事件可以包括以下事件(例如但不局限于):ComponentRemoved,由此开发者(工具116的用户)检查组件是否为消息,后端可视化器调整器针对该消息的映射;ComponentRenamed,与ComponentRemoved相同;以及MessageFieldChanged,由此开发者(工具116的用户)使与后端上所存在的消息字段不同的消息字段生效,并可视地通知任何破裂映射。可以通过对服务层的直接调用来访问后端数据源106。可选地,后台处理可以用于保持网络处理不会阻碍UI线程。编辑器716可以使用GEF图形编辑器来扩展org.eclipse.ui.editors。
查看器602
参考图6和8,查看器602是在开发者做出改动之后立即将改动提交给数据模型608的模块601。参考图8,示出了查看器在Eclipse插件中的分布(仅作为示例)。工具查看器602广义上分为两个类别,例如但不局限于:资源查看器810和图形编辑框架(GEF)查看器808,提供用于查看对象的编辑空间。用户可以查看其间的节点(实体)和连接(关系),从而定义例如组件400、402、404、406(参见图4)的XML编码的内容和相互关系。应当意识到,使用查看器602来创建和修改包含在组件400、402、404、406中的定义,以及创建和修改组件之间的定义的互相关性(例如,数据-数据、数据-屏幕、消息-数据、屏幕-数据、数据-消息),稍后将进行描述。Eclipse查看器是在开发者做出改动之后立即将改动提交给数据模型608的模块601。查看器602包括:导航器802,示出了以树视图(例如)实现的、应用程序105项目在显示器206(参见图2)的工作空间中的分层视图;测试/预览查看器806,仿真应用程序105的运行时行为;以及屏幕-数据关系查看器804,可以是屏幕402与绑定到相应屏幕上的数据400组件之间的关系的只读视图。每个查看器602可以创建位于org.eclipse.ui.views的扩展点,并且通常通过所选的缺省超类可以实现Eclipse平台的IViewPart接口。
导航器查看器802
导航器802向开发者提供了显示器206的工作空间中的所有项目应用程序105、文件夹和文件的层级树视图(例如)。开发者可以从浏览器802中浏览和操纵与所选应用程序105项目相关联的项目定义。
查看器802的示例命令可以包括以下命令(例如但不局限于):AddComponent,当通过导航器上下文菜单(未示出)向应用程序105项目添加新组件时,发送此命令,如果成功,此命令将触发数据模型608的ComponentAdded;RemoveComponent,在通过从导航器上下文菜单中删除而去除组件时,发送此命令,如果成功,此命令将触发数据模型608的ComponentRemoved;以及RenameComponent,当通过在导航器中选中而重命名组件时,发送此命令,如果成功,此命令将触发数据模型608的ComponentRenamed。
查看器802的示例输入事件可以包括以下事件(例如但不局限于):ComponentAdded,在添加组件时,导航器802刷新项目应用程序105的视图;以及ComponentRenamed,与ComponentAdded相同。例如,针对Eclipse框架,导航器查看器802的示例接口在于查看器802通过将org.eclipse.ui.views.navigator.ResourceNavigator作为子类来扩展org.eclipse.ui.views扩展名。
屏幕数据关系查看器804
屏幕/数据查看器804使开发者能够查看给定屏幕定义与绑定到其的数据定义之间的关系。接口可以是只读的,并且根据由相关联的屏幕404和数据400组件所贡献的设计时数据来构建。对于只读查看器804,查看器804不具有任何影响数据模型608的命令。查看器804的示例输入事件可以包括例如但不限于如下事件:ComponentRemoved,开发者(工具116的用户)用来检查以确定所去除的组件是否是屏幕402或数据404组件,开发者去除与所去除的组件之间的任何关系;DataBindingChanged,开发者(工具116的用户)用来检查以确定组件是否是屏幕402或数据400组件,并且当前在查看器804中是否打开,然后更新组件的名称;以及ComponentRenamed,开发者(工具116的用户)用来检查以确定Databinding是否涉及当前打开的屏幕402和/或数据400组件,然后在显示器206的视图中示出任何新的关系(见图2)。查看器804可以利用GEF图形编辑器扩展org.eclipse.ui.editors,而不仅仅作为“只读”编辑器视图。
测试/预览查看器806
测试/预览查看器806在设备100外部(在设计者的计算机201上——见图2)模拟应用程序105的运行时行为。查看器806与如下各项进行交互:服务层614中为所模拟的设备100管理皮肤插件集合的皮肤管理器618(见图6);对所模拟的应用程序105的属性和状态进行建模的运行时数据模型610;以及为所模拟的应用程序105提供元数据的设计时数据模型608(例如,屏幕上存在什么元素可视元素,以及它们将如何布局)。
参考图1和9,示出了一种用于开发应用程序105的方法900,其中应用程序105具有带有以结构化定义语言表达的描述符的组件400、402、404以及以指令序列表达的组件406。认识到,各个组件400、402、404、406交互,以便处理通过网络10从数据源106接收到的关于设备100的运行时环境RE的消息。在构建应用程序105时,通过与数据模型608交互来开发902组件400、402、404的定义,其中模型608用于提供应用程序的持久状态。通过与数据模型608交互来开发904第二组件的指令。获得906为应用程序105所选择的数据源106的消息映射信息,用于帮助基于映射信息来生成定义。一旦完成,将组件400、402、404、406组装908在应用程序105中。
应用程序开发模式648
推荐模式654
参考图13和14,工具116可以使用显示器206(图2)上出现的方法推荐模式(approach recommendation pattern)654作为向导604,以便引导开发者确定哪一个可用开发方法模式650最适于当前的开发活动。如上所述,通过工具116的用户接口202访问对话605,由此来引导向导604操作。例如,开发者在开发应用程序105时,会面对如何确定哪个方法模式650的初始问题。参考图14,开发者通过考虑可能影响所选择的模式650的某些问题,开始1402或者继续现有应用程序105项目,这些问题例如但不限于:对现有元素的框架的限制,这些元素例如在先应用程序、当前数据库配置或这些元素的某些组合。开发者然后回顾1404可能影响方法模式650选择的设计参数,可以包括的参数例如但不限于:存在带有由应用程序105进行模拟所需的良好理解的工作流和/或屏幕的现有应用程序操作;可能存在将连接在后端上的特定数据源106,并且希望基于该特定数据源106模式来对应用程序105建模;可能存在应用程序应该与之交互的现有web服务(数据源106),因此不应对该web服务(数据源106)的行为做出改变;以及应用程序105可能是web服务的简单测试,或者可能生成基于简单形式的接口。这些设计参数可以由模式654通过显示器206按需向开发者建议。
基于开发方法模式650以哪个(哪些)组件400、402、404、406为中心的决定1404,推荐模式654可以自动选择1406(通过显示器206传送给开发者)哪个模式,例如但不限于:以消息组件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可以被选择(手动或自动)作为开始开发过程的模块601。
再次参考图14,如果在步骤1406中的模式650决定例如是存在可用的现有web服务(数据源106),并且应用程序105被限制为采用相应的web服务接口,那么在步骤1408中可以采取以消息组件404为中心的方法,称作“自下至上方法”模式650a。这种情形的一种极端情形(其中,开发者很少关心应用程序看起来如何)可以允许使用也是以消息组件404为中心的懒人方法模式650c。另一方面,如果在步骤1406中,开发者具有紧密监视现有数据源模式的开发任务,则可以选择1408以数据组件400为中心的数据驱动方法模式650c。类似地,对特定业务域建模的数据组件400的标准集合可以是选择1408也是以数据组件400为中心的业务域模板模式650d的原因。因此,根据以组件400、402、404、406为中心的推理,可以按需选择上述或者其他的特定开发模式650。
开发模式650
自下至上方法模式650a
参考图13和14,自下至上方法模式650a采用如下方法:基于可用后端数据源106消息收发描述(例如SQL和WSDL)来生成合适的应用程序105。该模式选择650a中包括如下问题:如何智能且高效地建立对现有web服务或其他数据源106服务起作用的应用程序105;以及一个或多个现有后端数据源106服务是否是所开发的应用程序105必须针对或与之通信的。要考虑的示例设计参数是:典型公司具有其数据源106的可用服务的遗留集合,以及通过因特网可用的公共web服务集合可能是应用程序105的框架。因此,上述细节和决定可以通过显示器206向开发者显示,或者可以由开发者手动决定。根据以上描述,模式650a可以指导开发者(通过显示器206或用户接口202的其他装置)进行如下操作:
1.在步骤1410选择消息编辑器712(以及在步骤1408中选择相关联的消息相关向导604)(见图7),用于组装消息组件404;
2.输入目标web服务的URL;
3.挑选操作,以生成消息编辑器712的消息;
4.选择字段默认值;
5.确认对通过消息自动合并模式660b(下面进一步讨论)所生成的消息副本的推荐,例如通过使用模型生效器602(见图6);
6.如果开发者希望生成合适的数据组件400,可以应用消息内容目标模式658a(下面进一步讨论),以持续消息组件404的消息数据,或者将消息组件404的消息链接到屏幕组件402中所定义的屏幕;以及
8.通过利用相关向导604,使用相关联的编辑器600和查看器602,指定任何额外的数据400、屏幕402和工作流406(例如,导航)组件,可以完成1412应用程序的开发,如下面进一步讨论。这可以通过直接方法步骤1412或者通过在适当的向导604的指导下穿过步骤1408的路径来实现(由标号1409象征性地表示)。
懒人方法模式650b
参考图13和14,懒人方法模式650b可以是自下至上模式650a的扩展,由此生成包括数据组件400和屏幕组件402的整个应用程序6105。该模式选择650b中包括如下问题:如何高效生成能够对现有web服务数据源106进行测试的应用程序105;以及你处于开发的早期阶段,而你的目标web服务数据源106正在频繁改变消息收发模式,例如你希望能够快速生成应用程序105来测试接口,并不真正关注应用程序105的显示。要考虑的示例设计参数是:应用程序105的UI外观可能对于与web服务数据源106交换的能力具有较小的影响;以及开发者可能最关注后端数据源106的测试和调试。根据以上描述,模式650b可以引导开发者(通过显示器206或者用户接口202的其他手段)进行如下操作:
1.以自下至上方法模式650a开始,这在步骤1408中应用并被扩展;
2.在步骤1410以及1409(如果需要的话)中,结合数据编辑器710(以及可能结合编辑器704),模式650b提供建议数据组件400的集合,以对从消息组件404的消息调用传递或返回的数据建模;
3.要呈现或者要输入传递到web服务的数据的默认屏幕的集合由屏幕编辑器708(以及可能由查看器804)生成并接受;以及
4.通过利用相关向导604,使用相关联的编辑器600和查看器602,指定任何额外的数据400、屏幕402和工作流406(例如,导航)组件,可以完成1412应用程序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(以及在步骤1408选择相关联的数据相关向导604);
2.利用编辑器712(以及潜在地利用编辑器704),根据数据库模式选择生成数据组件400;
3.提供数据库模式的本地化(例如,可以通过ddl文件表达);
4.在之前的每个步骤中,建议匹配数据组件400以“缓存”由表来表达的数据;
5.开发者可以选择可用表的子集,从而工具116维护基于最小(或其他预定标准)的相关联必需表的关系集;
6.用户可以指定如何访问表,例如选择/更新/删除,并且可以由消息编辑器712生成建议消息,以支持这些功能;以及
7.利用工具116所提供的相关向导604,通过提供消息组件400以利用消息编辑器712执行与数据源106的交互(假设跳过步骤6.),并且提供屏幕组件402以通过在步骤1412中采用适当的屏幕编辑器708和查看器804可视化并操作数据组件400,完成1412应用程序。
业务域模板模式650d
参考图13和14,业务域模板模式650d可以用来帮助开发者,作为生成对应用程序105的特定业务域建模的数据组件400的标准集合的主要方法的一部分。该模式选择650d中包括如下问题:如何产生最适于特定垂直市场位置的应用程序105;以及正在针对业务应用的特定域(例如,保险、卫生部门、房地产、汽车工业等)开发应用程序105。要考虑的示例设计参数是:业务部门通常具有其自身的良好定义的实体和关系;开发者希望确保域用户熟悉应用程序105;希望避免重复劳动;并且希望确保应用程序105坚持惯例。根据以上描述,模式650d可以引导开发者(通过显示器206或者用户接口202的其他手段)进行如下操作(仅作为示例):
1.通过开发者使用UI 202,在显示器206上调用1408业务域模板模式650d(例如,向导),并且提供业务域的模式(XSD)本地化;
2.工具116在步骤1410中通过使用数据编辑器710生成匹配业务域的数据组件400的集合;
3.开发者可以选择感兴趣的模式的对象,丢弃不使用的那些对象(典型的域模式非常大);
4.工具116维护模式中连接的数据表达之间的关系,以确保包括所有相互依存的组件400;以及
5.利用工具116所提供的相关向导604,通过提供消息组件400以利用消息编辑器执行与数据源106的交互,并且提供屏幕组件402以通过在步骤1412中采用适当的屏幕编辑器708和查看器804可视化并操作数据组件400,完成1412应用程序105。
认识到,除了上面仅作为示例所描述的那些,向导604也可以针对各个模式650a、b、c、d按需指导使用其他编辑器600和查看器602。这包括在向导604和相关联的模式648之间进行交互,这种交互优选地通过在显示器206上(或者通过用户接口202)向开发者所显示的针对各个模式650a、a、c、d的向导604来指导。
生效模式660
消息自动合并模式660a
消息自动合并模式660a是可以减少与后端数据源106所交换的消息组件404的消息的定义重复的改良模式。作为开发者在UI 202上输入事件的结果,当为了应用程序105的生效目的调用生效器620(见图6)时,该模式660a可以实现在显示器206上。该模式选择660a中包括如下问题:如何生成消息的最高效集合,以与后端web服务交互;以及正在利用自下至上方法模式650a开发应用程序105,并且已经针对特定的web服务(数据源106)生成了消息集合。要考虑的示例设计参数是:某些接口可能交换类似或重复的参数集合;以及每个重复的规范在无线传输开销之外对于设备运行时环境RE需求具有根据应用程序105大小的相关联(且多余的)成本。根据以上描述,模式660a可以引导开发者(通过显示器206或者用户接口202的其他手段)进行如下操作(仅作为示例):
1.(例如)由自下至上方法模式650a如上所述提供(例如由消息编辑器712提供的消息组件404的)生成消息的集合;
2.分析消息,以确定在消息方面是否存在公共性,例如,一个消息是另一消息的子集(比较字段数目&类型)和/或任意重复消息定义;
3.工具116推荐何处可以使用原型通过继承来定义类似消息,或者何处可以去除重复消息。
数据自动合并模式660b
当应用于所开发的应用程序105的数据组件400规范(例如,通过数据编辑器710)时,该模式660b能够提供与针对消息自动合并模式660a中的消息所讨论的相同种类的优化和步骤。
屏幕模式656
参考图14,在步骤1410和/或1412可以应用屏幕模式656作为副模式648,以帮助根据主模式650指导/协调来生成屏幕组件402,即,在帮助开发者生成应用程序105的屏幕组件402时,模式650驱动模式656,该模式656驱动屏幕编辑器/查看器704、804的操作。图15示出了主、副模式的协调1500,其中(例如由模式654)首先调用1502主模式(例如,模式650)。然后主模式调用或者选择1504副模式(例如,模式652、656、658、660),副模式又帮助或调用适当的编辑器600和查看器602,用于由开发者按需或者由模式652、656、658、660(即,向导604)指导开发组件400、402、404、406。还应认识到,主模式可以按需直接调用1508适当的编辑器/查看器600、602。此外,一旦副模式在开发相应组件400、402、404、406时完成其对相关联的编辑器/查看器600、602的指导(即,模式658指导编辑器712来构建消息组件404),可以将指导权归还1510给原始的主模式或不同的主模式,或者交给1512其他副模式,以继续应用程序105开发。
表格模式656b
表格模式656b向开发者提供利用屏幕编辑器704和查看器804高效生成屏幕(作为屏幕组件)的方式,其收集并提交某些值。该模式选择656b中包括如下问题:如何高效产生表格来收集并提交某些信息;以及要产生的屏幕具有结构化(例如,基于表的)格式。要考虑的示例设计参数是:频繁使用表格来收集信息(例如,用户详情、首选项)的标准集合。根据以上描述,模式656b可以引导开发者(通过显示器206或者用户接口202的其他手段)进行如下操作(仅作为示例):
1.模式656b利用编辑器/查看器704、804向开发者提示表格中将出现的列数;
2.或者表格中要出现的每一行;
a.开发者识别什么类型的控制出现在每一列中,例如标签、编辑框、图像等,从而开发者针对任何标签输入所需文本,并且在合适时识别数据映射;
3.开发者通过提交来识别如何进行屏幕转换,例如通过按钮提交,通过菜单项提交,并且在合适时应用消息发起模式652a;以及
4.完成屏幕组件402开发(全部或局部),并且直接调用或者通过随后的向导604调用随后的编辑器/查看器600、602。
数据单模式656e
数据单模式656e提供例如基于数据组件400的数据定义生成屏幕的方式。该模式选择656e中包括如下问题:如何生成基于现有数据定义的屏幕;以及在使用该模式656e时,屏幕变为可视手段以表示数据结构本身。要考虑的示例设计参数是:仅仅为了修改数据组件400的目的而生成某些屏幕。根据以上描述,模式656e可以引导开发者(通过显示器206或者用户接口202的其他手段)进行如下操作(仅作为示例):
1.利用屏幕编辑器/查看器704、804,开发者提供数据组件400定义,根据该定义来生成屏幕;
2.工具116生成屏幕(利用屏幕组件402以及相关联的编辑器/查看器600、602),该屏幕具有两列:一列用于字段名称,另一列用于字段值,从而
a.可以基于数据组件400定义字段名称,自动生成控制名称,
b.基于数据类型生成控制类型,其中,
i.简单字段映射到编辑框,以及
ii.嵌套数据字段产生“添加”、“编辑”和“去除”按钮。重新应用数据单模式656e,以生成将嵌套数据组件400可视化的屏幕(屏幕组件402),从而,
I.“添加”、“编辑”和“去除”按钮的显示取决于运行时条件(即,嵌套组件是否为空),
iii.嵌套数组类型字段生成选择列表,从而
I.简单值的数组可以直接由选择列表表示,
II.组件的数组使用要针对所包含的数据类型重复应用的数据单模式656e,以及
III.可以基于运行时条件显示“添加”、“编辑”和“去除”按钮,
a.总是显示“添加”,
i.在运行时,“添加”按钮可以打开对话605,以收集简单值,或者可以将应用程序105转换到子页面,以创建数据组件400,
b.在做出选择时显示“编辑”,
c.在做出选择时显示“去除”,
i.如果用户希望去除所有嵌套数据实例,可以向用户提示去除数据组件400,
iv.字段在图像字段中具有资源指定结果,
c.应该由开发者输入字段标签,
d.开发者可以自行跳过任何特定字段,
3.工具116生成应用值的提交按钮,以及
4.完成屏幕组件402开发(全部或局部),并且直接调用或者通过随后的向导604调用随后的编辑器/查看器600、602。
幻灯片放映模式656a
幻灯片放映模式656a生成将图像的动态集合可视化的屏幕(即,屏幕组件402)。该模式选择656a中包括如下问题:如何高效放映一系列图像,其中图像数目是动态的,这在设计时不能确定;以及应用程序105依赖于URLS的动态集合,其中URLS可以基于某些在先条件指向不同图像。要考虑的示例设计参数是:产生屏幕以及允许这种行为的脚本是困难且耗时的。根据如上描述,模式656a可以引导开发者(通过显示器206或者用户接口202的其他手段)进行如下操作(仅作为示例):
1.利用屏幕编辑器/查看器704、804,开发者识别URLS的源(根据数组)
a.可能是关于数据组件400的数组字段,
b.可能是关于接收到的消息的数组字段;
2.工具116生成基本屏幕(组件402),该基本屏幕具有映射到全局变量的图像控制
a.工具116生成全局变量;
3.工具116生成“下一”按钮
a.生成附加脚本组件406,其向2.a的全局变量加载自1开始的下一图像URL;
4.工具生成“完成”按钮;以及
5.完成屏幕组件402开发(全部或局部),并且直接调用或者通过随后的向导604调用随后的编辑器/查看器600、602。
访问设备数据模式656c
访问设备数据模式656c基于设备访问(例如,日历约会、地址簿条目等),提供对“内置”类集的智能处理。模式656c提供在由设备100所管理的全部组件类集与由应用程序105创建并管理的组件子集之间进行区分的手段。该模式选择656c中包括如下问题:如何容易地区分整个设备100所管理的外部组件类集的使用与仅仅是应用程序100在其上运行的组件子集;以及正在开发引用外部类集(例如,日历约会)的屏幕组件402。要考虑的示例设计参数是:某些应用程序105可能希望在外部应用程序所管理的所有外部类集实体上运行;某些应用程序105可能希望表示仅由其自身创建并管理的外部应用程序组件。根据以上描述,模式656c可以引导开发者(通过显示器206或者用户接口202的其他手段)进行如下操作(仅作为示例):
1.利用屏幕编辑器/查看器704、804,开发者将控制链接到“内置”类集(例如,日历或地址簿);
2.开发者为内置类集指示包含关系
a.类集可以包括由所访问的应用程序在外部创建和管理的所有参考
b.类集可以仅包括由应用程序创建或明确引用的那些组件;
3.工具116针对2中所指示的情形,生成数据组件400
a.对于组件的标准类集,应用程序105数据组件400通过名称(例如,“地址”)简单地使用内置组件,
b.对于应用程序105所管理的类集,应用程序数据组件400扩展内置组件并添加UID键字段,
i.向所扩展的数据组件400给予隐藏名称,可能通过将应用程序105名称挂在类集名称之前,
ii.工具116然后在生成屏幕时利用该隐藏名称,但是在设计工具116的视图时继续使用内置类集名称,
iii.工具116维护关系,以在将数据传递到脚本或另一屏幕组件406、402时校正底层类型;以及
4.完成屏幕组件402开发(全部或局部),并且直接调用或者通过随后的向导604调用随后的编辑器/查看器600、602。
支持代码:
可以如下扩展内置类集,以允许应用程序105所管理的类集:
<data name=”[wicletName]Address”prototype=”[UIDpkg]”pkey=”UID”>
<dfield name=”UID”type=.../>
</data>
制作屏幕控制条件模式656d
制作屏幕控制条件模式656d允许开发者将条件附加到屏幕控制上,其中屏幕控制指定确定可视性的标准。该模式选择656d中包括如下问题:如何指定特定控制只可能在特定环境下才示出;如何按照将尽可能少的导航逻辑嵌入到脚本组件406中、而是以屏幕定义来表达的方式来编写应用程序105;以及正在开发具有以某些可测试标准为条件的导航或消息发送的应用程序105。要考虑的示例设计参数是:希望将用于导航的条件逻辑从脚本移入屏幕组件402的定义中;以及希望完全利用其他更有帮助的模式,例如消息发起模式652a(例如)。根据以上描述,模式656d可以引导开发者(通过显示器206或者用户接口202的其他手段)进行如下操作(仅作为示例):
1.利用屏幕编辑器/查看器704、804,开发者指示特定控制受到条件逻辑的支配;
2.工具116呈现可以用来表示条件的区域
a.显示在先生成的条件以便重新使用;
3.工具116将条件关联到控制,并且提示是否要应用诸如消息发起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:(错误方法)
<screen 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的方法,消息发起模式652a可以更容易应用。
脚本模式652
消息发起模式652a
消息发起模式652a提供了生成发送消息组件404的消息所需脚本的智能手段。模式652a应用某些规则来确定消息的内容应该源自何处。该模式选择652a中包括如下问题:正在开发将收集或操作某些信息然后发送消息的屏幕组件402;如何容易地产生发送该消息所需的脚本;屏幕组件402具有用于处理的相关联数据类型,这可以是作为屏幕中所构建的参数提供的,或者是作为类集的一部分引用的。要考虑的示例设计参数是:生成用于公用的脚本的能力可以减小开发应用程序105的复杂度;以及依附于应用程序105开发最佳实践的消息、屏幕、数据定义或者各个组件以及它们之间的关系通常可能受到一组公认处理规则的支配。根据以上描述,模式652a可以引导开发者(通过显示器206或者用户接口202的其他手段)进行如下操作(仅作为示例):
1.利用工作流/脚本编辑器702、706,在开发可能有条件地分支到其他屏幕(组件402)或者发送不同消息的工作流组件406时,条件逻辑应该在屏幕组件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的效果的规范;正在编写接收消息的应用程序105;感兴趣的消息包含字段级映射,指示可能需要通过工作流组件406的脚本的额外处理。要考虑的示例设计参数是:存在可以适用于字段级映射消息的公共场景;以及消息中存在不更新其他映射数据字段的主键字段映射。根据以上描述,模式652c可以引导开发者(通过显示器206或者用户接口202的其他手段)进行如下操作(仅作为示例):
1.利用工作流/脚本编辑器702、706,分析消息M的消息规范,
a.消息映射适当地指示需要额外处理的可能性较低,其中不需要工具116向开发者提示附上脚本,
b.字段映射关系适当地指示通过脚本进行额外处理的可能性较高,尤其是
i.具有主键字段映射到没有引用其他消息字段的数据类型的消息是直接触发,或者通过工具116提示需要额外处理;
2.检测主键字段映射,
a.如果存在一个隔离的主键字段映射(即,创建),工具116可以向开发者提示是否希望通过脚本附上额外处理,在这种情形中所创建的工作流组件406的脚本将为空,
b.如果存在两个或多个这样的上述隔离映射:
i.如果一个映射数据类型是其他数据类型的嵌套字段:数据1.x,x的类型是数据2,
I.工具116推荐将数据2的实例设置在数据1字段x上
II.生成工作流406的脚本,执行设置操作
ii.如果一个映射数据类型是另一数据类型上的嵌套类集的基础类型:Data1.x,x的类型是Data2,
I.工具116推荐可以执行添加或去除,
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.针对类集显示“包含字段”文本,
II.针对无键(单件)类集显示“字段值是”,
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.开发者可以通过选择“更多”并选择适当的算符(例如,AND/OR)来组合另一条件;
4.如果需要其他高级行为,开发者可以选择以脚本形式编辑条件;以及
5.完成工作流组件406开发(全部或局部),并且直接调用或者通过随后的向导604调用随后的编辑器/查看器600、602。
消息收发模式658
通知建立模式658b
通知建立模式658b提供了根据通知数据源106生成通知和订阅支持的手段。该模式选择652c中包括如下问题:如何容易地生成屏幕和消息以支持后端的通知接口;如何生成用于筛选通知的过滤器;以及正在为通过WSDL文件(作为示例后端模式)表达的通知接口工作。要考虑的示例设计参数是:预期通知web服务将变得更广泛;通知接口以及支持订阅和过滤是复杂区域;开发者必须至少知道数据源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.对于串,==、!=,
ii.对于数字,==、!=、>、<、>=、<=,
iii.其他类型,
c.开发者可以选择比较字段
i.通知的另一字段(无窗口小部件)或者单个原义值,
I.开发者可以指示该过滤器部件是有条件的,
a.使用复选框将其表示在屏幕上,
ii.自由形式条目字段,
I.使用编辑框将该过滤器部件表示在屏幕上,
II.开发者提供文本标签,
iii.枚举值,
I.使用下拉或无线按钮来将该过滤器部件表示在屏幕上,
d.开发者对过滤器部件命名(这用于在屏幕上显示的目的),
e.开发者可以指示添加另一过滤器部件(布尔表达式),利用&&或者‖算符结合;
4.工具116记录所有引用的通知字段,其他字段是静态通知标准的候选,即,在设立通知时用户提供的信息
a.询问开发者是否要组合其他字段作为元素滤波器标准的一部分,
b.如果这样的话,利用步骤3的方法建立额外的滤波器部件,由此只允许编辑框和下拉字段进行输入(这里没有条件过滤器部件),从而该标准变为静态标准;
5.工具116利用适当的编辑器600和查看器602生成所需的组件
a.数据组件400,包含通知的所有字段+额外的主键字段(id),
b.通知消息组件404
i.针对所支持的每个通知类型的订阅消息组件404,
ii.针对多支持的每个通知类型的退订消息组件404,
iii.映射到数据通知组件404的通知消息,
c.提醒消息组件404(如果选择的话)
i.针对所支持的每个通知类型的提醒订阅消息组件404,
ii.针对所支持的每个通知类型的提醒退订消息组件404,
iii.具有合适的提醒标签的提醒通知消息组件404,
d.包含每个通知和提醒的过滤器的映射文件
i.包含在过滤器部件映射到复选框控制时出现的条件元素的过滤器(即,动态过滤器)生成过滤器部件的组合(对于第一阶段只支持一个这样的过滤器部件,即,至多2个过滤器),
I.针对通知或提醒的订阅消息包括指示是否已经选择该标记的布尔字段,从而应用程序网关AG基于标记状态应用正确的过滤器;
6.工具116生成支持屏幕(组件402)
a.工具116决定通知基本布局1600最佳方法(见下述图16),
i.对于大于4个可视通知信息字段1604,推荐字段1604的堆叠(垂直)布局1602,
ii.对于小于4个可视通知信息字段1604,推荐字段的行(流)布局1606,
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。更新订阅脚本1710负责发送适当的通知和/或提醒消息。添加1712菜单项将用户转换到新通知屏幕1704,其中可以指定通知和提醒字段以及订阅的静态标准1707。提交按钮1714调用创建订阅脚本1716,其发送适当的订阅消息。最后,去除1718菜单项运行脚本1720,其去除当前通知和相关订阅。
分离屏幕:
图18示出了用于分离的结果和过滤器修改屏幕的生成屏幕1800。这里示出了行布局,但是对于屏幕的行为没有影响。黑和白框1802映射到通知的字段(字段A至D)。黑框1802被认为只读,而白框1802可以修改。主屏幕1806在重复布局1808中显示了所有先前设立的通知结果。不能从该屏幕1806修改过滤器。改变1810菜单项将用户转换到屏幕1812,其中显示单个通知。在该屏幕1812中不修改静态标准1814,而是可以更新通知字段,以生成重新订阅。更新订阅脚本1814将负责发送适当的订阅消息,包括是否修改了提醒和通知过滤器。添加1818菜单项将用户转换到屏幕1814,其中可以指定通知和提醒过滤器以及订阅的静态标准1814。提交按钮1822调用创建订阅脚本1824,其发送适当的订阅消息。最后,去除1818菜单项运行脚本1820,其去除当前通知和相关订阅。
示例:
将使用来自“AG、RE、IDE通知”文档的天气通知示例来说明该模式658b。
1.开发者指向天气通知web服务,
2.开发者选择通知复杂对象作为通知对象,
3.开发者指示他们将接收提醒以及通知,
a.开发者指示提醒将不指定其自身的标准,只是允许将其打开及关闭:生成复选框,
4.工具116开始建立通知标准,
a.开发者指示来自通知的自动类型,
b.开发者指示算符==,
c.开发者指示与枚举类型值“提醒”、“预报”、“报告”比较:生成下拉按钮,
d.开发者为过滤器部件命名:提醒类型,
e.开发者指示利用算符&&添加另一过滤器部件,
f.开发者指示来自通知的字段‘温度差(temperatureDiff)’,
g.开发者指示算符==,
h.开发者指示与枚举数字范围5、10、15、20、25、30、25、40比较:生成下拉按钮,
i.开发者为过滤器部件命名:温度差,
j.开发者指示利用算符&&添加最终过滤器部件,
k.开发者指示来自通知的字段‘原始天气’,
l.开发者指示算符!=,
m.开发者指示来自通知的字段‘新天气’
i.工具询问开发者这是否为条件字段
ii.开发者指示是:生成复选框
n.开发者为过滤器部件命名:天气改变
5.工具116识别没有包括在通知标准中的一组通知字段,
6.开发者指示存在要包括在订阅中的额外字段。它们不能由用户动态改变,只能在设立新订阅时指定(静态标准),
7.开发者通过针对通知的位置、国家和州中每一个指定自由形式输入框,向过滤器添加部件4。针对逻辑算符重复应用部件4的机制:为每一个生成编辑框,
8.工具116基于静态和通知标准中的字段数目推荐堆叠布局,
9.开发者从统一屏幕或分离屏幕方法中选择,以便修改通知标准,
10.工具116生成
a.针对提醒+通知的必需订阅消息,
i.生成布尔标记,指示是否选择了天气改变复选框,
b.包括所有过滤器的必需映射文件,
i.针对天气改变过滤器部件的分离过滤器,
c.必须退订消息
d.利用堆叠布局的屏幕,
i.在除了添加通知屏幕之外的所有屏幕中,静态标准字段都是标签
ii.通知标准字段在添加通知屏幕和改变通知屏幕以及主屏幕(如果利用统一屏幕的话)中是可编辑的,
iii.为每个过滤器部件提供的标签附加到相应的编辑框、复选框或下拉按钮。
消息内容目标模式658a
该模式658a用来确定什么元素受到消息影响。消息的目标通常是屏幕402和数据400组件。该模式选择658a中包括如下问题:利用手头的消息定义,如何指定接收消息对应用程序的效果;正在使用自下至上方法模式650a,或者正在定义自己的消息集合;以及希望将这些消息连接到应用程序105的某些元素,以指定消息接收如何影响应用程序105行为。要考虑的示例设计参数是:消息接收以某种方式影响应用程序105的操作;消息接收可以具有一组标准效果。根据以上描述,模式658b可以引导开发者(通过显示器206或者用户接口202的其他手段)进行如下操作(仅作为示例):
1.利用具有手头的消息定义的消息编辑器712,开发者可以指定消息:
a.生成数据组件400实例
下面定义了由应用程序网关AG用来将通过网络10的应用程序消息收发与WSDL中定义的web服务SOAP消息联系起来的示例映射302。<?xml version="1.0"encoding="ASCII"?><definitions 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:s0="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:componeht 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:mapName="s0:GetWeatherByZipResponse"map:mapType="element"map:name="GetWeatherByZipResponse">
   <map:field map:mapName="s0: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:TempefatureF"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:mapType="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="s0: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="s0: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="s0: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:component>
 <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="s0: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="s0: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:WMOIDItem"map:mapType="element"map:name="WMOIDItem"/>
   <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="s0: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:inputmap:component="outGetWeatherHistoricalByZipSoapIn"/>
     <map:outputmap: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:application></documentation><types>
<s:schema elementFormDefault="qualified"targetNamespace="http://www.serviceobjects.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:sequence>
      <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:seguence>
      <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 minOccurs="0"maxOccurs="unbounded"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 minOccurs="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="s0: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="GetWeatherByIPHttpGetOut"><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="s0: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 postalcode.</documentation>
 <input message="s0:GetWeatherByZipSoapIn"/>
 <output message="s0:GetWeatherByZipSoapOut"/></operation><operation name="GetWeatherByCityState">
 <documentation>Returns the weather for a given US city andstate.</documentation>
 <input message="s0:GetWeatherByCityStateSoapIn"/>
 <output message="s0:GetWeatherByCityStateSoapOut"/></operation><operation name="GetWeatherByIP">
 <documentation>Returns the weather for a given IPAddress.</documentation>
 <input message="s0:GetWeatherByIPSoapIn"/>
 <output message="s0:GetWeatherByIPSoapOut"/></operation><operation name="GetWeatherHistoricalByZip">
 <documentation>Returns historical weather information for a given USpostal 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 theGetWMOIDByCity method.</documentation>
 <input message="s0:GetWeatherByWMOIDSoapIn"/>
 <output message="s0:GetWeatherByWMOIDSoapOut"/></operation><operation name="GetWMOIDByCity">
 <documentation>Returns the WMOIDs for a partial citymatch.</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 postalcode.</documentation>
 <input message="s0:GetWeatherByZipHttpGetIn"/>
 <output message="s0:GetWeatherByZipHttpGetOut"/>   </operation><operation name="GetWeatherByCityState">
 <documentation>Returns the weather for a given US city andstate.</documentation>
 <input message="s0:GetWeatherByCityStateHttpGetIn"/>
 <output message="s0:GetWeatherByCityStateHttpGetOut"/></operation><operation name="GetWeatherByIP">
 <documentation>Returns the weather for a given IPAddress.</documentation>
 <input message="s0:GetWeatherByIPHttpGetIn"/>
 <output message="s0:GetWeatherByIPHttpGetOut"/></operation><operation name="GetWeatherHistoricalByZip">
 <documentation>Returns historical weather information for a given USpostal code,date,and time.</documentation>
 <input message="s0:GetWeatherHistoricalByZipHttpGetIn"/>
 <output message="s0:GetWeatherHistoricalByZipHttpGetOut"/></operation><operation name="GetWeatherByWMOID">
 <documentation>Returns the weather for a given WMOID.Also see theGetWMOIDByCity method.</documentation>
 <input message="s0:GetWeatherByWMOIDHttpGetIn"/>
 <output message="s0:GetWeatherByWMOIDHttpGetOut"/></operation><operation name="GetWMOIDByCity">
 <documentation>Returns the WMOIDs for a partial citymatch.</documentation>
 <input message="s0:GetWMOIDByCityHttpGetIn"/>
 <output message="s0:GetWMOIDByCityHttpGetOut"/></operation></portType><portType name="DOTSFastWeatherHttpPost"><operation name="GetWeatherByZip">
 <documentation>Returns the weather for a given US postalcode.</documentation>
 <input message="s0:GetWeatherByZipHttpPostIn"/>
 <output message="s0:GetWeatherByZipHttpPostOut"/></operation><operation name="GetWeatherByCityState">
 <documentation>Returns the weather for a given US city andstate.</documentation>
 <input message="s0:GetWeatherByCityStateHttpPostIn"/>
 <output message="s0:GetWeatherByCityStateHttpPostOut"/></operation><operation name="GetWeatherByIP">
 <documentation>Returns the weather for a given IPAddress.</documentation>
 <input message="s0:GetWeatherByIPHttpPostIn"/>
 <output message="s0:GetWeatherByIPHttpPostOut"/>   </operation><operation name="GetWeatherHistoricalByZip">
 <documentation>Returns historical weather information for a given USpostal 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 theGetWMOIDByCity method.</documentation>
 <input message="s0:GetWeatherByWMOIDHttpPostIn"/>
 <output message="s0:GetWeatherByWMOIDHttpPostOut"/></operation><operation name="GetWMOIDByCity">
 <documentation>Returns the WMOIDs for a partial citymatch.</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:operationsoapAction="http://www.serviceobjects.com/GetWeatherByZip"style="document"/>
 <input>
   <soap:body use="literal"/>
 </input>
 <output>
   <soap:body use="literal"/>
 </output></operation><operation name="GetWeatherByCityState">
 <soap:operationsoapAction="http://www.serviceobjects.com/GetWeatherByCityState"style="document"/>
 <input>
   <soap:body use="literal"/>
 </input>
 <output>
   <soap:body use="literal"/>
 </output></operation><operation name="GetWeatherByIP">
 <soap:operationsoapAction="http://www.serviceobjects.com/GetWeatherByIP"style="document"/>
 <input>
   <soap:body use="literal"/>
 </input>
 <output>
   <soap:body use="literal"/>
 </output></operation><operation name="GetWeatherHistoricalByZip">
 <soap:operationsoapAction="http://www.serviceobjects.com/GetWeatherHistoricalByZip"style="document"/>
 <input>
   <soap:body use="literal"/>
 </input>
 <output>
   <soap:body use="literal"/>
 </output></operation><operation name="GetWeatherByWMOID">
 <soap:operationsoapAction="http://www.serviceobjects.com/GetWeatherByWMOID"style="document"/>
 <input>
   <soap:body use="literal"/>
 </input>
 <output>
   <soap:body use="literal"/>
 </output></operation><operation name="GetWMOIDByCity">
 <soap:operationsoapAction="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/><ahref=′http://www.serviceobjects.com′target=′new′><imgsrc=′http://www.serviceobjects.com/images/so_logo_2_inside.gif′border=′0′/></a></documentation>
<port binding="s0:DOTSFastWeatherSoap"name="DOTSFastWeatherSoap">
  <soap:addresslocation="http://ws2.serviceobjects.net/fw/FastWeather.asmx"/>
</port>
<port binding="s0:DOTSFastWeatherHttpGet"name="DOTSFastWeatherHttpGet">
  <http:addresslocation="http://ws2.serviceobjects.net/fw/FastWeather.asmx"/>
</port>
<port binding="s0:DOTSFastWeatherHttpPost"name="DOTSFastWeatherHttpPost">
  <http:addresslocation="http://ws2.serviceobjects.net/fw/FastWeather.asmx"/>
</port></service></definitions>weather.xml
下面定义了可采纳应用程序105的jar文件(要提供给设备100)中要包括的示例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"vendor="Research In Motion"version="1.1.0"persistence="performant"messageDelivery="standard"><global name="gv_GetWeatherByZipResponse"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"type="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"array="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="GetWeatherByCityStateReault"type="data"component="Weather"array="false"/></data>- <data 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="GetWeatherHistoricalByZipReault"type="data"component="Weather"array="false"/></data>- <data name="GetWeatherByWMOID"persist="false"key=""><field name="WMOID"type="string"array="false"/><field name="LicanseKey"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="LicanseKey"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="MainScreen">- <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"transaction="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"title="inGetWeatherByZipSoapOut">- <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_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"><labelname="Windchill"inValue="Windchill"/><edit readOnly="false"type="text"mandatory="false"name="edit_data_Windchill"inValue="@Global.gv_GetWeatherByZipResponse.GetWeatherByZipResult.Windchill"/></region>- <region layout="vertical"><label name="HeatIndex"inValue="HeatIndex"/><edit readOnly="false"type="text"mandatory="false"name="edit_data_HeatIndex"inValue="@Global.gv_GetWeatherByZipResponse.GetWeatherByZipResult.HeatIndex"/></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 readOnly="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 readOnly="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 readOnly="false"type="text"mandatory="false"name="edit__data_Precipitation"inValue="@Global.gv_GetWeatherByZipResponse.GetWeatherByZipResult.Precipitation"/></region>- <region layout="vertical"><label name="Country"inValue="Country"/><edit readOnly="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></menu></screen>- <screen name="scr_Err"layout="vertical"dialog="true"title="Err">- <region layout="vertical"><label name="Desc"inValue="Desc"/><edit readOnly="false"type="text"mandatory="false"name="edit_data_Desc"inValue="@Global.gv_GetWeatherByZipResponse.GetWeatherByZipResult.Error.Desc"/></region>- <region layout="vertical"><label name="Number"inValue="Number"/><edit readOnly="false"type="text"mandatory="false"name="edit_data_Number"inValue="@Global.gv_GetWeatherByZipResponse.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.Location"/></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 readOnly="false"type="text"mandatory="false"name="edit_data_PostalCode"mapping="Global.gv_GetWeatherByZip.PostalCode"inValue="@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.gv_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">- <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_GetWeatherByCityStateResponse.GetWeatherByCityStateResult.LastUpdated"/></region>- <region layout="vertical"><label name="TemperatureF"inValue="TemperatureF"/><edit readOnly="false"type="text"mandatory="false"name="edit_data_TemperatureF"inValue="@Global.gv_GetWeatherByCityStateResponse.GetWeatherByCityStateResult.TemperatureF"/></region>- <region layout="vertical"><label name="Windchill"inValue="Windchill"/><edit readOnly="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 readOnly="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 readOnly="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 readOnly="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 readOnly="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 readOnly="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 readOnly="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 readOnly="false"type="text"mandatory="false"name="edit_data_Moonset"inValue="@Global.gv_GetWeatherByCityStateResponse.GetWeatherByCityStateResult.Moonset"/></region>- <region layout="vertical"><label name="Precipitation"inValue="Precipitation"/><edit readOnly="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="script_inGetWeatherByCityStateSoapOut_onClose"transaction="none"/></button></region>- <menu>- <item name="menu_inGetWeatherByCityStateSoapOut"inValue="Close"><onClick transition="script_inGetWeatherByCityStateSoapOut_onClosetransaction="none"/></item></menu></screen>- <screen name="scr_outGetWeatherByCityStateSoapIn"layout="vertical"dialog="false"title="outGetWeatherByCityStateSoapIn">- <region layout="vertical"><label name="City"inValue="City"/><edit readOnly="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 readOnly="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 readOnly="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"inValue="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="LastUpdated"/><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.GetWeatherByIPResult.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.GetWeatherByIPResult.HeatIndex"/></region>- <region layout="vertical"><label name="Humidity"inValue="Humidity"/><edit readOnly="false"type="text"mandatory="false"name="edit__data_Humidity"inValue="@Global.gv_GetWeatherByIPResponse.GetWeatherByIPResult.Humidity"/></region>- <region layout="vertical"><label name="Dewpoint"inValue="Dewpoint"/><edit readOnly="false"type="text"mandatory="false"name="edit_data_Dewpoint"inValue="@Global.gv_GetWeatherByIPResponse.GetWeatherByIPResult.Dewpoint"/></region>- <region layout="vertical"><label name="Wind"inValue="Wind"/><edit readOnly="false"type="text"mandatory="false"name="edit_data_Wind"inValue="@Global.gv_GetWeatherByIPResponse.GetWeatherByIPResult.Wind"/></region>- <region layout="vertical"><label name="Pressure"inValue="Pressure"/>  <edit readOnly="false"type="text"mandatory="false"name="edit_data_Pressure"inValue="@Global.gv_GetWeatherByIPResponse.GetWeatherByIPResult.Pressure"/></region>- <region layout="vertical"><label name="Conditions"inValue="Conditions"/><edit readOnly="false"type="text"mandatory="false"name="edit_data_Conditions"inValue="@Global.gv_GetWeatherByIPResponse.GetWeatherByIPResult.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.GetWeatherByIPResult.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.GetWeatherByIPResult.Sunrise"/></region>- <region layout="vertical"><label name="Sunset"inValue="Sunset"/><edit readOnly="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 readOnly="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 readOnly="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 readOnly="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"><onClick 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.GetWeatherHistoricalByZipResult.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.GetWeatherHistoricalByZipResult.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.GetWeatherHistoricalByZipResult.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.GetWeatherHistoricalByZipResult.HeatIndex"/></region>- <region layout="vertical"><label name="Humidity"inValue="Humidity"/><edit readOnly="false"type="text"mandatory="false"name="edit__data_Humidity"inValue="@Global.gv_GetWeatherHistoricalByZipResponse.GetWeatherHistoricalByZipResult.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.GetWeatherHistoricalByZipResult.Dewpoint"/></region>- <region layout="vertical"><label name="Wind"inValue="Wind"/><edit readOnly="false"type="text"mandatory="false"name="edit_data_Wind"inValue="@Global.gv_GetWeatherHistoricalByZipResponse.GetWeatherHistoricalByZipResult.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.GetWeatherHistoricalByZipResult.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.GetWeatherHistoricalByZipResult.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.GetWeatherHistoricalByZipResult.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.GetWeatherHistoricalByZipResult.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.GetWeatherHistoricalByZipResult.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.GetWeatherHistoricalByZipResult.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.GetWeatherHistoricalByZipResult.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.GetWeatherHistoricalByZipResult.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.GetWeatherHistoricalByZipResult.Moonset"/></region>- <region layout="vertical"><label name="Precipitation"inValue="Precipitation"/><edit readOnly="false"type="text"mandatory="false"name="edit_data_Precipitation"inValue="@Global.gv_GetWeatherHistoricalByZipResponse.GetWeatherHistoricalByZipResult.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.GetWeatherHistoricalByZipResult.Country"/></region>- <region layout="vertical">- <button name="Close"inValue="Close">  <onClicktransition="script_inGetWeatherHistoricalByZipSoapOut_onClose"transaction="none"/></button></region>- <menu>- <item name="menu_inGetWeatherHistoricalByZipSoapOut"inValue="Close"><onClicktransition="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 readOnly="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"><onClicktransition="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.LastUpdated"/></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.TemperatureF"/></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.HeatIndex"/></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.Conditions"/></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.Visibility"/></region>- <region layout="vertical"><label name="Sunrise"inValue="Sunrise"/><edit readOnly="false"type="text"mandatory="false"name="edit_data_Sunrise"inValue="@Global.gv_GetWeatherByWMOIDResponse.GetWeatherByWMOIDResult.Sunrise"/></region>- <region layout="vertical"><label name="Sunset"inValue="Sunset"/><edit readOnly="false"type="text"mandatory="false"name="edit_data_Sunset"inValue="@Global.gv_GetWeatherByWMOIDResponse.GetWeatherByWMOIDResult.Sunset"/></region>- <region layout="vertical"><label name="City"inValue="City"/><edit readOnly="false"type="text"mandatory="false"name="edit_data_City"inValue="@Global.gv_GetWeatherByWMOIDResponse.GetWeatherByWMOIDResult.City"/></region>- <region layout="vertical"><label name="State"inValue="State"/><edit readOnly="false"type="text"mandatory="false"name="edit_data_State"inValue="@Global.gv_GetWeatherByWMOIDResponse.GetWeatherByWMOIDResult.State"/></region>- <region layout="vertical"><label name="Moonrise"inValue="Moonrise"/><edit readOnly="false"type="text"mandatory="false"name="edit_data_Moonrise"inValue="@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.Precipitation"/></region>- <region layout="vertical"><label name="Country"inValue="Country"/><edit readOnly="false"type="text"mandatory="false"name="edit_data_Country"inValue="@Global.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>- <region 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"transaction="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.City"/></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.Region"/></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.WMOIDItem.Country"/></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.WMOID"/></region>- <region layout="vertical">- <button name="Close"inValue="Close"><onClick transition="script WMOID back"transaction="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
下面定义了应用程序105工作流脚本(例如,工作流组件406),在提供给设备100时,可以增强上面给出的XML定义300。functionscript_inGetWeatherByZipSoapOut_onClose(){scr_Main.display();}function script_Err_back(){Screen.back();}functioninGetWeatherByZipSoapOut_onMsgArrive(){scr_inGetWeatherByZipSoapOut.display();}functionscript_outGetWeatherByZipSoapIn_onSubmit(){outGetWeatherByZipSoapIn.parameters=Global.gv_GetWeatherByZip;outGetWeatherByZipSoapIn.send();scr_Main.display();}functionscript_inGetWeatherByCityStateSoapOut_onClose(){scr_Main.display();}functioninGetWeatherByCityStateSoapOut_onMsgArrive(){scr_inGetWeatherByCityStateSoapOut.display();}functionscript_outGetWeatherByCityStateSoapIn_onSubmit(){outGetWeatherByCityStateSoapIn.parameters=Global.gv_GetWeatherByCityState;outGetWeatherByCityStateSoapIn.send();scr_Main.display();}function script_inGetWeatherByIPSoapOut_onClose(){scr_Main.display();}functioninGetWeatherByIPSoapOut_onMsgArrive(){scr_inGetWeatherByIPSoapOut.display();}functionscript_outGetWeatherByIPSoapIn_onSubmit(){outGetWeatherByIPSoapIn.parameters=Global.gv_GetWeatherByIP;outGetWeatherByIPSoapIn.send();scr_Main.display();}functionscript_inGetWeatherHistoricalByZipSoapOut_onClose(){scr_Main.display();}functioninGetWeatherHistoricalByZipSoapOut_onMsgArrive(){scr_inGetWeatherHistoricalByZipSoapOut.display();}functionscript_outGetWeatherHistoricalByZipSoapIn_onSubmit(){outGetWeatherHistoricalByZipSoapIn.parameters=Global.gv_GetWeatherHistoricalByZip;outGetWeatherHistoricalByZipSoapIn.send();scr_Main.display();}functionscript_inGetWeatherByWMOIDSoapOut_onClose(){scr_Main.display();}functioninGetWeatherByWMOIDSoapOut_onMsgArrive(){scr_inGetWeatherByWMOIDSoapOut.display();}functionscript_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();}functioninGetWMOIDByCitySoapOut_onMsgArrive(){scr_inGetWMOIDByCitySoapOut.display();}functionscript_outGetWMOIDByCitySoapIn_onSubmit(){outGetWMOIDByCitySoapIn.parameters=Global.gv_GetWMOIDByCity;outGetWMOIDByCitySoapIn.send();scr_Main.display();}1 0.dtd(DTD(文档类型定义))
下面定义了应用程序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+)><!ATTLIST enumeration
name ID#REQUIRED><!ELEMENT value(#PCDATA)><!ELEMENT data(field*)><!--if key is not defined then the data is single instanced--><!--Phase 2.0:data will include readOnly(true|false)"false"--><!ATTLIST data
name ID#REQUIRED
prototype CDATA#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#IMPLIED
size CDATA#IMPLIED
bold(true|false)"false"
italic(true|false)"false"
underline(true|false)"false"
fgColor CDATA#IMPLIED
bgColor CDATA#IMPLIED
bgImage IDREF#IMPLIED><!ELEMENT screen(param*,var*,(%nestedCtrlElements;|repetition),menu?,onInit?)><!--no menu for dialog--><!--attr refreshMsg points to message--><!ATTLIST screen
name ID#REQUIRED
title CDATA#IMPLIED
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 onInit EMPTY><!ATTLIST onInit
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?,onInit?,onFocusOut?)><!ATTLIST edit
%commonCtrlAttrs;
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?,onInit?,onFocusout?)><!ATTLIST textarea
%commonCtrlAttrs;
mapping CDATA#IMPLIED
readOnly(true|false)"false"
mandatory(true|false)"false"
visibleRows CDATA#IMPLIED><!ELEMENT image(condition?,onInit?)><!ATTLIST image
%commonCtrlAttrs;
resource IDREF#IMPLIED><!--readOnly implies to selection change:if RO=true user cannot changeselection--><!ELEMENT singleChoice(condition?,onInit?,onChange?)><!ATTLIST singleChoice
%commonCtrlAttrs;
mapping CDATA#IMPLIED
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?,onInit?,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。

Claims (43)

1.一种用于协调应用程序开发的系统,其中应用程序包括具有以结构化定义语言表达的定义的第一组件和具有指令序列的第二组件,这些组件用于定义对设备与数据源之间通过网络传送的消息的设备运行时环境的处理,所述系统包括:
第一开发模式模块,被配置为与计算机用户接口所提供的开发环境交互,第一开发模式模块用于向用户接口的用户指导多个预定步骤,以通过经由用户接口的用户输入事件来协调应用程序组件的开发,第一开发模式模块被配置为基于以第一开发模式模块为中心的组件类型从多个模式中选择第一模式,用于从多个类型中进行选择的组件类型包括数据、消息、屏幕和工作流中至少一个;以及
第一模块,其与所选择的组件类型相对应,并且被配置为耦合到第一开发模式模块,所述第一模块用于通过与提供应用程序持久状态的开发环境的数据模型交互来开发至少一个组件的定义,利用通过用户接口传送到用户的多个预定步骤来协调第一模块的操作;
其中,所开发的组件实质上被组装为应用程序。
2.根据权利要求1所述的系统,还包括第二开发模式模块,被配置为与计算机用户接口所提供的开发环境交互,所述第二开发模式模块耦合到第一开发模式模块,从而第一开发模式模块与第二开发模式模块协作,第二开发模式模块用于向用户接口的用户指导多个预定步骤中的一部分,以通过经由用户接口的用户输入事件来协调应用程序组件的开发,第二开发模式模块被配置为基于以第二开发模式模块为中心的组件类型从多个模式中选择第二模式。
3.根据权利要求2所述的系统,其中第一模式是主模式,被配置为直接选择模块,或者通过与作为副模式的第二模式协作来间接选择模块。
4.根据权利要求2或3所述的系统,其中第二模式是副模式,被配置为将组件开发的协调返回给作为主模式的第一模式。
5.根据权利要求4所述的系统,其中主模式采用预定步骤,以帮助选择与所选择的组件类型相对应的第二模块,其中所选择的组件类型不同于第一模块的组件类型。
6.根据权利要求4或5所述的系统,其中副模式将组件开发的协调返回给与原始主模式不同的另一主模式。
7.根据权利要求1至6中任一项所述的系统,其中从如下各项中选择第一模式:用于基于可用后端数据源消息收发描述来生成合适的应用程序的模式;用于基于可用后端数据源消息收发描述来开发合适的应用程序从而所开发的整个应用程序包括数据组件和屏幕组件的模式;用于基于现有数据库模式开发应用程序105的模式;和/或用于开发对应用程序的特定业务域建模的数据组件标准集合的模式。
8.根据权利要求1至6中任一项所述的系统,其中从如下各项中选择第一模式:用于协调作为第一组件的屏幕组件的开发的屏幕模式;用于协调作为第一组件的消息组件的开发的消息模式;和/或用于协调作为第二组件的工作流组件的开发的脚本模式。
9.根据权利要求8所述的系统,其中作为第一组件的数据组件是通过应用从如下各项中选择的第一模式来开发的:屏幕模式和/或消息模式。
10.根据权利要求2至9中任一项所述的系统,其中从如下各项中选择第二模式:用于协调作为第一组件的屏幕组件的开发的屏幕模式;用于协调作为第一组件的消息组件的开发的消息模式;和/或用于协调作为第二组件的工作流组件的开发的脚本模式。
11.根据权利要求10所述的系统,其中作为第一组件的数据组件是通过应用从如下各项中选择的第二模式来开发的:屏幕模式和/或消息模式。
12.根据权利要求1至11中任一项所述的系统,其中模块还包括命令装置,被配置为访问并改变数据模型的状态。
13.根据权利要求12所述的系统,其中模块被配置为受到响应于命令装置、来自数据模型的事件通知的影响。
14.根据权利要求1至13中任一项所述的系统,其中从编辑器和/或查看器中选择模块。
15.根据权利要求14所述的系统,其中从如下各项中选择模块:屏幕模块;数据模块;消息模块;工作流模块;消息和数据关系模块;后端可视化器模块;本地化模块;脚本编辑器模块;测试模块;数据和屏幕关系模块;和/或导航模块。
16.根据权利要求2至15中任一项所述的系统,其中第二模式是生效器模式,用于确认代表应用程序消息的数据模型与消息收发操作的数据源呈现一致。
17.根据权利要求16所述的系统,其中生效器模式将模块的操作协调为具有从如下各项中选出的功能的生效器模块:工作流组件的工作流完整性;组件的参数和字段级映射的一致性;屏幕组件的屏幕控制映射的一致性;屏幕组件的屏幕刷新消息的一致性;确认消息组件中消息重复的存在;确认组件中数据重复的存在;和/或使代表数据源消息收发关系的数据模型生效。
18.根据权利要求1至17中任一项所述的系统,其中从如下各项中选择组件:用于定义应用程序所使用的数据实体的数据组件;用于定义显示在设备上的应用程序的外观和行为的屏幕组件;用于定义应用程序用来与数据源通信的消息的格式的消息组件;和/或用于定义在要执行动作时出现的应用程序处理的工作流组件。
19.根据权利要求1至18中任一项所述的系统,其中数据模型包含从如下各项中选择的模型成分:数据组件定义;全局变量定义;消息组件定义;资源定义;屏幕组件定义;脚本;风格定义;和/或数据源的映射描述符。
20.根据权利要求2至19中任一项所述的系统,还包括第三模式模块,用于指导开发者选择最适于当前应用程序开发活动的第一模式,从包括如下各项的组中选择第一模式:用于基于可用后端数据源消息收发描述来生成合适的应用程序的模式;用于基于可用后端数据源消息收发描述来开发合适的应用程序从而所开发的整个应用程序包括数据组件和屏幕组件的模式;用于基于现有数据库模式开发应用程序105的模式;和/或用于开发对应用程序的特定业务域建模的数据组件标准集合的模式。
21.一种用于协调应用程序开发的方法,其中应用程序包括具有以结构化定义语言表达的定义的第一组件和具有指令序列的第二组件,这些组件用于定义对设备与数据源之间通过网络传送的消息的设备运行时环境的处理,所述方法包括如下步骤:
选择第一开发模式模块,所述第一开发模式模块被配置为与计算机用户接口所提供的开发环境交互;
通过第一开发模式模块向用户接口的用户指导多个预定步骤,以通过经由用户接口的用户输入事件来协调应用程序组件的开发,第一开发模式模块被配置为基于以第一开发模式模块为中心的组件类型从多个模式中选择第一模式,用于从多个类型中进行选择的组件类型包括数据、消息、屏幕和工作流中至少一个;
选择与所选择的组件类型相对应并且配置为耦合到第一模式的第一模块;以及
利用第一模块通过与提供应用程序持久状态的开发环境的数据模型交互来开发至少一个组件的定义,利用通过用户接口传送到用户的多个预定步骤来协调第一模块的操作;
其中,所开发的组件实质上被组装为应用程序。
22.根据权利要求21所述的方法,其中第二开发模式模块被配置为与计算机用户接口所提供的开发环境交互,所述第二开发模式模块耦合到第一开发模式模块,从而第一开发模式模块与第二开发模式模块协作,第二开发模式模块用于向用户接口的用户指导多个预定步骤中的一部分,以通过经由用户接口的用户输入事件来协调应用程序组件的开发,第二开发模式模块被配置为基于以第二开发模式模块为中心的组件类型从多个模式中选择第二模式。
23.根据权利要求22所述的方法,还包括如下步骤:通过被配置为主模式的第一模式直接选择模块,或者通过与作为副模式的第二模式协作来间接选择模块。
24.根据权利要求22或23所述的方法,还包括如下步骤:由作为副模式的第二模式将组件开发的协调返回给作为主模式的第二模式。
25.根据权利要求24所述的方法,其中主模式采用预定步骤,以帮助选择与所选择的组件类型相对应的第二模块,其中所选择的组件类型不同于第一模块的组件类型。
26.根据权利要求24或25所述的方法,其中副模式将组件开发的协调返回给与原始主模式不同的另一主模式。
27.根据权利要求21至26中任一项所述的方法,其中从如下各项中选择第一模式:用于基于可用后端数据源消息收发描述来生成合适的应用程序的模式;用于基于可用后端数据源消息收发描述来开发合适的应用程序从而所开发的整个应用程序包括数据组件和屏幕组件的模式;用于基于现有数据库模式开发应用程序105的模式;和/或用于开发对应用程序的特定业务域建模的数据组件标准集合的模式。
28.根据权利要求21至27中任一项所述的方法,其中从如下各项中选择第一模式:用于协调作为第一组件的屏幕组件的开发的屏幕模式;用于协调作为第一组件的消息组件的开发的消息模式;和/或用于协调作为第二组件的工作流组件的开发的脚本模式。
29.根据权利要求28所述的方法,其中作为第一组件的数据组件是通过应用从如下各项中选择的第一模式来开发的:屏幕模式和/或消息模式。
30.根据权利要求22至29中任一项所述的方法,其中从如下各项中选择第二模式:用于协调作为第一组件的屏幕组件的开发的屏幕模式;用于协调作为第一组件的消息组件的开发的消息模式;和/或用于协调作为第二组件的工作流组件的开发的脚本模式。
31.根据权利要求30所述的方法,其中作为第一组件的数据组件是通过应用从如下各项中选择的第二模式来开发的:屏幕模式和/或消息模式。
32.根据权利要求21至30中任一项所述的方法,还包括如下步骤:由模块生成命令,用于访问并改变数据模型的状态。
33.根据权利要求32所述的方法,还包括如下步骤:由响应于命令来自数据模型的事件通知影响模块。
34.根据权利要求21至33中任一项所述的方法,其中从编辑器和/或查看器中选择模块。
35.根据权利要求34所述的方法,其中从如下各项中选择模块:屏幕模块;数据模块;消息模块;工作流模块;消息和数据关系模块;后端可视化器模块;本地化模块;脚本编辑器模块;测试模块;数据和屏幕关系模块;和/或导航模块。
36.根据权利要求22至35中任一项所述的方法,其中第二模式是生效器模式,用于确认代表应用程序消息的数据模型与消息收发操作的数据源呈现一致。
37.根据权利要求36所述的方法,其中生效器模式将模块的操作协调为具有从如下各项中选出的功能的生效器模块:工作流组件的工作流完整性;组件的参数和字段级映射的一致性;屏幕组件的屏幕控制映射的一致性;屏幕组件的屏幕刷新消息的一致性;确认消息组件中消息重复的存在;确认组件中数据重复的存在;和/或使代表数据源消息收发关系的数据模型生效。
38.根据权利要求21至37中任一项所述的方法,其中从如下各项中选择组件:用于定义应用程序所使用的数据实体的数据组件;用于定义显示在设备上的应用程序的外观和行为的屏幕组件;用于定义应用程序用来与数据源通信的消息的格式的消息组件;和/或用于定义在要执行动作时出现的应用程序处理的工作流组件。
39.根据权利要求21至38中任一项所述的方法,其中数据模型包含从如下各项中选择的模型成分:数据组件定义;全局变量定义;消息组件定义;资源定义;屏幕组件定义;脚本;风格定义;和/或数据源的映射描述符。
40.根据权利要求22至39中任一项所述的方法,还包括如下步骤:由第三模式指导开发者选择最适于当前应用程序开发活动的第一模式,从如下各项中选择第一模式:用于基于可用后端数据源消息收发描述来生成合适的应用程序的模式;用于基于可用后端数据源消息收发描述来开发合适的应用程序从而所开发的整个应用程序包括数据组件和屏幕组件的模式;用于基于现有数据库模式开发应用程序105的模式;和/或用于开发对应用程序的特定业务域建模的数据组件标准集合的模式。
41.一种用于协调应用程序开发的计算机程序产品,其中应用程序包括具有以结构化定义语言表达的定义的第一组件和具有指令序列的第二组件,这些组件用于定义对设备与数据源之间通过网络传送的消息的设备运行时环境的处理,所述计算机程序产品包括:
计算机可读介质,包括可在根据权利要求1至20中任一项所述的系统上执行的程序代码装置,用于实现根据权利要求21至40中任一项所述的方法。
42.一种移动通信设备,包括根据权利要求1至20中任一项所述的系统。
43.一种通信网络系统,包括至少一个根据权利要求42所述的移动通信设备。
CNB2006100678316A 2005-03-14 2006-03-14 用于将开发模式应用于基于组件的应用程序的系统和方法 Active CN100429620C (zh)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
EP05101958.6 2005-03-14
EP05101958A EP1703379A1 (en) 2005-03-14 2005-03-14 System and method for applying development patterns for component based applications

Publications (2)

Publication Number Publication Date
CN1834908A true CN1834908A (zh) 2006-09-20
CN100429620C CN100429620C (zh) 2008-10-29

Family

ID=34938967

Family Applications (1)

Application Number Title Priority Date Filing Date
CNB2006100678316A Active CN100429620C (zh) 2005-03-14 2006-03-14 用于将开发模式应用于基于组件的应用程序的系统和方法

Country Status (4)

Country Link
EP (1) EP1703379A1 (zh)
CN (1) CN100429620C (zh)
CA (1) CA2539130C (zh)
SG (2) SG146613A1 (zh)

Cited By (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101414260B (zh) * 2007-06-15 2012-05-23 捷讯研究有限公司 用于创建多模式应用的系统和方法
CN106230889A (zh) * 2016-07-15 2016-12-14 福建天泉教育科技有限公司 移动应用业务组件资源管理方法及系统
US9934002B2 (en) 2013-10-30 2018-04-03 Entit Software Llc Technology recommendation for software environment
CN109739654A (zh) * 2018-08-10 2019-05-10 比亚迪股份有限公司 消息中间件及消息传输方法
CN111158312A (zh) * 2018-11-07 2020-05-15 西门子股份公司 用于运行生产机器或机床的方法和生产机器或机床
CN111158645A (zh) * 2019-12-10 2020-05-15 杭州中天微系统有限公司 提供集成开发环境的系统和方法
CN112506497A (zh) * 2020-11-30 2021-03-16 北京九章云极科技有限公司 一种数据处理方法和数据处理系统
CN112631643A (zh) * 2019-10-08 2021-04-09 华晨宝马汽车有限公司 综合运维管理方法、系统、设备和介质
CN112988124A (zh) * 2021-05-10 2021-06-18 湖南高至科技有限公司 多视图平台无关模型系统
CN113452511A (zh) * 2020-03-24 2021-09-28 国科量子通信网络有限公司 一种基于sdn的量子密钥分发物联网的发布订阅系统及方法
CN114327466A (zh) * 2022-01-30 2022-04-12 重庆长安汽车股份有限公司 一种车载app模块间消息解耦的实现方法及系统
CN114610725A (zh) * 2022-05-11 2022-06-10 成都九洲电子信息系统股份有限公司 一种数据中心组件及其应用方法、存储介质
CN115423037A (zh) * 2022-09-27 2022-12-02 马萃 一种基于大数据的用户分类方法及系统
CN114327466B (zh) * 2022-01-30 2024-05-17 重庆长安汽车股份有限公司 一种车载app模块间消息解耦的实现方法及系统

Families Citing this family (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101894018A (zh) * 2010-05-31 2010-11-24 浪潮(北京)电子信息产业有限公司 一种维护控件状态信息的方法及装置
JP6876232B2 (ja) * 2016-09-26 2021-05-26 富士フイルムビジネスイノベーション株式会社 画像形成装置及びプログラム
CN111045653B (zh) * 2019-12-16 2022-01-07 京东科技控股股份有限公司 系统生成方法、装置、计算机可读介质及电子设备
US11315058B2 (en) * 2020-06-28 2022-04-26 Atlassian Pty Ltd. Issue tracking systems and methods
CN112612554B (zh) * 2021-01-20 2023-12-19 广东金赋科技股份有限公司 一种利用适配服务分析器来统一管理操控硬件模块的方法
CN115904601B (zh) * 2023-01-09 2023-05-19 中智关爱通(南京)信息科技有限公司 用于生成因用户而异的应用首页的方法、设备和介质
CN115774573B (zh) * 2023-02-10 2023-06-30 美云智数科技有限公司 应用集成方法、装置、电子设备和存储介质

Family Cites Families (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1172990A (zh) * 1996-08-02 1998-02-11 讯光科技系统有限公司 执行导向式软件制作方法
US6101556A (en) * 1997-01-07 2000-08-08 New Era Of Networks, Inc. Method for content-based dynamic formatting for interoperation of computing and EDI systems
US6778992B1 (en) * 1999-12-21 2004-08-17 Lockstream Corporation Flexible and hierarchical user interfaces defined using a data definition language
US20020026474A1 (en) * 2000-08-28 2002-02-28 Wang Lawrence C. Thin client for wireless device using java interface
US8042132B2 (en) * 2002-03-15 2011-10-18 Tvworks, Llc System and method for construction, delivery and display of iTV content
US7555538B2 (en) * 2002-12-26 2009-06-30 Research In Motion Limited System and method for building and execution of platform-neutral generic services' client applications

Cited By (20)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101414260B (zh) * 2007-06-15 2012-05-23 捷讯研究有限公司 用于创建多模式应用的系统和方法
US9934002B2 (en) 2013-10-30 2018-04-03 Entit Software Llc Technology recommendation for software environment
CN106230889A (zh) * 2016-07-15 2016-12-14 福建天泉教育科技有限公司 移动应用业务组件资源管理方法及系统
CN109739654B (zh) * 2018-08-10 2022-09-09 比亚迪股份有限公司 消息中间件及消息传输方法
CN109739654A (zh) * 2018-08-10 2019-05-10 比亚迪股份有限公司 消息中间件及消息传输方法
CN111158312A (zh) * 2018-11-07 2020-05-15 西门子股份公司 用于运行生产机器或机床的方法和生产机器或机床
CN111158312B (zh) * 2018-11-07 2023-06-16 西门子股份公司 用于运行生产机器或机床的方法和生产机器或机床
CN112631643A (zh) * 2019-10-08 2021-04-09 华晨宝马汽车有限公司 综合运维管理方法、系统、设备和介质
CN111158645B (zh) * 2019-12-10 2022-09-20 杭州中天微系统有限公司 提供集成开发环境的系统和方法
CN111158645A (zh) * 2019-12-10 2020-05-15 杭州中天微系统有限公司 提供集成开发环境的系统和方法
CN113452511A (zh) * 2020-03-24 2021-09-28 国科量子通信网络有限公司 一种基于sdn的量子密钥分发物联网的发布订阅系统及方法
CN112506497A (zh) * 2020-11-30 2021-03-16 北京九章云极科技有限公司 一种数据处理方法和数据处理系统
CN112988124B (zh) * 2021-05-10 2021-07-30 湖南高至科技有限公司 多视图平台无关模型系统
CN112988124A (zh) * 2021-05-10 2021-06-18 湖南高至科技有限公司 多视图平台无关模型系统
CN114327466A (zh) * 2022-01-30 2022-04-12 重庆长安汽车股份有限公司 一种车载app模块间消息解耦的实现方法及系统
CN114327466B (zh) * 2022-01-30 2024-05-17 重庆长安汽车股份有限公司 一种车载app模块间消息解耦的实现方法及系统
CN114610725A (zh) * 2022-05-11 2022-06-10 成都九洲电子信息系统股份有限公司 一种数据中心组件及其应用方法、存储介质
CN114610725B (zh) * 2022-05-11 2022-08-16 成都九洲电子信息系统股份有限公司 一种计算机设备及其应用方法、存储介质
CN115423037A (zh) * 2022-09-27 2022-12-02 马萃 一种基于大数据的用户分类方法及系统
CN115423037B (zh) * 2022-09-27 2023-10-13 湖北华中电力科技开发有限责任公司 一种基于大数据的用户分类方法及系统

Also Published As

Publication number Publication date
SG126058A1 (en) 2006-10-30
CA2539130A1 (en) 2006-09-14
CN100429620C (zh) 2008-10-29
CA2539130C (en) 2012-09-11
SG146613A1 (en) 2008-10-30
EP1703379A1 (en) 2006-09-20

Similar Documents

Publication Publication Date Title
CN1834908A (zh) 用于将开发模式应用于基于组件的应用程序的系统和方法
CN1182467C (zh) 可扩充的分布企业应用集成系统
CN1304981C (zh) 用于基于规则的万维网方案与活动的系统与方法
CN1609795A (zh) 用于计算机平台的编程接口
CN1163837C (zh) 网络访问管理系统和方法
CN1745364A (zh) 用于扩展应用程序首选项类的系统和方法
CN1609793A (zh) 用于计算机平台的编程接口
CN1828527A (zh) 用于跨不同应用程序框架的数据服务的平台
CN1669018A (zh) 手持终端框架系统
CN1609792A (zh) 计算机程序的编程接口
CN1661554A (zh) 用于构建无线应用程序的系统和方法
CN1755721A (zh) 组件化和可扩展的工作流模型
CN1639709A (zh) 服务器、信息提供方法和程序
CN1551006A (zh) 分布式计算系统架构及分布式应用的设计、部署和管理
CN1598768A (zh) 信息处理装置及其控制方法
CN100342691C (zh) 多模式对话处理方法
CN101052948A (zh) 对象过程图应用程序开发系统
CN101052936A (zh) 用于在标记语言环境中将事件指派给动作的文档处理和管理方法
CN1672158A (zh) 使用多个传递媒体的成批通信过程
CN1961304A (zh) 交错文档的部件的方法和装置
CN1781089A (zh) 构建包含预编页码文档的包的方法和系统
CN1679026A (zh) Web服务设备和方法
CN1321275A (zh) 与源代码控制系统交互的方法和设备
CN1791853A (zh) 个人化文件夹
CN101040250A (zh) 数据处理装置和数据处理方法

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant