專利名稱:用于將開(kāi)發(fā)模式應(yīng)用于基于組件的應(yīng)用程序的系統(tǒng)和方法
技術(shù)領(lǐng)域:
本申請(qǐng)大體上涉及基于組件的應(yīng)用程序(component basedapplication)的開(kāi)發(fā)及其在網(wǎng)絡(luò)上的可用性。
背景技術(shù):
現(xiàn)在使用的無(wú)線設(shè)備的數(shù)量連續(xù)增長(zhǎng),如智能電話、具有無(wú)線通信能力的個(gè)人數(shù)字助理(PDA)、個(gè)人計(jì)算機(jī)、自助信息亭和雙向?qū)ず魴C(jī)/通信設(shè)備等。例如,智能電話可以包括針對(duì)城市范圍檢索天氣預(yù)報(bào)的應(yīng)用程序,或PDA可以包括使用戶能夠購(gòu)買(mǎi)雜貨的應(yīng)用程序。這些軟件應(yīng)用程序的優(yōu)點(diǎn)在于與網(wǎng)絡(luò)之間的連接性,以便向用戶提供及時(shí)、有用的服務(wù)。然而,由于一些設(shè)備的受限資源以及將大量數(shù)據(jù)傳送到設(shè)備的復(fù)雜性,開(kāi)發(fā)和維護(hù)針對(duì)多種設(shè)備定制的軟件應(yīng)用程序仍然是困難且耗時(shí)的任務(wù)。
當(dāng)前,移動(dòng)通信設(shè)備被配置成用于通過(guò)基于因特網(wǎng)的瀏覽器和/或本機(jī)應(yīng)用程序與網(wǎng)絡(luò)服務(wù)進(jìn)行通信。瀏覽器具有能夠針對(duì)各種不同設(shè)備在交叉平臺(tái)基礎(chǔ)上進(jìn)行操作的優(yōu)點(diǎn),但其缺點(diǎn)在于請(qǐng)求來(lái)自網(wǎng)絡(luò)服務(wù)的頁(yè)面(HTML格式的屏幕定義),這阻礙了包含在屏幕上的數(shù)據(jù)的持續(xù)性。瀏覽器的另一個(gè)缺點(diǎn)在于在運(yùn)行時(shí)繪制(render)屏幕,這是資源密集的。本機(jī)應(yīng)用程序(native application)的優(yōu)點(diǎn)在于專門(mén)針對(duì)移動(dòng)設(shè)備的類型而開(kāi)發(fā),從而提供了針對(duì)每個(gè)運(yùn)行時(shí)環(huán)境的相對(duì)優(yōu)化的應(yīng)用程序。但是,本機(jī)應(yīng)用程序的缺點(diǎn)在于不是平臺(tái)無(wú)關(guān)的,因而需要開(kāi)發(fā)相同應(yīng)用程序的多個(gè)版本,并且相對(duì)較大,因而給移動(dòng)設(shè)備的資金資源造成嚴(yán)重的負(fù)擔(dān)。此外,應(yīng)用程序開(kāi)發(fā)者需要精通如Java和C++等編程語(yǔ)言,以構(gòu)建這些硬編碼的本機(jī)應(yīng)用程序。需要能夠在開(kāi)發(fā)針對(duì)具有其各自運(yùn)行時(shí)環(huán)境(runtime envionment)的選定設(shè)備和終端的應(yīng)用程序中起到幫助、并且能夠有助于從多種后端數(shù)據(jù)源中進(jìn)行選擇的應(yīng)用程序開(kāi)發(fā)環(huán)境。
這里公開(kāi)的系統(tǒng)和方法提供了一種基于組件的應(yīng)用程序開(kāi)發(fā)環(huán)境,以便緩解或減輕至少部分上述缺點(diǎn)。
發(fā)明內(nèi)容
現(xiàn)有軟件應(yīng)用程序的優(yōu)點(diǎn)在于與網(wǎng)絡(luò)之間的連接性,以便向用戶提供及時(shí)、有用的服務(wù)。然而,由于一些設(shè)備的受限資源以及將大量數(shù)據(jù)傳送到設(shè)備的復(fù)雜性,開(kāi)發(fā)和維護(hù)針對(duì)多種設(shè)備定制的軟件應(yīng)用程序仍然是困難且耗時(shí)的任務(wù)?,F(xiàn)有應(yīng)用程序生成環(huán)境并非基于組件應(yīng)用程序體系結(jié)構(gòu),組件應(yīng)用程序體系結(jié)構(gòu)有助于生成運(yùn)行在具有多種運(yùn)行時(shí)環(huán)境的客戶端上的應(yīng)用程序。本機(jī)應(yīng)用程序是現(xiàn)有應(yīng)用程序的一個(gè)示例,現(xiàn)有應(yīng)用程序具有以下缺點(diǎn)非平臺(tái)獨(dú)立,從而需要開(kāi)發(fā)并生成相同應(yīng)用程序的多種版本,以及相對(duì)較大,從而給移動(dòng)設(shè)備的資金資源造成嚴(yán)重的負(fù)擔(dān)。
與現(xiàn)有應(yīng)用程序生成環(huán)境相反,提供了一種用于協(xié)調(diào)應(yīng)用程序開(kāi)發(fā)的系統(tǒng)和方法,其中應(yīng)用程序包括具有以結(jié)構(gòu)化定義語(yǔ)言表達(dá)的定義的第一組件和具有指令序列的第二組件。這些組件定義了在設(shè)備與數(shù)據(jù)源之間通過(guò)網(wǎng)絡(luò)傳送的消息的設(shè)備運(yùn)行時(shí)環(huán)境上的處理。系統(tǒng)和方法包括第一開(kāi)發(fā)模式,被配置為與計(jì)算機(jī)用戶接口所提供的開(kāi)發(fā)環(huán)境交互,第一模式用于向用戶接口的用戶指導(dǎo)多個(gè)預(yù)定步驟,以通過(guò)經(jīng)由用戶接口的用戶輸入事件來(lái)協(xié)調(diào)應(yīng)用程序組件的開(kāi)發(fā)。第一模式被配置為基于以第一開(kāi)發(fā)模式為中心的組件類型從多個(gè)類型中選擇組建類型,用于從多個(gè)類型中進(jìn)行選擇的組件類型包括數(shù)據(jù)、消息、屏幕和工作流中至少一個(gè)。系統(tǒng)和方法還包括第一模塊,其與所選擇的組件類型相對(duì)應(yīng),并且被配置為耦合到第一模式。第一模塊用于通過(guò)與提供應(yīng)用程序持久狀態(tài)的開(kāi)發(fā)環(huán)境的數(shù)據(jù)模型交互來(lái)開(kāi)發(fā)至少一個(gè)組件的定義。利用通過(guò)用戶接口傳送到用戶的多個(gè)預(yù)定步驟來(lái)協(xié)調(diào)第一模塊的操作;其中,所開(kāi)發(fā)的組件實(shí)質(zhì)上被組裝為應(yīng)用程序。
因此,提供了一種用于協(xié)調(diào)應(yīng)用程序開(kāi)發(fā)的系統(tǒng),其中應(yīng)用程序包括具有以結(jié)構(gòu)化定義語(yǔ)言表達(dá)的定義的第一組件和具有指令序列的第二組件,這些組件用于定義在設(shè)備與數(shù)據(jù)源之間通過(guò)網(wǎng)絡(luò)傳送的消息的設(shè)備運(yùn)行時(shí)環(huán)境上的處理,所述系統(tǒng)包括第一開(kāi)發(fā)模式模塊,被配置為與計(jì)算機(jī)用戶接口所提供的開(kāi)發(fā)環(huán)境交互,第一模式用于向用戶接口的用戶指導(dǎo)多個(gè)預(yù)定步驟,以通過(guò)經(jīng)由用戶接口的用戶輸入事件來(lái)協(xié)調(diào)應(yīng)用程序組件的開(kāi)發(fā),第一模式被配置為基于以第一開(kāi)發(fā)模式為中心的組件類型從多個(gè)模式中選擇,用于從多個(gè)類型中進(jìn)行選擇的組件類型包括數(shù)據(jù)、消息、屏幕和工作流中至少一個(gè);以及第一模塊,其與所選擇的組件類型相對(duì)應(yīng),并且被配置為耦合到第一模式,第一模塊用于通過(guò)與提供應(yīng)用程序持久狀態(tài)的開(kāi)發(fā)環(huán)境的數(shù)據(jù)模型交互來(lái)開(kāi)發(fā)至少一個(gè)組件的定義,利用通過(guò)用戶接口傳送到用戶的多個(gè)預(yù)定步驟來(lái)協(xié)調(diào)第一模塊的操作;其中,所開(kāi)發(fā)的組件實(shí)質(zhì)上被組裝為應(yīng)用程序。
也公開(kāi)了一種用于協(xié)調(diào)應(yīng)用程序開(kāi)發(fā)的方法,其中應(yīng)用程序包括具有以結(jié)構(gòu)化定義語(yǔ)言表達(dá)的定義的第一組件和具有指令序列的第二組件,這些組件用于定義在設(shè)備與數(shù)據(jù)源之間通過(guò)網(wǎng)絡(luò)傳送的消息的設(shè)備運(yùn)行時(shí)環(huán)境上的處理,所述方法包括如下步驟選擇第一開(kāi)發(fā)模式模塊,第一模式模塊被配置為與計(jì)算機(jī)用戶接口所提供的開(kāi)發(fā)環(huán)境交互;通過(guò)第一模式向用戶接口的用戶指導(dǎo)多個(gè)預(yù)定步驟,以通過(guò)經(jīng)由用戶接口的用戶輸入事件來(lái)協(xié)調(diào)應(yīng)用程序組件的開(kāi)發(fā),第一模式模塊被配置為基于以第一開(kāi)發(fā)模式為中心的組件類型從多個(gè)模式中選擇,用于從多個(gè)類型中進(jìn)行選擇的組件類型包括數(shù)據(jù)、消息、屏幕和工作流中至少一個(gè);選擇與所選擇的組件類型相對(duì)應(yīng)并且配置為耦合到第一模式的第一模塊;以及利用第一模塊通過(guò)與提供應(yīng)用程序持久狀態(tài)的開(kāi)發(fā)環(huán)境的數(shù)據(jù)模型交互來(lái)開(kāi)發(fā)至少一個(gè)組件的定義,利用通過(guò)用戶接口傳送到用戶的多個(gè)預(yù)定步驟來(lái)協(xié)調(diào)第一模塊的操作;其中,所開(kāi)發(fā)的組件實(shí)質(zhì)上被組裝為應(yīng)用程序。
也公開(kāi)了一種用于協(xié)調(diào)應(yīng)用程序開(kāi)發(fā)的計(jì)算機(jī)程序產(chǎn)品,其中應(yīng)用程序包括具有以結(jié)構(gòu)化定義語(yǔ)言表達(dá)的定義的第一組件和具有指令序列的第二組件,這些組件用于定義在設(shè)備與數(shù)據(jù)源之間通過(guò)網(wǎng)絡(luò)傳送的消息的設(shè)備運(yùn)行時(shí)環(huán)境上的處理,計(jì)算機(jī)程序產(chǎn)品包括計(jì)算機(jī)可讀介質(zhì);存儲(chǔ)在計(jì)算機(jī)可讀介質(zhì)上的第一開(kāi)發(fā)模式模塊,被配置為與計(jì)算機(jī)用戶接口所提供的開(kāi)發(fā)環(huán)境交互,第一模式用于向用戶接口的用戶指導(dǎo)多個(gè)預(yù)定步驟,以通過(guò)經(jīng)由用戶接口的用戶輸入事件來(lái)協(xié)調(diào)應(yīng)用程序組件的開(kāi)發(fā),第一模式被配置為基于以第一開(kāi)發(fā)模式為中心的組件類型從多個(gè)模式中選擇,用于從多個(gè)類型中進(jìn)行選擇的組件類型包括數(shù)據(jù)、消息、屏幕和工作流中至少一個(gè);以及存儲(chǔ)在計(jì)算機(jī)可讀介質(zhì)上的第一模塊,其與所選擇的組件類型相對(duì)應(yīng),并且被配置為耦合到第一模式,第一模塊用于通過(guò)與提供應(yīng)用程序持久狀態(tài)的開(kāi)發(fā)環(huán)境的數(shù)據(jù)模型交互來(lái)開(kāi)發(fā)至少一個(gè)組件的定義,利用通過(guò)用戶接口傳送到用戶的多個(gè)預(yù)定步驟來(lái)協(xié)調(diào)第一模塊的操作;其中,所開(kāi)發(fā)的組件實(shí)質(zhì)上被組裝為應(yīng)用程序。
通過(guò)下面對(duì)照附圖進(jìn)行的詳細(xì)說(shuō)明,這些和其它特點(diǎn)將變得更加清楚,在附圖中圖1是通信網(wǎng)絡(luò)系統(tǒng)的方框圖;圖2是用于開(kāi)發(fā)和生成如圖1所示的應(yīng)用程序的工具的方框圖;圖3是圖1所示的組件應(yīng)用程序包的方框圖;圖4是示出了圖3所示的應(yīng)用程序的示例組件的方框圖;圖5是示出了圖3所示的樣本組件應(yīng)用程序的示例屏幕和工作流;圖6是圖2所示的工具體系結(jié)構(gòu)的方框圖;圖7示出了圖6的工具的編輯器;圖8示出了圖6的工具的查看器;圖9示出了使用圖6的工具的應(yīng)用程序生效方法;圖10示出了使用圖6的工具的應(yīng)用程序生成方法;圖11示出了使用圖10的應(yīng)用程序構(gòu)建可展開(kāi)應(yīng)用程序(deployable application)的方法;圖12示出了展開(kāi)圖11的應(yīng)用程序的方法;
圖13示出了圖6的工具的向?qū)В粓D14示出了圖13的向?qū)J降氖纠僮?;圖15是圖14的操作的另一實(shí)施例;圖16是圖13的模式的示例屏幕;圖17是圖16的屏幕的另一實(shí)施例;以及圖18是圖16的屏幕的另一實(shí)施例。
具體實(shí)施例方式
網(wǎng)絡(luò)系統(tǒng)參考圖1,網(wǎng)絡(luò)系統(tǒng)10包括移動(dòng)通信設(shè)備100,用于通過(guò)與應(yīng)用程序網(wǎng)關(guān)AG相連的無(wú)線網(wǎng)絡(luò)102與一個(gè)或多個(gè)后端數(shù)據(jù)源106(如基于圖解的服務(wù),如網(wǎng)絡(luò)服務(wù)等,或用于提供由應(yīng)用程序105使用的企業(yè)服務(wù)的數(shù)據(jù)庫(kù))進(jìn)行交互。設(shè)備100是諸如但不局限于以下設(shè)備移動(dòng)電話、PDA、雙向?qū)ず魴C(jī)、雙模式通信設(shè)備。網(wǎng)絡(luò)10也可以具有通過(guò)局域網(wǎng)119相連的桌面計(jì)算機(jī)117。此后,為了簡(jiǎn)單起見(jiàn),將網(wǎng)絡(luò)10的設(shè)備100和桌面計(jì)算機(jī)117稱為設(shè)備100。如本領(lǐng)域所知,應(yīng)用程序網(wǎng)關(guān)AG和數(shù)據(jù)源106可以通過(guò)外聯(lián)網(wǎng)(如因特網(wǎng))和/或內(nèi)聯(lián)網(wǎng)相連。應(yīng)用程序網(wǎng)關(guān)AG處理由應(yīng)用程序105發(fā)起的請(qǐng)求/響應(yīng)消息以及從數(shù)據(jù)源106推送到設(shè)備100的訂閱通知。應(yīng)用程序網(wǎng)關(guān)AG可以用作數(shù)據(jù)映射服務(wù)器,用于在設(shè)備100上的客戶端運(yùn)行時(shí)環(huán)境RE與數(shù)據(jù)源106的后端服務(wù)器之間傳遞消息。運(yùn)行時(shí)環(huán)境RE是執(zhí)行應(yīng)用程序105組件并提供執(zhí)行應(yīng)用程序105所需的公共服務(wù)的智能容器。網(wǎng)關(guān)AG可以提供針對(duì)應(yīng)用程序105的異步消息收發(fā),并且可以集成遺留(legacy)后端數(shù)據(jù)源106,并與遺留后端數(shù)據(jù)源106進(jìn)行通信。設(shè)備100在與數(shù)據(jù)源106進(jìn)行通信時(shí),發(fā)送和接收無(wú)線組件應(yīng)用程序技術(shù)或無(wú)線組件應(yīng)用程序105(如稍后進(jìn)一步描述的那樣),以及發(fā)送/接收與應(yīng)用程序105的操作相關(guān)聯(lián)的消息收發(fā)。在將應(yīng)用程序105提供給設(shè)備100的對(duì)應(yīng)運(yùn)行時(shí)環(huán)境RE時(shí),設(shè)備100可以通過(guò)執(zhí)行應(yīng)用程序105進(jìn)行操作,作為數(shù)據(jù)源106的網(wǎng)絡(luò)客戶端。
為了滿足與應(yīng)用程序105相關(guān)聯(lián)的適當(dāng)消息收發(fā),應(yīng)用程序網(wǎng)關(guān)AG通過(guò)多種協(xié)議(諸如但不局限于HTTP、SQL和組件API)與數(shù)據(jù)源106進(jìn)行通信,以便在將應(yīng)用程序105提供給設(shè)備100時(shí),將相關(guān)的商業(yè)邏輯(方法)披露給應(yīng)用程序105。應(yīng)用程序105可以類似于調(diào)用與對(duì)象(或功能)有關(guān)的方法地使用數(shù)據(jù)源106的商業(yè)邏輯。應(yīng)當(dāng)意識(shí)到,可以通過(guò)網(wǎng)絡(luò)102和應(yīng)用程序網(wǎng)關(guān)AG,與數(shù)據(jù)源106相關(guān)地將應(yīng)用程序105直接下載/上載到設(shè)備100。例如,應(yīng)用程序網(wǎng)關(guān)AG與供應(yīng)服務(wù)器108和發(fā)現(xiàn)服務(wù)器110相連,用于提供用于優(yōu)化空中提供應(yīng)用程序105的機(jī)制,包括從設(shè)備100進(jìn)行應(yīng)用程序105發(fā)現(xiàn)的能力,如UDDI(例如)注冊(cè)表(registry)112中所列出的那樣。注冊(cè)表112可以是由服務(wù)器110實(shí)現(xiàn)的發(fā)現(xiàn)服務(wù)的一部分,注冊(cè)表112用于公布應(yīng)用程序105。注冊(cè)表112中的應(yīng)用程序105信息可以包含但不局限于展開(kāi)描述符DD(包含如應(yīng)用程序105名稱、版本和描述等信息)以及此應(yīng)用程序105在應(yīng)用程序倉(cāng)庫(kù)114中的位置。
再次參考圖1,為了初始化運(yùn)行時(shí)環(huán)境RE,RE接收MDS 115服務(wù)本(service book)中的網(wǎng)關(guān)AG URL和網(wǎng)關(guān)AG公用密鑰。運(yùn)行時(shí)環(huán)境RE使用這些信息與網(wǎng)關(guān)AG相連,以便進(jìn)行初始握手。根據(jù)域,設(shè)備100供應(yīng)或BES 116將MDS 115服務(wù)本推入設(shè)備100。應(yīng)當(dāng)意識(shí)到,根據(jù)需要,在網(wǎng)絡(luò)10中可以存在多于一個(gè)網(wǎng)關(guān)AG。一旦初始化,設(shè)備100對(duì)應(yīng)用程序105的訪問(wèn)(下載/上載)可以通過(guò)網(wǎng)關(guān)AG直接從應(yīng)用程序倉(cāng)庫(kù)114進(jìn)行通信,和/或與直接訪問(wèn)倉(cāng)庫(kù)114的數(shù)據(jù)源116(未示出)相關(guān)聯(lián)。
應(yīng)用程序設(shè)計(jì)用戶接口或工具116參考圖1,可以將應(yīng)用程序105存儲(chǔ)在倉(cāng)庫(kù)114中,作為一系列程序包,可以由工作室開(kāi)發(fā)工具116創(chuàng)建,由應(yīng)用程序105的開(kāi)發(fā)者所采用。開(kāi)發(fā)設(shè)計(jì)工具116可以是用于開(kāi)發(fā)有線和/或無(wú)線組件應(yīng)用程序105包的RAD工具。工具116可以提供對(duì)應(yīng)用程序105組件(參見(jiàn)圖4)的可視設(shè)計(jì)的拖放圖形解決方案的支持,應(yīng)用程序105組件例如但不局限于屏幕402、數(shù)據(jù)元素400、消息404和應(yīng)用程序工作流邏輯406,如稍后所述。將應(yīng)用程序105包表示為可以由工具116通過(guò)自動(dòng)代碼生成處理自動(dòng)產(chǎn)生的元數(shù)據(jù)(XML)。此工具116可以提供自動(dòng)生成的代碼,以包括(或增補(bǔ))工業(yè)標(biāo)準(zhǔn)腳本語(yǔ)言(如JavaScript)或本領(lǐng)域公知的其他腳本/編程語(yǔ)言。通過(guò)服務(wù)器110的發(fā)現(xiàn)服務(wù)在注冊(cè)表112中公布倉(cāng)庫(kù)114中應(yīng)用程序105包的可用性。應(yīng)當(dāng)意識(shí)到根據(jù)應(yīng)用程序網(wǎng)關(guān)AG和關(guān)聯(lián)數(shù)據(jù)源106的特定網(wǎng)絡(luò)10配置的使用情況,可以存在多于一個(gè)倉(cāng)庫(kù)114和關(guān)聯(lián)注冊(cè)表112。
參考圖2,工具116在計(jì)算機(jī)201上操作,該計(jì)算機(jī)201可以通過(guò)如通過(guò)連接218與設(shè)備基礎(chǔ)結(jié)構(gòu)204相連的收發(fā)機(jī)200等網(wǎng)絡(luò)連接接口與網(wǎng)絡(luò)10相連。收發(fā)機(jī)200可以用于將完整的應(yīng)用程序105上載到倉(cāng)庫(kù)114(參見(jiàn)圖1)中,以及訪問(wèn)注冊(cè)表112和所選的數(shù)據(jù)源106。再次參考圖2,開(kāi)發(fā)設(shè)計(jì)工具116還具有用戶接口202,通過(guò)連接222與設(shè)備基礎(chǔ)結(jié)構(gòu)204相連,與用戶(未示出)進(jìn)行交互。用戶接口202包括一個(gè)或多個(gè)用戶輸入設(shè)備,例如但不局限于鍵盤(pán)、數(shù)字鍵盤(pán)、履帶輪(track wheel)、記錄筆、鼠標(biāo)、麥克風(fēng)等,并與用戶輸出設(shè)備相連,如揚(yáng)聲器(未示出)和顯示屏206。如果顯示器206是觸摸敏感的,則也可以將顯示器206用作由設(shè)備基礎(chǔ)結(jié)構(gòu)204控制的用戶輸入設(shè)備。工具116的用戶采用用戶接口202,使用一系列編輯器600和查看器602(參見(jiàn)圖6)來(lái)協(xié)調(diào)應(yīng)用程序105的設(shè)計(jì),使用多個(gè)向?qū)?04來(lái)輔助/驅(qū)動(dòng)開(kāi)發(fā)處理的工作流程。
再次參考圖2,由設(shè)備基礎(chǔ)結(jié)構(gòu)204實(shí)現(xiàn)工具計(jì)算機(jī)201的操作。設(shè)備基礎(chǔ)結(jié)構(gòu)204包括計(jì)算機(jī)處理器208和關(guān)聯(lián)存儲(chǔ)器模塊210。計(jì)算機(jī)處理器208通過(guò)執(zhí)行相關(guān)指令,操縱工具116的網(wǎng)絡(luò)接口200、用戶接口202和顯示器206的操作,所述相關(guān)指令是由駐留在存儲(chǔ)器模塊210中的操作系統(tǒng)和應(yīng)用程序105設(shè)計(jì)編輯器600、向?qū)?04、對(duì)話605和查看器602提供的。此外,應(yīng)當(dāng)意識(shí)到設(shè)備基礎(chǔ)結(jié)構(gòu)204可以包括與處理器208相連的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)212,用于向處理器208提供指令和/或加載/設(shè)計(jì)同樣駐留(例如)在存儲(chǔ)器模塊210中的應(yīng)用程序105。計(jì)算機(jī)可讀介質(zhì)212可以包括硬件和/或軟件,例如,僅作為示例,磁盤(pán)、磁帶、光學(xué)可讀介質(zhì)(如CD/DVD ROM)和存儲(chǔ)卡。在每種情況下,計(jì)算機(jī)可讀介質(zhì)212可以采用設(shè)置在存儲(chǔ)器模塊210中的小盤(pán)、軟盤(pán)、盒式磁帶、硬盤(pán)驅(qū)動(dòng)器、固態(tài)存儲(chǔ)卡或RAM的形式。應(yīng)當(dāng)注意,可以單獨(dú)或組合使用以上所列出的示例計(jì)算機(jī)可讀介質(zhì)212。
再次參考圖2,設(shè)計(jì)工具116在作為開(kāi)發(fā)應(yīng)用程序105的應(yīng)用程序開(kāi)發(fā)環(huán)境的計(jì)算機(jī)201上進(jìn)行操作。工具116的開(kāi)發(fā)方法可以基于構(gòu)建應(yīng)用程序可視、數(shù)據(jù)、消息行為和運(yùn)行時(shí)導(dǎo)航模型的可視“拖放”系統(tǒng)??梢詫⒐ぞ?16構(gòu)造為針對(duì)類集成設(shè)計(jì)環(huán)境(IDE)框架的一組插件,例如但不局限于Eclipse框架,或者可以將工具116配置為完整的設(shè)計(jì)框架,而不使用插件體系結(jié)構(gòu)。只為了示例的目的,現(xiàn)在將工具116描述為使用Eclipse框架的插件設(shè)計(jì)環(huán)境。
參考圖2和6,Eclipse提供基本的類工具116環(huán)境,可以擴(kuò)展為提供定制編輯器、向?qū)?、?xiàng)目管理和其他功能的主機(jī)。Eclipse平臺(tái)設(shè)計(jì)用于構(gòu)建集成開(kāi)發(fā)環(huán)境(IDE),可以用于創(chuàng)建隨著網(wǎng)站變化的應(yīng)用程序,嵌入式Java TM程序、C++程序和企業(yè)JavaBeans TM。導(dǎo)航器視圖230示出了用戶(如開(kāi)發(fā)者)工作空間中的文件;文本編輯器部分232示出了工具116的用戶正在進(jìn)行工作的文件的內(nèi)容,以便開(kāi)發(fā)應(yīng)用程序105和所述關(guān)聯(lián)組件400、402、404、406(參見(jiàn)圖4);任務(wù)查看部分234示出了工具116的用戶的待完成任務(wù)列表(to-do list);以及概況查看器部分236示出了正在設(shè)計(jì)/編輯的應(yīng)用程序105的概況內(nèi)容,和/或可以通過(guò)提供與當(dāng)前選中的對(duì)象有關(guān)的信息,增補(bǔ)其他視圖,如在另一視圖中選中的對(duì)象的屬性。應(yīng)當(dāng)意識(shí)到,工具116幫助開(kāi)發(fā)者以結(jié)構(gòu)化定義語(yǔ)言(如XML)來(lái)創(chuàng)建和修改組件400、402、404中的代碼定義內(nèi)容。此外,工具116幫助開(kāi)發(fā)者創(chuàng)建、修改和生效定義內(nèi)容在組件400、402、404之間的相關(guān)性,例如但不局限于消息/數(shù)據(jù)和屏幕/數(shù)據(jù)關(guān)系。還應(yīng)當(dāng)意識(shí)到可以根據(jù)需要,將由開(kāi)發(fā)者使用的向?qū)?04和對(duì)話605內(nèi)容在顯示器上的顯示(在使用編輯器600和查看器602期間)定位在部分230、232、234、236之一中和/或定位在專用向?qū)Р糠?未示出)中。
以用于發(fā)現(xiàn)、集成和運(yùn)行模塊調(diào)用插件(即,編輯器600和查看器602)的機(jī)制來(lái)構(gòu)建Eclipse平臺(tái)。在通過(guò)計(jì)算機(jī)201的UI 202加載Eclipse平臺(tái)時(shí),在顯示器206上向用戶呈現(xiàn)由一組可用插件構(gòu)成的集成開(kāi)發(fā)環(huán)境(IDE),如編輯器600和查看器602。Eclipse平臺(tái)的多種插件運(yùn)行在顯示器206上所指示的用戶工作空間中的常規(guī)文件上。工作空間由一個(gè)或多個(gè)頂級(jí)項(xiàng)目構(gòu)成,其中每個(gè)項(xiàng)目映射到文件系統(tǒng)中的對(duì)應(yīng)用戶專用目錄,存儲(chǔ)在存儲(chǔ)器210中(和/或可以在網(wǎng)絡(luò)10上訪問(wèn)),并使用導(dǎo)航器230進(jìn)行導(dǎo)航。Eclipse平臺(tái)UI范例基于編輯器、視圖和透視圖。從用戶的觀點(diǎn)來(lái)看,工作臺(tái)顯示器206由視圖602和編輯器600可視地構(gòu)成。透視圖出現(xiàn)在編輯器600和視圖602的選擇和排列中,可以在顯示器206上看到。編輯器600允許用戶打開(kāi)、編輯和保存對(duì)象。編輯器600遵循打開(kāi)-保存-關(guān)閉的生命周期,非常類似于基于文件系統(tǒng)的工具。當(dāng)激活時(shí),選定編輯器600可以對(duì)工作臺(tái)菜單和工具條進(jìn)行動(dòng)作。視圖602提供與用戶正在工作臺(tái)中進(jìn)行操作的一些對(duì)象有關(guān)的信息。查看器602可以通過(guò)提供與所編輯的文檔有關(guān)的信息來(lái)輔助編輯器600。例如,查看器602可以具有比編輯器600簡(jiǎn)單的生命周期,由此通常立即保存使用查看器602做出的修改(如改變屬性值),并在顯示器206的其他有關(guān)部分中立即反映出這些變化。還應(yīng)當(dāng)意識(shí)到,顯示器206的工作臺(tái)窗口可以具有各個(gè)分離的透視圖,在任意給定時(shí)刻,只有其中之一可視。每個(gè)透視圖具有其自身的查看器602和編輯器600,對(duì)查看器602和編輯器600進(jìn)行排列(平鋪、層疊或分離)以便顯示在顯示器206上。
組件應(yīng)用程序105參考圖3,應(yīng)用程序105包具有應(yīng)用程序元素或人造產(chǎn)物(artifact)301,例如但不局限于XML定義300、映射302、應(yīng)用程序資源304和可選地用于本地化支持的資源束306。XML定義300是應(yīng)用程序數(shù)據(jù)400、消息404、屏幕402組件和工作流406、部分原始應(yīng)用程序105的XML編碼。應(yīng)當(dāng)意識(shí)到,XML語(yǔ)法只用作可用于編碼應(yīng)用程序105的任何結(jié)構(gòu)化定義語(yǔ)言的示例。應(yīng)用程序映射302定義了將應(yīng)用程序消息映射到數(shù)據(jù)源106的后端操作時(shí)的內(nèi)容關(guān)系。應(yīng)用程序開(kāi)發(fā)者利用工具116來(lái)創(chuàng)建映射302,由此網(wǎng)關(guān)AG在設(shè)備100的運(yùn)行時(shí)環(huán)境RE與數(shù)據(jù)源106之間通信應(yīng)用程序105請(qǐng)求/響應(yīng)消息期間利用此映射302信息。資源304是將其作為靜態(tài)相關(guān)性與應(yīng)用程序105打包在一起的一個(gè)或多個(gè)資源(圖像、聲音字節(jié)、媒體等)。例如,可以相對(duì)于資源文件夾(未示出)來(lái)定位資源304,從而使特定的資源可以包含其自身相對(duì)于主文件夾的相對(duì)路徑(例如,resources/icon.gif、resources/screens/clipart_1.0/happyface.gif、和resources/soundbytes/midi/inthemood.midi等)。資源束306可以包含針對(duì)由應(yīng)用程序105支持的每種語(yǔ)言的本地化信息。例如,這些束可以位于本地文件夾中,并且可以根據(jù)所支持的語(yǔ)言來(lái)命名(例如,locale/lang_en.properties和locale/lang_fr.properties)。下面給出了元素301的示例。
應(yīng)當(dāng)意識(shí)到設(shè)備100的運(yùn)行時(shí)環(huán)境RE是客戶端駐留容器,在設(shè)備100上在所述容器內(nèi)執(zhí)行應(yīng)用程序105。所述容器管理應(yīng)用程序105在設(shè)備100上的生命周期(供應(yīng)、執(zhí)行、刪除等),并負(fù)責(zé)將表示應(yīng)用程序105的元數(shù)據(jù)(XML)轉(zhuǎn)換為設(shè)備100上的有效可執(zhí)行形式。應(yīng)用程序105是XML定義的可執(zhí)行形式,如上所述,并且由運(yùn)行時(shí)環(huán)境RE創(chuàng)建和維護(hù)。RE可以提供針對(duì)應(yīng)用程序105的一組公用服務(wù),以及提供對(duì)可選JavaScript或其他腳本語(yǔ)言的支持。這些服務(wù)包括對(duì)諸如但不局限于UI控制、數(shù)據(jù)持續(xù)性和異步客戶端-服務(wù)器消息收發(fā)的支持。應(yīng)當(dāng)意識(shí)到,如果需要,這些服務(wù)可以一并作為應(yīng)用程序105的一部分。
參考圖4,組件應(yīng)用程序105是可以具有以諸如可擴(kuò)展標(biāo)識(shí)語(yǔ)言(XML)和ECMAScript的子集編寫(xiě)的人造產(chǎn)物301的軟件應(yīng)用程序。XML和ECMAScript是基于標(biāo)準(zhǔn)的語(yǔ)言,允許軟件開(kāi)發(fā)者按照便攜式和平臺(tái)無(wú)關(guān)的方式開(kāi)發(fā)組件應(yīng)用程序105。組件應(yīng)用程序105的方框圖包括數(shù)據(jù)組件400、呈現(xiàn)組件402和消息組件404,通過(guò)在供應(yīng)時(shí)與設(shè)備100(參見(jiàn)圖1)上的運(yùn)行時(shí)環(huán)境RE進(jìn)行交互,與工作流組件406進(jìn)行協(xié)作??梢允褂媒Y(jié)構(gòu)化定義語(yǔ)言(如XML)將組件400、402、404構(gòu)建為一系列元數(shù)據(jù)記錄,由表示資源的特定屬性的多個(gè)預(yù)定義元素構(gòu)成,從而使每個(gè)元素可以具有一個(gè)或多個(gè)數(shù)值。每個(gè)元數(shù)據(jù)模式典型地已經(jīng)定義了以下特性諸如但不局限于,元素的限制數(shù)量、每個(gè)元素的名稱和每個(gè)元素的含義。示例元數(shù)據(jù)模式包括但不局限于都柏林核(DC)、英美編目規(guī)則(AACR2)、政府信息定位符服務(wù)(GILS)、編碼檔案描述(EAD)、IMS全球?qū)W習(xí)論壇(IMS)和澳大利亞政府定位符服務(wù)(AGLS)。編碼語(yǔ)法允許運(yùn)行時(shí)環(huán)境RE(參見(jiàn)圖1)對(duì)組件400、402、404的元數(shù)據(jù)進(jìn)行處理,并且編碼方案包括但不局限于XML、HTML、XHTML、XSML、RDF、及其可讀編目(MARC)和多用途因特網(wǎng)郵件擴(kuò)展(MIME)。設(shè)備100的客戶端運(yùn)行時(shí)環(huán)境RE對(duì)組件400、402、404的元數(shù)據(jù)描述符進(jìn)行操作,以提供應(yīng)用程序105的可執(zhí)行版本。
再次參考圖4,數(shù)據(jù)組件400定義了由組件應(yīng)用程序105使用的數(shù)據(jù)實(shí)體。數(shù)據(jù)組件400定義了描述數(shù)據(jù)實(shí)體需要哪些信息,以及以何種形式來(lái)表達(dá)這些信息。例如,數(shù)據(jù)組件400可以定義以下信息諸如但不局限于,包括由格式化為數(shù)字的惟一標(biāo)識(shí)符構(gòu)成的訂單、格式化為字符串的項(xiàng)目列表、以日期-時(shí)間為格式的創(chuàng)建所述訂單的時(shí)間、格式化為字符串的訂單的狀態(tài)、以及根據(jù)數(shù)據(jù)組件400中的另一個(gè)的定義進(jìn)行格式化的、下了所述訂單的用戶。
再次參考圖4,消息組件404定義了由組件應(yīng)用程序105使用的消息的格式,用于與外部系統(tǒng)進(jìn)行通信,如網(wǎng)絡(luò)服務(wù)等。例如,消息組件404之一可以描述以下信息諸如但不局限于,發(fā)布訂單的消息(包括該訂單的惟一描述符)、訂單的狀態(tài)、以及與訂單相關(guān)聯(lián)的注釋。應(yīng)當(dāng)意識(shí)到,鏈接或包含相似數(shù)據(jù)定義的數(shù)據(jù)400和消息404組件可以共享組件的數(shù)據(jù)定義內(nèi)容。
再次參考圖4,呈現(xiàn)組件(representation component)402定義了組件應(yīng)用程序105在其由設(shè)備100的用戶接口顯示時(shí)的外觀和行為。呈現(xiàn)組件402可以規(guī)定GUI屏幕和控制、以及在用戶使用用戶接口與組件應(yīng)用程序105進(jìn)行交互時(shí)要執(zhí)行的動(dòng)作。例如,呈現(xiàn)組件402可以定義屏幕、標(biāo)簽、編輯框、按鈕和菜單、以及在用戶在編輯框中進(jìn)行輸入或按下按鈕時(shí)所要采取的動(dòng)作。應(yīng)當(dāng)意識(shí)到,鏈接或包含相似數(shù)據(jù)定義的數(shù)據(jù)400和呈現(xiàn)組件402可以共享組件的數(shù)據(jù)定義內(nèi)容。
參考圖1和4,應(yīng)當(dāng)意識(shí)到,在上述客戶端組件應(yīng)用程序105定義主機(jī)模型中,呈現(xiàn)組件402可以根據(jù)設(shè)備100的客戶端平臺(tái)和環(huán)境發(fā)生變化。例如,在一些情況下,網(wǎng)絡(luò)服務(wù)顧客不需要可視呈現(xiàn)。組件應(yīng)用程序105的組件400、402、404、406的應(yīng)用程序定義可以位于網(wǎng)絡(luò)服務(wù)倉(cāng)庫(kù)114中,作為平臺(tái)中性數(shù)據(jù)400、消息404、工作流406組件描述符與一組針對(duì)多種預(yù)定義客戶端運(yùn)行時(shí)RE的平臺(tái)專用呈現(xiàn)組件402描述符的打包束。當(dāng)發(fā)布針對(duì)應(yīng)用程序105的發(fā)現(xiàn)或展開(kāi)請(qǐng)求消息時(shí),作為此請(qǐng)求消息的一部分指定客戶端類型。為了在針對(duì)通信設(shè)備100的不同客戶端平臺(tái)打包組件應(yīng)用程序105時(shí)不重復(fù)數(shù)據(jù)、消息和工作流元數(shù)據(jù),應(yīng)用程序定義可以作為一束與不同呈現(xiàn)組件402集合相鏈接的平臺(tái)中性組件定義。對(duì)于這些網(wǎng)絡(luò)服務(wù)顧客,客戶端應(yīng)用程序105將包含通過(guò)工作流組件406與數(shù)據(jù)400和消息404組件相鏈接的選中呈現(xiàn)組件402。
再次參考圖4,組件應(yīng)用程序105的工作流組件406定義了在執(zhí)行動(dòng)作時(shí)要發(fā)生的處理,如由上述呈現(xiàn)組件402規(guī)定的動(dòng)作,或者在消息從應(yīng)用程序網(wǎng)關(guān)AG(參見(jiàn)圖1)到達(dá)時(shí)要執(zhí)行的動(dòng)作。呈現(xiàn)、工作流和消息處理由工作流組件406來(lái)定義。以編程語(yǔ)言(例如,面向?qū)ο蟮木幊陶Z(yǔ)言)和/或腳本語(yǔ)言(例如但不限于ECMAScript),將工作流組件406編寫(xiě)為一系列指令,并可以匯編(例如)為本機(jī)代碼,并由運(yùn)行時(shí)環(huán)境206來(lái)執(zhí)行,如上所述。工作流組件406的示例可以是將數(shù)值分配給數(shù)據(jù)、操縱屏幕、或發(fā)送消息105。針對(duì)呈現(xiàn)組件,可以創(chuàng)建多個(gè)工作流定義,以支持隨著設(shè)備100而改變的能力和特征。ECMA(歐洲計(jì)算機(jī)制造商聯(lián)盟)腳本是標(biāo)準(zhǔn)腳本語(yǔ)言,其中腳本可以表示由除計(jì)算機(jī)處理器之外的另一程序解譯或執(zhí)行的指令序列。腳本語(yǔ)言的一些其他示例是Perl、Rexx、VBScript、JavaScript和Tcl/Tk。通常,腳本語(yǔ)言是用于操縱、定制和自動(dòng)化現(xiàn)有系統(tǒng)(如設(shè)備100)的裝置的指令語(yǔ)言。
參考圖4,使用組件體系結(jié)構(gòu),對(duì)應(yīng)用程序105進(jìn)行結(jié)構(gòu)化,從而在設(shè)備100(參見(jiàn)圖1)從應(yīng)用程序網(wǎng)關(guān)AG接收到包含消息數(shù)據(jù)的響應(yīng)消息時(shí),適當(dāng)?shù)墓ぷ髁鹘M件406根據(jù)適當(dāng)?shù)南⒔M件404定義來(lái)解譯消息的數(shù)據(jù)內(nèi)容。然后,工作流組件406處理數(shù)據(jù)內(nèi)容,并將數(shù)據(jù)插入到相應(yīng)的數(shù)據(jù)組件400中,以便隨后存儲(chǔ)在設(shè)備100中。此外,如果需要,工作流組件406還將數(shù)據(jù)插入到適當(dāng)?shù)某尸F(xiàn)組件402中,以便隨后在設(shè)備100的顯示器上進(jìn)行顯示。應(yīng)用程序105的組件體系結(jié)構(gòu)的另一示例是針對(duì)設(shè)備100的用戶所輸入的數(shù)據(jù),如按下按鈕或選擇菜單項(xiàng)。相關(guān)工作流組件406根據(jù)適當(dāng)?shù)某尸F(xiàn)組件404解譯輸入數(shù)據(jù),并創(chuàng)建由適當(dāng)?shù)臄?shù)據(jù)組件400所定義的數(shù)據(jù)實(shí)體。然后,工作流組件406以由用戶提供的輸入數(shù)據(jù)來(lái)組裝數(shù)據(jù)組件400,以便隨后存儲(chǔ)在設(shè)備100中。此外,工作流組件406還將輸入數(shù)據(jù)插入到適當(dāng)?shù)南⒔M件404中,以便隨后相數(shù)據(jù)源106發(fā)送作為數(shù)據(jù)實(shí)體的輸入數(shù)據(jù),例如網(wǎng)絡(luò)服務(wù)等,由消息組件404所定義。
參考圖4,以下示例示出了如何使用結(jié)構(gòu)化定義語(yǔ)言(例如但不局限于XML)、以及平臺(tái)中性腳本/編程語(yǔ)言(例如但不局限于ECMAScript)與符合以下文檔型定義(DTD)的定義組件一起來(lái)表達(dá)網(wǎng)絡(luò)服務(wù)客戶端應(yīng)用程序105<!ELEMENT wcApp(desc ,iconUrl ,res*,wcData*,wcMsg*,style*,wcScr*,wcFlow)><!ATTLIST wcAppname CDATA#REQUIREDtitle CDATA#IMPLIEDvendor CDATA#IMPLIEDversion CDATA#IMPLIEDtransportKey CDATA#IMPLIEDinstallNotifURL CDATA#IMPLIEDregisterURL CDATA#IMPLIED><!ELEMENT desc(#PCDATA)><!ELEMENT iconUrl(#PCDATA)><!ELEMENT res(#PCDATA)><!ATTLIST resname CDATA#REQUIREDurl CDATA#REQUIREDtype(xml|image|sound|any)#REQUIREDdeferred(true|false)"false">
示例數(shù)據(jù)組件400<!ELEMENT wcData(dfield+)><!ATTLIST wcData
name CDATA#REQUIREDpersisted(true|false)"true"><!ELEMENT dfield(#PCDATA)><!ATTLIST dfieldname CDATA#REQUIREDtype(String|Number|Boolean|Date|Any)"Any"array(true|false)"false"cmp(true|false)"false"cmpName CDATA#IMPLIEDkey(0|1|2)"0">
示例消息組件404<!ELEMENT wcMsg(mfield*)><!ATTLIST wcMsgname CDATA#REQUIREDmapping CDATA#IMPLIED><!ATTLIST wcMsgpblock CDATA#IMPLIED><!ELEMENT mfield(#PCDATA)><!ATTLIST mfieldname CDATA#REQUIREDtype(String|Number|Boolean|Date|Array|XML)#IMPLIEDmapping CDATA#IMPLIED>
示例呈現(xiàn)組件402<!ELEMENT wcScr(layout ,menu ,refresh ,event )><!ATTLIST wcScrname CDATA#REQUIREDtitle CDATA#IMPLIEDmain(true|false)"false"dialog(true|false)"false"param CDATA#IMPUED><!ELEMENT style(font )><!ATTLIST stylename CDATA#REQUIREDbgColor CDATA#IMPLIED><!ELEMENT font EMPTY><!ATTLIST fontname CDATA#REQUIREDcolor CDATA#IMPLIEDsize 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 layouttype(grid|flow|border|vertical)#REQUIREDparam CDATA#IMPLIEDplacement CDATA#IMPLIEDstyle CDATA#IMPLIED><!ELEMENT menu(item*)><!ELEMENT item(action,condition )><!ATTLIST itemname CDATA#REQUIREDlabel CDATA#REQUIREDshortcut CDATA#IMPLIED><!ELEMENT action EMPTY><!ATTLIST actionscreen CDATA#IMPLIEDpblock CDATA#IMPLIEDparam CDATA#IMPLIEDacceptChanges(true|false)"true"><!ELEMENT condition EMPTY><!ATTLIST conditionpblock CDATA#REQUIREDparam CDATA#IMPUEDresult(true|false)"true"><!ELEMENT event EMPTY><!ATTLIST eventtype(onlnit|onClick|onChange|onFocusOut)"onlnit"pblock CDATA#IMPLIEDscreen CDATA#IMPLIEDparam CDATA#IMPLIED><!ELEMENT separator EMPTY><!ELEMENT label(condition ,event )><!ATTLIST labelname CDATA#REQUIREDvalue CDATA#REQUIREDplacement CDATA#IMPLIEDstyle CDATA#IMPLIED><!ELEMENT edit(condition ,event )><!ATTLIST edit
name CDATA#REQUIREDvalue CDATA#IMPLIEDmapping CDATA#IMPLIEDtype(char|number|date|pwd|phone|email)"char"readOnly(true|false)"false"placement CDATA#IMPLIEDstyle CDATA#IMPLIED><!ELEMENT textarea(condition ,event )><!ATTLIST textareaname CDATA#REQUIREDvalue CDATA#IMPLIEDmapping CDATA#IMPLIEDreadOnly(true|false)"false"placement CDATA#IMPLIEDstyle CDATA#IMPLIED><!ELEMENT image(condition ,event )><!ATTLIST imagename CDATA#REQUIREDresName CDATA#REQUIREDplacement CDATA#IMPLIED><!ELEMENT choice(condition ,event ,entry*)><!ATTLIST choicename CDATA#REQUIREDvalue CDATA#IMPLIEDmapping CDATA#IMPLIEDtype(singleList|multiList|dropdown|checkbox|radio)"singleList"readOnly(true|false)"false"placement CDATA#IMPLIEDstyle CDATA#IMPLIED><!ELEMENT entry(#PCDATA)><!ELEMENT button(condition ,event )><!ATTLIST buttonname CDATA#REQUIREDlabel CDATA#REQUIREDimage(true|false)"false"placement CDATA#IMPLIEDstyle CDATA#IMPLIED>
示例工作流組件406<!ELEMENT wcFlow(pblock+)><!ELEMENT pblock(#PCDATA)><!ATTLIST pblockid CDATA#REQUIREDparam CDATA#IMPLIED>
顯示在圖5中的示例組件應(yīng)用程序105由以下XML和mEScript來(lái)表示,包括作為“wcData”的數(shù)據(jù)組件400、作為“wcMsg”的消息組件404、作為“wcScr”的呈現(xiàn)組件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元素定義了示例組件應(yīng)用程序105,包括wcApp元素、wcData元素、wcSrc元素和wcFlow元素。參考圖4,wcApp元素是定義了組件應(yīng)用程序105的頂級(jí)元素。wcData元素定義了示例數(shù)據(jù)元素400,由一組命名、類型字段組成。wcMsg元素定義了示例消息組件404,類似地定義了一組命名、類型字段。wcScr元素定義了示例呈現(xiàn)組件402。示例呈現(xiàn)組件402是標(biāo)簽、分隔符、圖像、按鈕、編輯字段、文本區(qū)域、單選列表、復(fù)選列表、下拉列表、復(fù)選框、單選按鈕或包含一組其他呈現(xiàn)組件402的屏幕。包括在示例組件應(yīng)用程序105中的呈現(xiàn)組件402定義了登錄屏幕500、特殊要求屏幕502、送貨信息屏幕504、訂單列表屏幕508和訂單狀態(tài)屏幕506。這些屏幕將呈現(xiàn)在設(shè)備100的用戶接口上。wcFlow元素定義了示例工作流組件406。XML元素的pblock屬性規(guī)定了嵌入在wcFlow元素中的pblock元素。每個(gè)pblock元素包括定義了組件應(yīng)用程序105的部分工作流的腳本。僅作為示例,腳本由ECMAScript編寫(xiě)。
為了定義組件應(yīng)用程序105的行為,工作流組件406使用ECMAScript來(lái)引用和操縱數(shù)據(jù)組件400、呈現(xiàn)組件402和消息組件404。工作流組件406也可以引用外部對(duì)象類型,允許在組件應(yīng)用程序105中所定義的組件上執(zhí)行動(dòng)作。例如,wcMsg類型允許對(duì)由消息組件404定義的消息進(jìn)行評(píng)估,以確定是否已經(jīng)提供給強(qiáng)制字段,并發(fā)送給如外部服務(wù)106等外部系統(tǒng)。wcData類型允許確定由數(shù)據(jù)組件400定義的數(shù)據(jù)實(shí)體的集合大小,并允許刪除數(shù)據(jù)實(shí)體。wcScr類型允許將呈現(xiàn)組件402呈現(xiàn)給用戶。類似地,特殊對(duì)話外部對(duì)象允許在設(shè)備100的用戶接口上將消息呈現(xiàn)給用戶。消息組件404中繼輸入和輸出應(yīng)用程序105的消息所需的數(shù)據(jù)。相應(yīng)的數(shù)據(jù)組件400與數(shù)據(jù)在設(shè)備100的存儲(chǔ)器中的存儲(chǔ)進(jìn)行協(xié)作,以便隨后由呈現(xiàn)組件402在用戶接口上進(jìn)行呈現(xiàn)。工作流組件406與數(shù)據(jù)400、呈現(xiàn)402和消息404組件之間的數(shù)據(jù)傳送進(jìn)行協(xié)作。將工作流組件406編寫(xiě)為一系列指令,例如但不局限于ECMAScript,如上所述。
上述基于組件的應(yīng)用程序105體系結(jié)構(gòu)可以導(dǎo)致其中設(shè)備100的用戶接口與數(shù)據(jù)的定義解耦合的組件應(yīng)用程序105。這種解耦合允許對(duì)組件應(yīng)用程序105中的任何組件400、402、404、406進(jìn)行修改,同時(shí)有利于組件應(yīng)用程序105的維護(hù),包括在設(shè)備100上修改和更新組件應(yīng)用程序105。
設(shè)計(jì)工具116體系結(jié)構(gòu)圖6示出了用于設(shè)計(jì)組件應(yīng)用程序105的總體設(shè)計(jì)工具116結(jié)構(gòu)。設(shè)計(jì)工具116接口(UI 202和顯示器206一參見(jiàn)圖2)主要是圖形和文本編輯器600、查看器602、對(duì)話605和向?qū)?04的面向用戶的模塊601集合。使用拖放編輯系統(tǒng)和向?qū)?qū)動(dòng)具體方案,通過(guò)這些編輯器600中的一個(gè)或多個(gè)來(lái)實(shí)現(xiàn)與開(kāi)發(fā)者/用戶的大多數(shù)外部交互。次要的非面向用戶的系統(tǒng)接口是“后端”,由此工具116與諸如網(wǎng)絡(luò)服務(wù)和SQL數(shù)據(jù)庫(kù)等摘要數(shù)據(jù)源106相連。如上所述,可以在Eclipse平臺(tái)上構(gòu)建工具116,由此用戶接口系統(tǒng)組件可以是但不局限于編輯器600、查看器602、對(duì)話(未示出)和向?qū)?04的組件,例如,是擴(kuò)展了Eclipse類并利用Eclipse框架的插件模塊601。如圖所示,工具116與后端數(shù)據(jù)源106和UDDI倉(cāng)庫(kù)114和注冊(cè)表112進(jìn)行通信。這些外部系統(tǒng)106、112、114可以不是工具116的一部分,但為了完整的目的,仍然將其示出。
工具116具有主要由編輯器600和查看器602構(gòu)成的UI層606,通過(guò)工作流向?qū)?05發(fā)揮輔助作用。層606能夠訪問(wèn)擴(kuò)展窗口小部件集和圖形庫(kù),對(duì)于Eclipse,已知為標(biāo)準(zhǔn)窗口小部件工具箱(SWT)。UI層606模塊601也可以使用稱為JFace的高級(jí)工具箱,包含標(biāo)準(zhǔn)查看器類(如列表、樹(shù)和表格等)和用于向菜單和工具欄中添加命令的動(dòng)作框架。工具116也可以使用圖形編輯框架(GEP)來(lái)實(shí)現(xiàn)繪圖編輯器,如工作流編輯器702和關(guān)系編輯器704(參見(jiàn)圖7)。UI層606模塊601可以遵循模型-視圖-控制器的設(shè)計(jì)模式,其中每個(gè)模塊601既是視圖,又是控制器。數(shù)據(jù)模型608、610表示應(yīng)用程序105的持續(xù)狀態(tài),在數(shù)據(jù)模型層612和工具116體系結(jié)構(gòu)中實(shí)現(xiàn)。層606、612的分離保持了多個(gè)視圖中的呈現(xiàn)專用信息,并設(shè)置多個(gè)UI模塊601(例如,編輯器600和查看器602)來(lái)響應(yīng)數(shù)據(jù)模型608、610的變化。編輯器600和查看器602的開(kāi)發(fā)者在顯示器202(參見(jiàn)圖2)上的操作由向?qū)?04加以輔助,用于指導(dǎo)應(yīng)用程序105的開(kāi)發(fā)。應(yīng)用程序開(kāi)發(fā)模式或開(kāi)發(fā)指導(dǎo)948(參見(jiàn)圖13)。所述模式落入以下通用類之一中例如但不局限于推薦模式654;開(kāi)發(fā)方案模式650;生效模式660;消息收發(fā)模式658;屏幕模式656和腳本模式652,如參考圖13進(jìn)一步描述的那樣。
工具116數(shù)據(jù)模型608、610可以基于Eclipse建??蚣?EMF)。EMF是框架和代碼生成工具。框架提供模型608、610改變通知、持續(xù)性支持和通常用于操縱EMF對(duì)象的有效反映API。使用代碼生成工具來(lái)產(chǎn)生模型608、610實(shí)現(xiàn),并創(chuàng)建適配器,用于將模型層與UI層606的用戶接口模塊601相連。
工具116服務(wù)層614提供了針對(duì)UI層606的工具,如生效620、本地化624、生成622、構(gòu)建626和展開(kāi)628,稍后將進(jìn)一步描述。工具116可以使用Eclipse擴(kuò)展點(diǎn)機(jī)制,加載針對(duì)兩種服務(wù)的附加插件后端連接器616和具有關(guān)聯(lián)呈現(xiàn)環(huán)境630的設(shè)備皮膚(device skin)管理器618。
后端連接器616定義了提供給工具116的Eclipse擴(kuò)展點(diǎn),用于通信或獲得與不同后端數(shù)據(jù)源106有關(guān)的信息,以便獲得所選數(shù)據(jù)源106的消息格式。后端連接器616可以用作連接和調(diào)查后端數(shù)據(jù)源106服務(wù)的接口,如網(wǎng)絡(luò)服務(wù)和SQL數(shù)據(jù)庫(kù)等。后端連接器616有利于構(gòu)建適當(dāng)?shù)膽?yīng)用程序消息和數(shù)據(jù)組,以便在應(yīng)用程序105運(yùn)行在設(shè)備上時(shí)允許其與這些服務(wù)之間的通信。后端連接器616可以支持對(duì)多種不同類型的數(shù)據(jù)源106的訪問(wèn),例如但不局限于通過(guò)基于通信連接器的體系結(jié)構(gòu)暴露各個(gè)直接通信接口。在運(yùn)行時(shí),工具116讀取插件注冊(cè)表,將所貢獻(xiàn)的后端擴(kuò)展名添加到后端連接器616的集合中,例如但不局限于針對(duì)網(wǎng)絡(luò)服務(wù)的連接器。
后端連接器616可以負(fù)責(zé)(例如但不局限于)連接后端數(shù)據(jù)源106(如網(wǎng)絡(luò)服務(wù)、數(shù)據(jù)庫(kù)等)中所選擇的一個(gè)(或多個(gè));提供用于訪問(wèn)后端數(shù)據(jù)源106的描述(如消息、操作、數(shù)據(jù)類型)的接口;和/或提供通知服務(wù)(將通知通過(guò)網(wǎng)絡(luò)10推送到設(shè)備100的那些服務(wù)-參見(jiàn)圖1)的標(biāo)識(shí)。后端連接器616可以提供針對(duì)后端數(shù)據(jù)源106(如網(wǎng)絡(luò)服務(wù)、SQL數(shù)據(jù)庫(kù)或其他)的接口,以便訪問(wèn)數(shù)據(jù)源描述,并且可以提供后端消息收發(fā)的具體實(shí)現(xiàn)細(xì)節(jié)與由設(shè)計(jì)時(shí)數(shù)據(jù)模型608維護(hù)的類消息收發(fā)描述302之間的一定程度的概要(abstraction)。例如,后端連接器616可以用于產(chǎn)生針對(duì)應(yīng)用程序105的適當(dāng)消息404和數(shù)據(jù)400組件集,并且由模型生效器620使用,作為生效任務(wù)的一部分,以驗(yàn)證正在開(kāi)發(fā)的應(yīng)用程序105中的現(xiàn)有消息映射302關(guān)系是否健全。例如,可以將后端連接器616實(shí)現(xiàn)為使用API呼叫作為協(xié)議來(lái)訪問(wèn)底層后端數(shù)據(jù)源106的接口(例如,使用針對(duì)網(wǎng)絡(luò)服務(wù)的WSDL接口)。
設(shè)備皮膚管理器618管理Eclipse擴(kuò)展點(diǎn),例如,允許工具116仿真不同的設(shè)備100(參見(jiàn)圖1),從而可以規(guī)定(應(yīng)用程序105的)不同目標(biāo)設(shè)備100的感觀。在運(yùn)行時(shí),工具116讀取插件注冊(cè)表,并將所需的皮膚擴(kuò)展名或呈現(xiàn)環(huán)境630添加到由管理器618管理的設(shè)備環(huán)境630的集合中,例如但不局限于針對(duì)通用BlackBerry TM或其他設(shè)備100的環(huán)境630。皮膚管理器618由測(cè)試/預(yù)覽查看器806使用,以便加載看起來(lái)適合于所仿真的設(shè)備100的可視元素(由數(shù)據(jù)模型608、610的屏幕組件402所定義),即與特定的環(huán)境630相兼容的元素。不同的皮膚或呈現(xiàn)環(huán)境/格式630是“可插入”到工具116的管理器618中的,意味著第三方可以通過(guò)創(chuàng)建新的惟一的SkinId(Eclipse擴(kuò)展點(diǎn))并實(shí)現(xiàn)用于創(chuàng)建由仿真設(shè)備100的運(yùn)行時(shí)環(huán)境RE所支持的屏幕元素的實(shí)例的適當(dāng)接口,來(lái)實(shí)現(xiàn)其自己的呈現(xiàn)環(huán)境630。為了加載新的呈現(xiàn)環(huán)境630,測(cè)試/預(yù)覽查看器806首先向管理器618請(qǐng)求特定環(huán)境630的實(shí)例。然后,管理器618例示環(huán)境630,并且測(cè)試/預(yù)覽查看器806使用特定的環(huán)境6320,根據(jù)模型608、610的屏幕組件402構(gòu)建屏幕元素。例如,通過(guò)使用Eclipse框架的定制Eclipse擴(kuò)展點(diǎn),將呈現(xiàn)環(huán)境630(如皮膚插件)識(shí)別為皮膚管理器618。
參考圖6,UI層606由一組編輯器600、查看器602、向?qū)?04和對(duì)話605構(gòu)成。UI層606使用模型-視圖-控制器(MVC)的模式,其中每個(gè)UI模塊601既是視圖,又是控制器。UI層模型610利用由MVC模式定義的一些有關(guān)控制邏輯,與數(shù)據(jù)模型608、610進(jìn)行交互。編輯器600是在工具116的用戶選擇“保存”之前不會(huì)提交模型608、610的變化的模塊601。編輯器600的一個(gè)示例是腳本編輯器706(參見(jiàn)圖7),稍后將進(jìn)行描述。查看器602是在用戶進(jìn)行改動(dòng)時(shí)立即將改動(dòng)提交給模型608、612的模塊601。查看器602的一個(gè)示例是導(dǎo)航器(項(xiàng)目視圖)802(參見(jiàn)圖8)。向?qū)?04是由一系列一個(gè)或多個(gè)對(duì)話605逐步驅(qū)動(dòng)的模塊601,其中每個(gè)對(duì)話605通過(guò)用戶接口202(參見(jiàn)圖2)從工具116的用戶處收集特定的信息。在工具116的用戶選擇如“完成”等確認(rèn)按鈕之前,并不使用向?qū)?04將任何改變應(yīng)用于設(shè)計(jì)時(shí)模型608。應(yīng)當(dāng)意識(shí)到,在示例插件設(shè)計(jì)工具116環(huán)境中,模塊610可以擴(kuò)展兩種接口Eclipse擴(kuò)展點(diǎn)和擴(kuò)展點(diǎn)接口。擴(kuò)展點(diǎn)將系統(tǒng)中已經(jīng)定義的惟一包或插件聲明為功能擴(kuò)展的入口點(diǎn),如編輯器600、向?qū)?04或項(xiàng)目。擴(kuò)展點(diǎn)接口允許工具116定義其自己的插件接口,例如,針對(duì)皮膚618和后端616連接器。
再次參考圖6,工具116中的模塊601(主要是編輯器600和查看器602)是數(shù)據(jù)模塊608、610的觀察器,并用于與所述應(yīng)用程序的數(shù)據(jù)模塊608、610(例如,組件400、402、404、406-參見(jiàn)圖4)進(jìn)行交互,或測(cè)試和修改數(shù)據(jù)模塊608、610。當(dāng)數(shù)據(jù)模塊608、610改變時(shí),通過(guò)更新應(yīng)用程序105的呈現(xiàn),通知和響應(yīng)數(shù)據(jù)模塊608、610。例如,工具116使用Eclipse建??蚣?EMF)將Eclipse UI框架與工具116數(shù)據(jù)模塊608、610相連,由此模塊601可以使用標(biāo)準(zhǔn)的Eclipse接口來(lái)提供用于在顯示器206(參見(jiàn)圖2)上顯示和編輯對(duì)象的信息。通常,EMP框架實(shí)現(xiàn)這些標(biāo)準(zhǔn)接口,并通過(guò)調(diào)用知道如何訪問(wèn)駐留在存儲(chǔ)器210中的數(shù)據(jù)模塊608、610的、所生成的適配器來(lái)適配對(duì)這些接口的調(diào)用。設(shè)計(jì)時(shí)數(shù)據(jù)模型608是正在開(kāi)發(fā)的應(yīng)用程序105的當(dāng)前版本,并且由用戶訪問(wèn),采用模塊601與模型608的關(guān)聯(lián)數(shù)據(jù)進(jìn)行交互。模塊601還可以觸發(fā)與設(shè)計(jì)時(shí)數(shù)據(jù)模塊608有關(guān)的生效動(dòng)作。模塊601也可以引起根據(jù)駐留在存儲(chǔ)器210中的設(shè)計(jì)時(shí)數(shù)據(jù)模型608生成一些或全部應(yīng)用程序105。通常,設(shè)計(jì)時(shí)數(shù)據(jù)模型608通過(guò)接口UI202(參見(jiàn)圖2)接受影響模型608的狀態(tài)的一組命令,并且可以作為響應(yīng),產(chǎn)生一組事件。所述每個(gè)模塊601(編輯器600和查看器602)包括影響模塊601和數(shù)據(jù)模塊608配對(duì)的命令和事件組。
參考圖6和8,運(yùn)行時(shí)數(shù)據(jù)模塊610表示正在通過(guò)工具116進(jìn)行開(kāi)發(fā)的仿真應(yīng)用程序105的狀態(tài),用作設(shè)計(jì)時(shí)數(shù)據(jù)模型608的基礎(chǔ)和內(nèi)容。運(yùn)行時(shí)數(shù)據(jù)模塊610存儲(chǔ)以下主要項(xiàng)目的數(shù)值,例如但不局限于數(shù)據(jù)組件400(參見(jiàn)圖4);全局變量;消息組件404;資源304、306(參見(jiàn)圖3);屏幕組件402和樣式。在應(yīng)用程序105仿真期間,為了測(cè)試和預(yù)覽的目的(例如),運(yùn)行時(shí)數(shù)據(jù)模塊610與設(shè)計(jì)時(shí)數(shù)據(jù)模型608和測(cè)試/預(yù)覽查看器806進(jìn)行合作。查看器806也可以與皮膚管理器616進(jìn)行合作,以便針對(duì)特定的設(shè)備100類型來(lái)仿真運(yùn)行時(shí)數(shù)據(jù)模塊610。運(yùn)行時(shí)數(shù)據(jù)模塊610還通過(guò)橋613向查看器806以及UI層606的其他關(guān)聯(lián)模塊601通知對(duì)模塊601做出的變化。例如,在模塊610的狀態(tài)改變時(shí),可以將API調(diào)用用作關(guān)聯(lián)模塊601的通知器。
參考圖6和4,設(shè)計(jì)時(shí)數(shù)據(jù)模型608表示應(yīng)用程序105開(kāi)發(fā)項(xiàng)目的狀態(tài),并在模塊608的狀態(tài)已經(jīng)改變并保存和加載來(lái)自存儲(chǔ)器210的對(duì)象時(shí),通過(guò)通知模塊601,與UI層606的模塊601進(jìn)行交互。模型608的主要責(zé)任是定義應(yīng)用程序105,包括但不局限于以下項(xiàng)目數(shù)據(jù)組件400定義;全局變量定義;消息組件404定義;資源304、306定義;屏幕組件402定義;腳本406;樣式定義和后端數(shù)據(jù)源106映射302描述符。設(shè)計(jì)時(shí)數(shù)據(jù)模型608響應(yīng)于每個(gè)編輯器600、查看器602的命令。設(shè)計(jì)時(shí)數(shù)據(jù)模型608還響應(yīng)于模塊608的變化,向模塊601發(fā)射事件,以及通過(guò)在數(shù)據(jù)模型608發(fā)生改變時(shí)通知相應(yīng)的模塊601,與其他模塊601進(jìn)行合作/通信(模塊601-模塊601交互)。數(shù)據(jù)模型608依賴于接口,以便串行化針對(duì)存儲(chǔ)器210的模型608內(nèi)容檢索和存儲(chǔ)。
以下將描述工具116編輯器602和查看器602用于與數(shù)據(jù)模型608進(jìn)行交互的機(jī)制。EMF.Edit框架是由Eclipse框架提供的可選框架。工具116可以使用EMF.Edit框架和所產(chǎn)生的代碼(例如)作為EclipseUI框架與工具數(shù)據(jù)模型608之間的橋或耦合613。根據(jù)模型-視圖-控制器模式,編輯器600和查看器602并不直接知道模型608,而是依賴于提供顯示和編輯608中的數(shù)據(jù)所需的信息的接口。
通常,例如,樹(shù)查看器使用TreeContentProvider和LabelProvider接口來(lái)查詢樹(shù)的結(jié)構(gòu),并分別獲得樹(shù)中的每個(gè)節(jié)點(diǎn)的文本和圖標(biāo)。表格查看器和列表查看器按照類似的方式進(jìn)行操作,但使用結(jié)構(gòu)化的ContentProvider和LabelProvider接口。數(shù)據(jù)模型608中的每個(gè)類均為變化通知器,即無(wú)論何時(shí)屬性或引用發(fā)生變化,則發(fā)射事件。例如,在EMF中,將通知觀察器稱為適配器,因?yàn)槠洳粌H觀察狀態(tài)變化,而且可以通過(guò)支持附加的接口擴(kuò)展其所附屬的類的行為(無(wú)需子類)。通過(guò)適配器工廠(adapter factory)將適配器附屬于模型對(duì)象。請(qǐng)求適配器工廠以特定類型的擴(kuò)展來(lái)視頻對(duì)象。適配器工廠負(fù)責(zé)創(chuàng)建適配器或返回現(xiàn)有適配器,模型對(duì)象并不知道對(duì)其本身的適配。工具116使用EMF來(lái)產(chǎn)生針對(duì)數(shù)據(jù)模型608的一組適配器,被稱為項(xiàng)目提供商。每個(gè)項(xiàng)目提供商是實(shí)現(xiàn)了提供商接口以擴(kuò)展模型對(duì)象的行為從而使其能夠被查看和編輯的適配器,同時(shí)是能夠?qū)顟B(tài)變化傳遞給監(jiān)聽(tīng)視圖的通知觀察器。例如,工具116通過(guò)以一個(gè)或多個(gè)EMF.Edit類來(lái)配置編輯器600和查看器602,將編輯器600和查看器602與數(shù)據(jù)模型608相連。每個(gè)EMF.Edit類支持Eclipse UI提供商接口。EMF.Edit類通過(guò)代表適配器工廠來(lái)實(shí)現(xiàn)接口調(diào)用。于是,適配器工廠返回知道如何訪問(wèn)數(shù)據(jù)模型608的已生成適配器(項(xiàng)目提供商)。當(dāng)模型608的狀態(tài)改變時(shí),使用相同的適配器來(lái)更新查看器602和編輯器600。
以下命令是能夠影響UI層606的相關(guān)模塊601的示例命令ComponentAdded-已經(jīng)將組件(即屏幕、數(shù)據(jù)等)添加到應(yīng)用程序105;ComponentRemoved-已經(jīng)將組件從應(yīng)用程序105中移除;ComponentRenamed-已經(jīng)對(duì)組件進(jìn)行重新命名;NavigationControlChanged-已經(jīng)在應(yīng)用程序105的屏幕(例如組件402)上添加或移除了按鈕或菜單項(xiàng),或者改變了按鈕或菜單項(xiàng)的屬性;DataBindingChanged-已經(jīng)在屏幕上添加或移除了數(shù)據(jù)綁定控制(消息404、數(shù)據(jù)400和/或呈現(xiàn)402組件),或者改變了數(shù)據(jù)綁定控制的屬性;ScreenParameterListChanged-已經(jīng)在屏幕組件402之一中添加或移除了參數(shù);FieldMappingChanged-已經(jīng)改變了消息等級(jí)、字段等級(jí)或原型映射;MessageContainmentChanged-已經(jīng)改變了包含關(guān)系;MessageFieldChanged-已經(jīng)針對(duì)消息404和/或屏幕402組件添加或移除了消息字段,或者改變了消息字段的屬性;DataFieldChanged-已經(jīng)針對(duì)消息404、數(shù)據(jù)400和/或呈現(xiàn)402組件添加或移除了數(shù)據(jù)字段,或者改變了數(shù)據(jù)字段的屬性;NavigationChanged-在工作流組件406中,已經(jīng)改變了可能包含導(dǎo)航代碼的腳本;LocalizedStringChanged-已經(jīng)添加、移除或改變了文字串;以及ExitCodeChanged-已經(jīng)在工作流組件406的腳本中添加或移除了退出代碼。
服務(wù)層614的模型生效620提供了針對(duì)UI層606的工具,例如使設(shè)計(jì)時(shí)數(shù)據(jù)模型608生效。模型生效器620用于檢查應(yīng)用程序105消息的設(shè)計(jì)時(shí)數(shù)據(jù)模型608呈現(xiàn)是否與消息收發(fā)操作的后端數(shù)據(jù)源106呈現(xiàn)一致。模型生效器620可以負(fù)責(zé)使要產(chǎn)生的應(yīng)用程序105的模型608呈現(xiàn)生效,例如但不局限于以下元素工作流組件406的工作流健全;組件400、402、404、406的參數(shù)和字段級(jí)映射的一致性;屏幕組件402的屏幕控制映射和屏幕刷新消息;組件400、402、404、406間和內(nèi)的消息和/或數(shù)據(jù)復(fù)制。生效620的另一功能可以是使后端數(shù)據(jù)源106消息收發(fā)關(guān)系的模型608呈現(xiàn)生效。為了實(shí)現(xiàn)此職責(zé),生效器與設(shè)計(jì)時(shí)數(shù)據(jù)模型608、應(yīng)用程序生成器622和后端連接器616進(jìn)行合作。通過(guò)應(yīng)用程序生成器622進(jìn)行請(qǐng)求模型生效器620使模型608(或模型608的一部分-根據(jù)需要)生效的請(qǐng)求,例如,使用工具用戶接口202,經(jīng)由將生成器622與生效器620相連的生效模型接口(未示出)。反過(guò)來(lái),模型生效器620利用設(shè)計(jì)時(shí)數(shù)據(jù)模型608以及后端連接器616作為生效任務(wù)的一部分,設(shè)計(jì)時(shí)數(shù)據(jù)模型608包含應(yīng)用程序105和映射文件元模型信息,后端連接器616支持對(duì)后端數(shù)據(jù)源106的接口。
參考圖6和9,示出了模型608生效序列900。首先,請(qǐng)求901生效器620使模型608生效。生效器從數(shù)據(jù)模型608中獲得902所有組件400、402、404、406,并依次生效903每個(gè)組件400、402、404、406的內(nèi)容。然后,生效器620從數(shù)據(jù)模型608獲得904后端映射302,然后,獲得905后端數(shù)據(jù)源106的映射信息。進(jìn)行比較906,以便使模型608生效907。
再次參考圖6,本地化服務(wù)624負(fù)責(zé)(例如但不局限于)支持用戶可視串的構(gòu)建時(shí)間本地化;支持附加的本地化設(shè)置(例如,缺省時(shí)間和日期顯示格式、缺省數(shù)字顯示格式、缺省貨幣格式等);以及創(chuàng)建資源束文件306(和資源304),可以由構(gòu)建服務(wù)626在準(zhǔn)備可展開(kāi)應(yīng)用程序105(例如應(yīng)用程序jar文件)時(shí)使用。例如,可以將本地化服務(wù)624實(shí)現(xiàn)為用于收集駐留在設(shè)計(jì)時(shí)數(shù)據(jù)模型608中的資源304、306的資源模塊,以便將其包括在可展開(kāi)應(yīng)用程序105中。JAR文件可以是包含收集到單一文件中并進(jìn)行了壓縮以便有效地下載到設(shè)備100中的、針對(duì)應(yīng)用程序的類、圖像和聲音文件。例如,本地化服務(wù)624由應(yīng)用程序生成器622使用,來(lái)產(chǎn)生語(yǔ)言專用資源束306。構(gòu)建服務(wù)626實(shí)現(xiàn)了資源束306的準(zhǔn)備,并將資源束306與可展開(kāi)應(yīng)用程序105打包在一起。本地化服務(wù)624與工具編輯器600和查看器602進(jìn)行交互(提供與之的接口),用于設(shè)置或操縱應(yīng)用程序105的語(yǔ)言串和本地設(shè)置。
參考圖6,應(yīng)用程序生成器622可以負(fù)責(zé)(例如但不局限于)根據(jù)組件400、402、404生成應(yīng)用程序XML;生成映射302描述符;優(yōu)化組件400、402、404描述的字段次序;以及生成所需的相關(guān)性和腳本變換,以便存儲(chǔ)在存儲(chǔ)器210中。應(yīng)用程序生成器622與設(shè)計(jì)時(shí)數(shù)據(jù)模型608合作,以獲得包括應(yīng)用程序105的開(kāi)發(fā)組件400、402、404的內(nèi)容。應(yīng)用程序生成器622利用模型生效器620來(lái)檢查應(yīng)用程序105定義(組件400、402、404、406的定義)和映射302描述信息是否正確。然后,應(yīng)用程序生成器622產(chǎn)生XML代碼,包括和/或增補(bǔ)工作流組件406的腳本、和基于保存在設(shè)計(jì)時(shí)數(shù)據(jù)模型608中的關(guān)系的映射302文件描述符。應(yīng)用程序生成器622使用本地化服務(wù)624產(chǎn)生語(yǔ)言資源束306,例如,通過(guò)資源束接口(未示出)。通過(guò)開(kāi)發(fā)者使用工具116的UI 202訪問(wèn)的生成應(yīng)用程序接口(即通過(guò)用戶輸入事件,如鼠標(biāo)點(diǎn)擊和/或按鍵)來(lái)啟動(dòng)應(yīng)用程序生成器622生成處理。應(yīng)當(dāng)意識(shí)到,可以將生成器622配置為模塊集合,例如但不局限于用于產(chǎn)生XML 301(可以包括關(guān)聯(lián)腳本)的代碼模塊和用于產(chǎn)生映射302描述符的映射模塊。
參考圖6和10,示出了生成針對(duì)應(yīng)用程序105的應(yīng)用程序人造產(chǎn)物301的序列1000,包括生成映射302文件。在步驟1001,由生效器620執(zhí)行模型608的生效。在步驟1002,生成器622通過(guò)從模型608中獲得1003組件400、402、404、406,并產(chǎn)生1004相應(yīng)的XML 300,生成應(yīng)用程序語(yǔ)言描述符(如XML)300(可以包括關(guān)聯(lián)腳本)。在步驟1005,生成器622通過(guò)從數(shù)據(jù)模型608獲得1006映射、然后生成1007后端映射描述符,生成后端映射302文件描述符。在步驟1008,本地化服務(wù)624準(zhǔn)備資源束306(和資源304),以添加到應(yīng)用程序105上,如以上參照?qǐng)D3所述。將所生成的應(yīng)用程序105的人造產(chǎn)物310存儲(chǔ)在存儲(chǔ)器210中。
再次參考圖2和6,工具116可以是運(yùn)行在單一桌面計(jì)算機(jī)210上的工具。工具116提供了主要的開(kāi)發(fā)能力,封裝了針對(duì)應(yīng)用程序105開(kāi)發(fā)的開(kāi)發(fā)、預(yù)覽、生效和生成功能。但是,應(yīng)當(dāng)意識(shí)到,可以將構(gòu)建服務(wù)626和/或安全服務(wù)632打包成分離的實(shí)體,以允許“本土”開(kāi)發(fā)者手動(dòng)且與工具116的其他應(yīng)用程序開(kāi)發(fā)分離地創(chuàng)建應(yīng)用程序,而仍然利用可展開(kāi)應(yīng)用程序105包(例如,jar)的準(zhǔn)備和安全方案。還應(yīng)當(dāng)意識(shí)到,也可以單獨(dú)打包展開(kāi)服務(wù)628,以允許“本土”開(kāi)發(fā)者生成和展開(kāi)適當(dāng)?shù)膽?yīng)用程序描述符文件。因此,工具116可以使用外部構(gòu)建626和展開(kāi)628服務(wù)工具、內(nèi)部構(gòu)建626和展開(kāi)服務(wù)(如圖6所示)或其配置,如本領(lǐng)域普通技術(shù)人員顯而易見(jiàn)的那樣。
參考圖3和6,構(gòu)建服務(wù)626提供用于構(gòu)建應(yīng)用程序105的可擴(kuò)展形式的接口,并負(fù)責(zé)(例如但不局限于)產(chǎn)生顯性文件(manifestfile),和產(chǎn)生可展開(kāi)應(yīng)用程序105 jar文件。構(gòu)建服務(wù)626使用可用的應(yīng)用程序XML 300(可以包括關(guān)聯(lián)腳本)、映射描述符文件302和資源束306(和資源304),如上所述。可以通過(guò)工具116應(yīng)用程序生成器622或在本土開(kāi)發(fā)方案的情況下手動(dòng)地使用外部構(gòu)建服務(wù)626來(lái)實(shí)現(xiàn)這些應(yīng)用程序105的可用性。安全服務(wù)632用于簽署包含與應(yīng)用程序105有關(guān)的特有信息的顯性文件。最后,構(gòu)建服務(wù)626產(chǎn)生可展開(kāi)應(yīng)用程序105 jar單元,包括所有人造產(chǎn)物和已簽署顯性文件。如上所述,可以將構(gòu)建服務(wù)626打包成與工具116分離的工具,并由工具116使用,以便進(jìn)行可展開(kāi)應(yīng)用程序jar文件的打包。
參照?qǐng)D6和11,示出了運(yùn)行構(gòu)建服務(wù)626以產(chǎn)生可展開(kāi)應(yīng)用程序105(例如,作為應(yīng)用程序jar文件)的序列1100。在步驟1101,一旦應(yīng)用程序生成器622已經(jīng)產(chǎn)生了應(yīng)用程序元素/人造產(chǎn)物301(參見(jiàn)圖3),開(kāi)發(fā)者內(nèi)部或外部發(fā)起構(gòu)建服務(wù)626(在工具116的內(nèi)部或作為分離工具)。在步驟1102,服務(wù)626檢索可用映射302文件描述符,以及在步驟1103,檢索可用應(yīng)用程序XML 300(可以包括關(guān)聯(lián)腳本)。在步驟1104,服務(wù)626檢索資源304、306,然后產(chǎn)生1105顯性文件。在步驟1106,簽署顯性文件,然后生成1107應(yīng)用程序jar文件。然后,使可展開(kāi)應(yīng)用程序105可用(例如存儲(chǔ)在存儲(chǔ)器210中),以便由展開(kāi)服務(wù)628最終展開(kāi)。
參考圖6,安全服務(wù)532用于以根據(jù)jar文件內(nèi)容產(chǎn)生的摘要來(lái)簽署顯性jar,并且具有兩個(gè)主要的職責(zé)。第一個(gè)也是最重要的,安全服務(wù)可以用于產(chǎn)生可以包括在每個(gè)應(yīng)用程序105 jar文件中的IDE(集成設(shè)計(jì)環(huán)境)標(biāo)記。其次,安全服務(wù)632可以提供初始化工具116的安全基礎(chǔ)設(shè)施的手段。構(gòu)建服務(wù)626在構(gòu)建時(shí)與安全服務(wù)632進(jìn)行交互,以產(chǎn)生可以作為每個(gè)可展開(kāi)應(yīng)用程序105 jar顯性文件的一部分的IDE標(biāo)記。安全服務(wù)632也可以與構(gòu)建配置元素(未示出-可以在服務(wù)632的外部)進(jìn)行交互,用于允許安全服務(wù)的配置,例如但不局限于已簽署證書(shū)的初始建立;產(chǎn)生新的密鑰;產(chǎn)生密鑰請(qǐng)求;以及安裝已簽署的證書(shū),如本領(lǐng)域所公知。
再次參考圖6,展開(kāi)服務(wù)628與UDDI倉(cāng)庫(kù)114相連,以安裝/公布所產(chǎn)生的應(yīng)用程序描述符文件,并且可以負(fù)責(zé)產(chǎn)生應(yīng)用程序105的展開(kāi)描述符。展開(kāi)服務(wù)628在展開(kāi)時(shí)使用可用的應(yīng)用程序105 jar文件。盡管展開(kāi)服務(wù)628并不安裝應(yīng)用程序105 jar文件,但服務(wù)628內(nèi)部檢查(introspect)jar文件,以確定支持何種語(yǔ)言(例如,在資源束306中顯示)。可以將此信息添加到描述符文件中。
參考圖6和12,示出了將應(yīng)用程序105展開(kāi)到UDDI(例如)倉(cāng)庫(kù)114中的序列1200。在步驟1201,開(kāi)發(fā)者內(nèi)部或外部發(fā)起展開(kāi)服務(wù)628(在工具116的內(nèi)部或作為分離工具)。在步驟1202,服務(wù)628檢索可用應(yīng)用程序jar。在步驟1203,服務(wù)628生成應(yīng)用程序105的展開(kāi)描述符,以及在步驟1204,通過(guò)倉(cāng)庫(kù)114的發(fā)現(xiàn)服務(wù)634進(jìn)行展開(kāi)描述符的公布。
參考圖7,示出了編輯器600在Eclipse插件中的分布(僅作為示例)。工具編輯器600廣義上分為兩個(gè)類別,例如但不局限于文本編輯器700,實(shí)現(xiàn)標(biāo)準(zhǔn)的基于線段的編輯功能;以及圖形編輯框架(GEF)編輯器701,提供用于繪制對(duì)象的編輯空間。在工具116的上下文中,GEF編輯器701可以包含調(diào)色板和畫(huà)布,如本領(lǐng)域所公知。用戶可以將調(diào)色板中的節(jié)點(diǎn)(實(shí)體)放置到畫(huà)布上,并添加其間的連接(關(guān)系),從而定義組件400、402、404、406參見(jiàn)圖4)的XML編碼的內(nèi)容和相互關(guān)系。應(yīng)當(dāng)意識(shí)到,編輯器600和查看器602用于創(chuàng)建和修改包含在組件400、402、404、406中的定義,以及用于創(chuàng)建和修改組件之間的定義的互相關(guān)性(例如,數(shù)據(jù)-數(shù)據(jù)、數(shù)據(jù)-屏幕、消息-數(shù)據(jù)、屏幕-數(shù)據(jù)、數(shù)據(jù)-消息),如稍后所述。應(yīng)當(dāng)意識(shí)到,根據(jù)需要,查看器602和編輯器600可以是基于文本和/或基于圖形的模塊601的任意組合。
編輯器600為了使編輯器600和數(shù)據(jù)模型608解耦合,編輯器600并不直接知道數(shù)據(jù)模型608。編輯器600依賴于(Eclipse的)UI提供商接口來(lái)獲得繪制正在編輯的對(duì)象所需的信息。可以用實(shí)現(xiàn)了UI提供商接口的EMF核心對(duì)象來(lái)配置編輯器600,例如在使用Eclipse平臺(tái)時(shí),例如,ContentProvider、LabelProvider。EMF提供商對(duì)象通過(guò)委托(delegating)知道如何訪問(wèn)數(shù)據(jù)模塊608的已生成適配器(項(xiàng)目提供商)來(lái)適配UI調(diào)用。
通常,編輯器600創(chuàng)建改變模型608的命令,從而可以通過(guò)取消API(未示出)來(lái)取消改變。這些改變可以由針對(duì)正在進(jìn)行的開(kāi)發(fā)任務(wù)的適當(dāng)向?qū)?lái)輔助??梢杂帽环Q為編輯域的、保持命令堆棧的EMF核心對(duì)象來(lái)配置編輯器600。編輯域使用適配器工廠來(lái)找出能夠創(chuàng)建該命令的適配器。所產(chǎn)生的適配器類(項(xiàng)目提供商)創(chuàng)建命令。編輯器600通過(guò)使用命令堆棧來(lái)執(zhí)行命令。此外,使用Eclipse框架作為示例,EMF模型608是變化通知器。因?yàn)轫?xiàng)目提供商是通知觀察器,在數(shù)據(jù)模型608改變時(shí),通知項(xiàng)目提供商。項(xiàng)目提供商之后通知提供商。提供商告知編輯器600和屬性頁(yè),以便在變化通知之后進(jìn)行刷新。
腳本編輯器706腳本編輯器706是受限文本編輯器,用于編寫(xiě)應(yīng)用程序105組件的命令(如JavaScript),例如但不局限于工作流組件406-參見(jiàn)圖4。開(kāi)發(fā)者域編輯器706之間的交互可以由腳本模式652(參見(jiàn)圖13)輔助或者由其驅(qū)動(dòng),腳本模式652可以包括模式652(例如但不局限于)消息定向652a、控制條件652b和消息接收652c,稍后將進(jìn)行描述。在用戶不能在組件應(yīng)用程序105中進(jìn)行定義的情況下,可以限制如創(chuàng)建函數(shù)等一些語(yǔ)法??梢杂赡_本編輯器706編輯的示例命令可以包括以下命令(例如但不局限于)SaveScript,在用戶保存應(yīng)用程序105的腳本時(shí)使用。如果成功,SaveScript可以觸發(fā)數(shù)據(jù)模型608命令NavigationChanged、LocalizedStringChanged和ExitCodeChanged。腳本編輯器706的示例輸入事件可以包括以下事件(例如但不局限于)ComponentRemoved,由此如果移除的組件(400、402、404、406)影響了腳本的輸入?yún)?shù)或由腳本使用的全局變量,腳本編輯器706提示工具116的用戶修改后的腳本無(wú)效;以及ComponentRenamed,與ComponentRemoved相同。腳本編輯器706的示例接口通過(guò)實(shí)現(xiàn)org.eclipse.ui.editors.texteditors層次的子類,擴(kuò)展了Eclipse框架的org.eclipse.ui.editors擴(kuò)展點(diǎn)。工具116與組件(例如工作流406)中腳本的創(chuàng)建和/或修改進(jìn)行合作,以及與影響到應(yīng)用程序105的其他關(guān)聯(lián)組件的已創(chuàng)建/已修改腳本的相互關(guān)系進(jìn)行合作。
屏幕編輯器708屏幕編輯器708負(fù)責(zé)幫助工具116的用戶定義和布局與設(shè)備100上的數(shù)據(jù)的顯示相關(guān)聯(lián)的應(yīng)用程序105的屏幕組件402中的結(jié)構(gòu)化定義語(yǔ)言代碼(如XML)。開(kāi)發(fā)者與編輯器708之間的交互可以由屏幕模式656(參見(jiàn)圖13)來(lái)輔助,或由其驅(qū)動(dòng),屏幕模式656可以包括模式656(例如但不局限于)幻燈片放映656a、表格656b、訪問(wèn)設(shè)備數(shù)據(jù)656c、條件屏幕控制656b和數(shù)據(jù)表656e,稍后將進(jìn)行描述??梢詫⒁ㄔ谄聊唤M件402中的UI控制放置在顯示器206(參見(jiàn)圖2)的編輯器部分232中的表格畫(huà)布(未示出)上。屏幕編輯器708還可以編輯包括事件句柄的控制屬性。
可以由屏幕編輯器708編輯的示例命令可以包括以下命令(例如但不局限于)ButtonChange,在開(kāi)發(fā)者改變按鈕控制時(shí),(向數(shù)據(jù)模型608)發(fā)送此命令,如果成功,此命令將觸發(fā)數(shù)據(jù)模型608的NavigationControlChange;MenuItemChange,在開(kāi)發(fā)者改變菜單項(xiàng)時(shí),發(fā)送此命令,如果成功,此命令將觸發(fā)數(shù)據(jù)模型608的NavigationControlChanged;ChangeScript,在開(kāi)發(fā)者改變菜單項(xiàng)時(shí),發(fā)送此命令,如果成功,此命令將觸發(fā)數(shù)據(jù)模型608的NavigationControlChanged;QueryMessages,在開(kāi)發(fā)者需要應(yīng)用程序105的屏幕可以發(fā)送或刷新的可用消息的列表時(shí),發(fā)送此命令,并返回可用消息的列表;QueryData,在開(kāi)發(fā)者需要綁定控制的可用數(shù)據(jù)對(duì)象的列表時(shí),發(fā)送此命令,并返回可用數(shù)據(jù)的列表;NonNavigationControlChange,在修改了不影響導(dǎo)航(如標(biāo)簽、文本字段)的控制時(shí),發(fā)送此命令;以及DataBindingChange,在改變數(shù)據(jù)綁定時(shí),發(fā)送此命令,如果成功,此命令將觸發(fā)數(shù)據(jù)模型608的DataBindingChanged和ScreenParameterListChanged。屏幕編輯器708的示例輸入事件可以包括以下事件(例如但不局限于)ComponentRemoved,由此屏幕開(kāi)發(fā)者(工具116的用戶)可以檢查組件是否是消息,以及關(guān)聯(lián)屏幕組件402是否正用于導(dǎo)航,屏幕組件402所具有的數(shù)據(jù)對(duì)象是否對(duì)綁定或處理屏幕組件402的屏幕事件的腳本(例如,工作流組件406)進(jìn)行控制;ComponentRenamed,與ComponentRemoved相同;ScreenParameterListChanged修改屏幕組件402,例如,如果正在使用的參數(shù)被改變,屏幕組件402必須調(diào)整參數(shù)或警告開(kāi)發(fā)者那些相關(guān)性將不再有效且必須改變;MessageFieldChanged,由此屏幕開(kāi)發(fā)者檢查所述字段是否正在被屏幕組件402所使用;以及DataFieldChanged,由此屏幕開(kāi)發(fā)者檢查是否有任何控制與已經(jīng)被改變的字段綁定,并適當(dāng)?shù)赝ㄖ_(kāi)發(fā)者。
屏幕編輯器708的示例接口使用GEF圖形編輯器和/或VE編輯器,擴(kuò)展了Eclipse框架的org.eclipse.ui.editors。工具116協(xié)調(diào)組件(例如屏幕402)中屏幕定義的創(chuàng)建和/或修改,以及協(xié)調(diào)影響到應(yīng)用程序105的其他關(guān)聯(lián)組件的已創(chuàng)建/已修改屏幕定義(以及關(guān)聯(lián)數(shù)據(jù)定義)的相互關(guān)系。
數(shù)據(jù)編輯器710數(shù)據(jù)編輯器710負(fù)責(zé)通過(guò)向開(kāi)發(fā)者提供編輯數(shù)據(jù)組件400字段和屬性的能力,幫助工具116的用戶創(chuàng)建和修改應(yīng)用程序105的數(shù)據(jù)組件400(以及可能的屏幕402和消息404組件)中的結(jié)構(gòu)化定義語(yǔ)言代碼(如XML)。開(kāi)發(fā)者與編輯器710之間的交互可以由模式684(參見(jiàn)圖13)來(lái)輔助,或由其驅(qū)動(dòng),模式684包括數(shù)據(jù)組件400方案,稍后將進(jìn)行描述。通過(guò)取現(xiàn)有數(shù)據(jù)的對(duì)象的原型或根據(jù)對(duì)消息組件404中的消息對(duì)象的數(shù)據(jù)定義映射,通過(guò)刮擦(scratch)來(lái)創(chuàng)建新數(shù)據(jù)對(duì)象。
可以由數(shù)據(jù)編輯器710編輯的示例命令可以包括以下命令(例如但不局限于)AddRemoveFields,在開(kāi)發(fā)者在數(shù)據(jù)對(duì)象定義中添加或移除字段時(shí),發(fā)送此命令,如果成功,此命令將觸發(fā)數(shù)據(jù)模型608的DataFieldChanged;LinkToExternalData,在開(kāi)發(fā)者將數(shù)據(jù)對(duì)象定義鏈接到(應(yīng)用程序105)外部的數(shù)據(jù)對(duì)象時(shí),發(fā)送此命令,所述外部數(shù)據(jù)對(duì)象例如但不局限于日歷或聯(lián)系數(shù)據(jù)對(duì)象,如果成功,此命令將觸發(fā)數(shù)據(jù)模型608的DataFieldChanged。
數(shù)據(jù)編輯器710的示例輸入事件可以包括以下事件(例如但不局限于)ComponentRemoved,由此屏幕開(kāi)發(fā)者(工具116的用戶)可以檢查所移除的組件是否通過(guò)原型或包含與消息相關(guān),然后開(kāi)發(fā)者可以調(diào)整包含在受到影響的數(shù)據(jù)對(duì)象中的字段;以及ComponentRenamed,與ComponentRemoved相同。
屏幕編輯器708的示例接口使用GEF圖形編輯器,擴(kuò)展了org.eclipse.ui.editors。工具116協(xié)調(diào)組件(例如數(shù)據(jù)400)中數(shù)據(jù)定義的創(chuàng)建和/或修改,以及協(xié)調(diào)影響到應(yīng)用程序105的其他關(guān)聯(lián)組件的已創(chuàng)建/已修改數(shù)據(jù)定義(以及關(guān)聯(lián)屏幕/消息定義)的相互關(guān)系。
消息編輯器712消息編輯器712負(fù)責(zé)幫助工具116的用戶創(chuàng)建和修改應(yīng)用程序105的消息組件404中的結(jié)構(gòu)化定義語(yǔ)言代碼(如XML)。開(kāi)發(fā)者與編輯器712之間的交互可以由屏幕模式658(參見(jiàn)圖13)來(lái)輔助,或由其驅(qū)動(dòng),屏幕模式658可以包括模式658(例如但不局限于)消息內(nèi)容目標(biāo)658a和通知構(gòu)建器658b,稍后將進(jìn)行描述。消息設(shè)計(jì)器向開(kāi)發(fā)者提供對(duì)組件消息(要發(fā)送給和來(lái)自后端數(shù)據(jù)源106(與設(shè)備100有關(guān)))的創(chuàng)建和編輯。這些消息可以包括請(qǐng)求/響應(yīng)對(duì),以及訂閱/通知/退訂通知消息??梢酝ㄟ^(guò)取現(xiàn)有消息的原型或通過(guò)根據(jù)數(shù)據(jù)源106(如WSDL和JDBC/SQL)的后端服務(wù)進(jìn)行模板化,來(lái)創(chuàng)建消息定義。
可以由消息編輯器712編輯的示例命令可以包括以下命令(例如但不局限于)AddRemoveFields,在開(kāi)發(fā)者在消息組件404中的消息中添加或移除字段時(shí),發(fā)送此命令。消息編輯器712的示例輸入事件可以包括以下事件(例如但不局限于)ComponentRemoved,由此屏幕開(kāi)發(fā)者(工具116的用戶)可以檢查此消息定義原型或所包含的消息是否已經(jīng)被移除,然后必須更新視圖;ComponentRenamed,與ComponentRemoved相同;以及FieldMappingChanged,由此屏幕開(kāi)發(fā)者(工具116的用戶)檢查字段映射是否影響正在被編輯的消息定義,然后消息開(kāi)發(fā)者檢查映射的改變是否已經(jīng)添加/移除/重命名任何消息字段。
屏幕編輯器708的示例接口使用GEF圖形編輯器,擴(kuò)展了org.eclipse.ui.editors。工具116協(xié)調(diào)組件(例如消息404)中消息定義的創(chuàng)建和/或修改,以及影響到應(yīng)用程序105的其他關(guān)聯(lián)組件的已創(chuàng)建/已修改消息的相互關(guān)系。
工作流編輯器702工作流編輯器702負(fù)責(zé)幫助工具116的用戶創(chuàng)建和修改應(yīng)用程序105的工作流組件406中的命令代碼(如ECMA腳本)。開(kāi)發(fā)者與編輯器702之間的交互可以由模式648(參見(jiàn)圖13)來(lái)輔助,或由其驅(qū)動(dòng),模式648與應(yīng)用程序工作流配置相關(guān)聯(lián),稍后將進(jìn)行描述。工作流編輯器702定義形成了組件應(yīng)用程序105的可視部分的核心的屏幕到屏幕過(guò)渡??梢暤乩L制屏幕和由于用戶/腳本事件所引起的屏幕之間的過(guò)渡。
可以由工作流編輯器702編輯的示例命令可以包括以下命令(例如但不局限于)QueryScreens,在開(kāi)發(fā)者需要從中選擇屏幕的屏幕列表時(shí)(例如,在向工作流中添加新屏幕時(shí)),發(fā)送此命令;QueryScripts,在開(kāi)發(fā)者需要腳本列表以調(diào)用屏幕導(dǎo)航事件時(shí),發(fā)送此命令;QueryArrivingMessages,在開(kāi)發(fā)者需要協(xié)調(diào)屏幕過(guò)渡的響應(yīng)消息列表(包括通知)時(shí),發(fā)送此命令;AddComponent,在開(kāi)發(fā)者需要向工作流中添加工作流中并不存在的新屏幕、消息或腳本時(shí),發(fā)送此命令,如果成功,此命令將觸發(fā)數(shù)據(jù)模型608的ComponentAdded;以及ChangeNavigation,在開(kāi)發(fā)者需要向工作流中添加新導(dǎo)航時(shí),發(fā)送此命令,如果成功,此命令將觸發(fā)數(shù)據(jù)模型608的NavigationChanged。
工作流編輯器702的示例輸入事件可以包括以下事件(例如但不局限于)ComponentRemoved,由此工組流開(kāi)發(fā)者(工具116的用戶)可以檢查組件是否是工作流對(duì)象(屏幕、腳本、到達(dá)消息),然后,工作流通過(guò)刪除與此對(duì)象定義之間的所有關(guān)系來(lái)更新其自身;ComponentRenamed,由此工組流開(kāi)發(fā)者(工具116的用戶)可以檢查組件是否是工作流對(duì)象,然后,工作流以組件的新名稱更新其視覺(jué);NavigationControlChanged,由此工作流開(kāi)發(fā)者(工具116的用戶)檢查工作流是否必須根據(jù)控制概率來(lái)改變其導(dǎo)航視圖,例如,如果已經(jīng)在工作流中的屏幕商添加了按鈕,則更新視圖,以便在屏幕商示出新導(dǎo)航節(jié)點(diǎn)可用;ScreenParameterListChanged,由此工作流開(kāi)發(fā)者(工具116的用戶)檢查屏幕參數(shù)列表是否已經(jīng)改變,以及屏幕是否在工作流中,然后開(kāi)發(fā)者更新屏幕中所涉及的任何導(dǎo)航的視圖;NavigationChanged,由此工作流開(kāi)發(fā)者(工具116的用戶)檢查是否發(fā)生了可能的導(dǎo)航改變,開(kāi)發(fā)者找出并解析此改變,并對(duì)視圖進(jìn)行必要的更新;以及ExitCodeChanged,由此工作流開(kāi)發(fā)者(工具116的用戶)檢查是否增加/移除了退出點(diǎn),然后更新編輯器視圖,以可視地反映。工作流編輯器702的示例接口使用GEF圖形編輯器,擴(kuò)展了org.eclipse.ui.editors。
消息-數(shù)據(jù)關(guān)系編輯器704消息編輯器704負(fù)責(zé)幫助工具116的用戶創(chuàng)建和修改應(yīng)用程序105的互相關(guān)消息404和數(shù)據(jù)400組件中的結(jié)構(gòu)化定義語(yǔ)言代碼(如XML)。開(kāi)發(fā)者與編輯器712之間的交互可以由模式648(參見(jiàn)圖13)來(lái)輔助,或由其驅(qū)動(dòng),模式648與消息-數(shù)據(jù)關(guān)系配置相關(guān)聯(lián),稍后將進(jìn)行描述。消息/數(shù)據(jù)關(guān)系編輯器704創(chuàng)建和編輯消息組件404和數(shù)據(jù)組件400之間的關(guān)系。這些映射影響到在運(yùn)行應(yīng)用程序105時(shí)如何將數(shù)據(jù)組件400組裝成到達(dá)設(shè)備100的消息。例如,數(shù)據(jù)400和消息404組件之間共有的數(shù)據(jù)對(duì)象定義可以使數(shù)據(jù)對(duì)象駐留在數(shù)據(jù)組件400中,而只有將消息組件404與數(shù)據(jù)組件400中的數(shù)據(jù)對(duì)象定義進(jìn)行鏈接的數(shù)據(jù)映射定義(聲明了何處可以找到數(shù)據(jù)對(duì)象定義)駐留在消息組件404中,反之亦然。針對(duì)屏幕402和數(shù)據(jù)400組件之間共有的數(shù)據(jù)對(duì)象定義,可以采用類似的配置,由此數(shù)據(jù)對(duì)象定義駐留在一個(gè)組件中,而數(shù)據(jù)映射定義駐留在另一關(guān)聯(lián)組件中,稍后將參照屏幕-數(shù)據(jù)關(guān)系查看器804(參見(jiàn)圖8)對(duì)其進(jìn)行描述。
可以由編輯器704編輯的示例命令可以包括以下命令(例如但不局限于)AddComponent,在用戶向關(guān)系圖中添加新的數(shù)據(jù)或消息時(shí)(同樣具有向正在開(kāi)發(fā)的應(yīng)用程序105中添加組件的效果),發(fā)送此命令,如果成功,此命令將觸發(fā)數(shù)據(jù)模型608的ComponentAdded;QueryMessages,在開(kāi)發(fā)者需要消息列表以進(jìn)行映射時(shí),發(fā)送此命令;QueryData,在開(kāi)發(fā)者需要數(shù)據(jù)列表以進(jìn)行映射時(shí),發(fā)送此命令;ChangeMessageLevelMapping,在開(kāi)發(fā)者改變消息級(jí)映射時(shí),發(fā)送此命令,如果成功,此命令將觸發(fā)數(shù)據(jù)模型608的FieldMappingChanged;ChangeFieldLevelMapping,在開(kāi)發(fā)者改變字段級(jí)映射時(shí),發(fā)送此命令,如果成功,此命令將觸發(fā)數(shù)據(jù)模型608的FieldMappingChanged;ChangePrototype,在開(kāi)發(fā)者改變(添加/移除)數(shù)據(jù)對(duì)象之間的原型關(guān)系時(shí),發(fā)送此命令,如果成功,此命令將觸發(fā)數(shù)據(jù)模型608的FieldMappingChanged;以及ChangeContainment,在開(kāi)發(fā)者改變數(shù)據(jù)對(duì)象之間的包含關(guān)系時(shí),發(fā)送此命令,如果成功,此命令將觸發(fā)數(shù)據(jù)模型608的MessageContainmentChanged。
編輯器704的示例輸入事件可以包括以下事件(例如但不局限于)ComponentRemoved,由此開(kāi)發(fā)者(工具116的用戶)檢查移除的對(duì)象是否是消息或數(shù)據(jù),關(guān)系映射器刪除涉及移除對(duì)象的任何關(guān)系;ComponentRenamed,由此開(kāi)發(fā)者(工具116的用戶)檢查任何映射關(guān)系中是否設(shè)計(jì)重命名的對(duì)象,以新名稱更新映射對(duì)象的可視呈現(xiàn);MessageFieldChanged,由此開(kāi)發(fā)者(工具116的用戶)檢查所述消息是否出現(xiàn)在關(guān)系編輯器中,然后在消息的可視呈現(xiàn)中反映字段變化,如果映射中涉及所述字段,則反映出所述變化,并且需要向開(kāi)發(fā)者警告破裂的映射(例如,如果字段已經(jīng)被移除);以及DataFieldChanged,與MessageFieldChanged相同,除了以數(shù)據(jù)代替消息以外。
編輯器704的示例接口使用GEF圖形編輯器,擴(kuò)展了org.eclipse.ui.editors。工具116協(xié)調(diào)組件(例如消息/數(shù)據(jù)404/400)中消息/數(shù)據(jù)定義的創(chuàng)建和/或修改,以及協(xié)調(diào)影響到應(yīng)用程序105的其他關(guān)聯(lián)組件的已創(chuàng)建/已修改消息/數(shù)據(jù)定義的相互關(guān)系。
本地化編輯器714本地化編輯器714向開(kāi)發(fā)者提供收集應(yīng)用程序105端用戶(設(shè)備100的端用戶)可見(jiàn)的所有串,并在同一場(chǎng)所對(duì)其進(jìn)行編輯。編輯器714還向開(kāi)發(fā)者提供將針對(duì)每個(gè)串的多資源映射創(chuàng)建為不同的語(yǔ)言。可以由編輯器714編輯的示例命令可以包括以下命令(例如但不局限于)ChangeLocalizeString,在開(kāi)發(fā)者添加、刪除或修改本地化串時(shí),發(fā)送此命令。編輯器704的示例輸入事件可以包括以下事件(例如但不局限于)LocalizedStringChanged,用于確定在腳本編輯器中何時(shí)改變了文字串或者在屏幕編輯器708中何時(shí)改變了標(biāo)簽。本地化編輯器714可以通過(guò)擴(kuò)展編輯器部分來(lái)擴(kuò)展org.eclipse.ui.editors。
后端可視化編輯器716后端可視化器716向開(kāi)發(fā)者示出了消息組件404與驅(qū)動(dòng)組件404的后端數(shù)據(jù)源106(網(wǎng)絡(luò)服務(wù)、SQL等-參見(jiàn)圖1)之間的關(guān)系。開(kāi)發(fā)者與編輯器716之間的交互可以由模式648(參見(jiàn)圖13)來(lái)輔助,或由其驅(qū)動(dòng),模式648與設(shè)備運(yùn)行時(shí)環(huán)境RE(參見(jiàn)圖1)和后端數(shù)據(jù)源106之間的消息和/或數(shù)據(jù)關(guān)系配置相關(guān)聯(lián),稍后將進(jìn)行描述。編輯器716還向開(kāi)發(fā)者提供向有正在開(kāi)發(fā)的應(yīng)用程序105支持的源列表中添加新源106。除了與設(shè)計(jì)時(shí)數(shù)據(jù)模型608進(jìn)行交互以外,如針對(duì)使用所接收到的命令和事件的其他模塊601所描述的那樣,后端可視化編輯器716與后端連接器616(參見(jiàn)圖6)進(jìn)行合作。后端連接器616為可視化器提供從已知服務(wù)類型(例如網(wǎng)絡(luò)服務(wù)、SQL數(shù)據(jù)庫(kù))的注冊(cè)表請(qǐng)求ServicesInterface。返回此類型服務(wù)的列表,并且可以按照名稱或迭代(iteration)進(jìn)行查詢。
可以由編輯器716編輯的示例命令可以包括以下命令(例如但不局限于)AddComponent,在開(kāi)發(fā)者添加新消息時(shí),發(fā)送此命令,如果成功,此命令將觸發(fā)數(shù)據(jù)模型608的ComponentAdded;以及SpecifyMapping,在開(kāi)發(fā)者將消息與選定后端數(shù)據(jù)源106相連時(shí),發(fā)送此消息。編輯器716的示例輸入事件可以包括以下事件(例如但不局限于)ComponentRemoved,由此開(kāi)發(fā)者(工具116的用戶)檢查組件是否為消息,后端可視化器調(diào)整器針對(duì)該消息的映射;ComponentRenamed,與ComponentRemoved相同;以及MessageFieldChanged,由此開(kāi)發(fā)者(工具116的用戶)使與后端上所存在的消息字段不同的消息字段生效,并可視地通知任何破裂映射。可以通過(guò)對(duì)服務(wù)層的直接調(diào)用來(lái)訪問(wèn)后端數(shù)據(jù)源106??蛇x地,后臺(tái)處理可以用于保持網(wǎng)絡(luò)處理不會(huì)阻礙UI線程。編輯器716可以使用GEF圖形編輯器來(lái)擴(kuò)展org.eclipse.ui.editors。
查看器602參考圖6和8,查看器602是在開(kāi)發(fā)者做出改動(dòng)之后立即將改動(dòng)提交給數(shù)據(jù)模型608的模塊601。參考圖8,示出了查看器在Eclipse插件中的分布(僅作為示例)。工具查看器602廣義上分為兩個(gè)類別,例如但不局限于資源查看器810和圖形編輯框架(GEF)查看器808,提供用于查看對(duì)象的編輯空間。用戶可以查看其間的節(jié)點(diǎn)(實(shí)體)和連接(關(guān)系),從而定義例如組件400、402、404、406(參見(jiàn)圖4)的XML編碼的內(nèi)容和相互關(guān)系。應(yīng)當(dāng)意識(shí)到,使用查看器602來(lái)創(chuàng)建和修改包含在組件400、402、404、406中的定義,以及創(chuàng)建和修改組件之間的定義的互相關(guān)性(例如,數(shù)據(jù)-數(shù)據(jù)、數(shù)據(jù)-屏幕、消息-數(shù)據(jù)、屏幕-數(shù)據(jù)、數(shù)據(jù)-消息),稍后將進(jìn)行描述。Eclipse查看器是在開(kāi)發(fā)者做出改動(dòng)之后立即將改動(dòng)提交給數(shù)據(jù)模型608的模塊601。查看器602包括導(dǎo)航器802,示出了以樹(shù)視圖(例如)實(shí)現(xiàn)的、應(yīng)用程序105項(xiàng)目在顯示器206(參見(jiàn)圖2)的工作空間中的分層視圖;測(cè)試/預(yù)覽查看器806,仿真應(yīng)用程序105的運(yùn)行時(shí)行為;以及屏幕-數(shù)據(jù)關(guān)系查看器804,可以是屏幕402與綁定到相應(yīng)屏幕上的數(shù)據(jù)400組件之間的關(guān)系的只讀視圖。每個(gè)查看器602可以創(chuàng)建位于org.eclipse.ui.views的擴(kuò)展點(diǎn),并且通常通過(guò)所選的缺省超類可以實(shí)現(xiàn)Eclipse平臺(tái)的IViewPart接口。
導(dǎo)航器查看器802導(dǎo)航器802向開(kāi)發(fā)者提供了顯示器206的工作空間中的所有項(xiàng)目應(yīng)用程序105、文件夾和文件的層級(jí)樹(shù)視圖(例如)。開(kāi)發(fā)者可以從瀏覽器802中瀏覽和操縱與所選應(yīng)用程序105項(xiàng)目相關(guān)聯(lián)的項(xiàng)目定義。
查看器802的示例命令可以包括以下命令(例如但不局限于)AddComponent,當(dāng)通過(guò)導(dǎo)航器上下文菜單(未示出)向應(yīng)用程序105項(xiàng)目添加新組件時(shí),發(fā)送此命令,如果成功,此命令將觸發(fā)數(shù)據(jù)模型608的ComponentAdded;RemoveComponent,在通過(guò)從導(dǎo)航器上下文菜單中刪除而去除組件時(shí),發(fā)送此命令,如果成功,此命令將觸發(fā)數(shù)據(jù)模型608的ComponentRemoved;以及RenameComponent,當(dāng)通過(guò)在導(dǎo)航器中選中而重命名組件時(shí),發(fā)送此命令,如果成功,此命令將觸發(fā)數(shù)據(jù)模型608的ComponentRenamed。
查看器802的示例輸入事件可以包括以下事件(例如但不局限于)ComponentAdded,在添加組件時(shí),導(dǎo)航器802刷新項(xiàng)目應(yīng)用程序105的視圖;以及ComponentRenamed,與ComponentAdded相同。例如,針對(duì)Eclipse框架,導(dǎo)航器查看器802的示例接口在于查看器802通過(guò)將org.eclipse.ui.views.navigator.ResourceNavigator作為子類來(lái)擴(kuò)展org.eclipse.ui.views擴(kuò)展名。
屏幕數(shù)據(jù)關(guān)系查看器804屏幕/數(shù)據(jù)查看器804使開(kāi)發(fā)者能夠查看給定屏幕定義與綁定到其的數(shù)據(jù)定義之間的關(guān)系。接口可以是只讀的,并且根據(jù)由相關(guān)聯(lián)的屏幕404和數(shù)據(jù)400組件所貢獻(xiàn)的設(shè)計(jì)時(shí)數(shù)據(jù)來(lái)構(gòu)建。對(duì)于只讀查看器804,查看器804不具有任何影響數(shù)據(jù)模型608的命令。查看器804的示例輸入事件可以包括例如但不限于如下事件ComponentRemoved,開(kāi)發(fā)者(工具116的用戶)用來(lái)檢查以確定所去除的組件是否是屏幕402或數(shù)據(jù)404組件,開(kāi)發(fā)者去除與所去除的組件之間的任何關(guān)系;DataBindingChanged,開(kāi)發(fā)者(工具116的用戶)用來(lái)檢查以確定組件是否是屏幕402或數(shù)據(jù)400組件,并且當(dāng)前在查看器804中是否打開(kāi),然后更新組件的名稱;以及ComponentRenamed,開(kāi)發(fā)者(工具116的用戶)用來(lái)檢查以確定Databinding是否涉及當(dāng)前打開(kāi)的屏幕402和/或數(shù)據(jù)400組件,然后在顯示器206的視圖中示出任何新的關(guān)系(見(jiàn)圖2)。查看器804可以利用GEF圖形編輯器擴(kuò)展org.eclipse.ui.editors,而不僅僅作為“只讀”編輯器視圖。
測(cè)試/預(yù)覽查看器806測(cè)試/預(yù)覽查看器806在設(shè)備100外部(在設(shè)計(jì)者的計(jì)算機(jī)201上——見(jiàn)圖2)模擬應(yīng)用程序105的運(yùn)行時(shí)行為。查看器806與如下各項(xiàng)進(jìn)行交互服務(wù)層614中為所模擬的設(shè)備100管理皮膚插件集合的皮膚管理器618(見(jiàn)圖6);對(duì)所模擬的應(yīng)用程序105的屬性和狀態(tài)進(jìn)行建模的運(yùn)行時(shí)數(shù)據(jù)模型610;以及為所模擬的應(yīng)用程序105提供元數(shù)據(jù)的設(shè)計(jì)時(shí)數(shù)據(jù)模型608(例如,屏幕上存在什么元素可視元素,以及它們將如何布局)。
參考圖1和9,示出了一種用于開(kāi)發(fā)應(yīng)用程序105的方法900,其中應(yīng)用程序105具有帶有以結(jié)構(gòu)化定義語(yǔ)言表達(dá)的描述符的組件400、402、404以及以指令序列表達(dá)的組件406。認(rèn)識(shí)到,各個(gè)組件400、402、404、406交互,以便處理通過(guò)網(wǎng)絡(luò)10從數(shù)據(jù)源106接收到的關(guān)于設(shè)備100的運(yùn)行時(shí)環(huán)境RE的消息。在構(gòu)建應(yīng)用程序105時(shí),通過(guò)與數(shù)據(jù)模型608交互來(lái)開(kāi)發(fā)902組件400、402、404的定義,其中模型608用于提供應(yīng)用程序的持久狀態(tài)。通過(guò)與數(shù)據(jù)模型608交互來(lái)開(kāi)發(fā)904第二組件的指令。獲得906為應(yīng)用程序105所選擇的數(shù)據(jù)源106的消息映射信息,用于幫助基于映射信息來(lái)生成定義。一旦完成,將組件400、402、404、406組裝908在應(yīng)用程序105中。
應(yīng)用程序開(kāi)發(fā)模式648推薦模式654參考圖13和14,工具116可以使用顯示器206(圖2)上出現(xiàn)的方法推薦模式(approach recommendation pattern)654作為向?qū)?04,以便引導(dǎo)開(kāi)發(fā)者確定哪一個(gè)可用開(kāi)發(fā)方法模式650最適于當(dāng)前的開(kāi)發(fā)活動(dòng)。如上所述,通過(guò)工具116的用戶接口202訪問(wèn)對(duì)話605,由此來(lái)引導(dǎo)向?qū)?04操作。例如,開(kāi)發(fā)者在開(kāi)發(fā)應(yīng)用程序105時(shí),會(huì)面對(duì)如何確定哪個(gè)方法模式650的初始問(wèn)題。參考圖14,開(kāi)發(fā)者通過(guò)考慮可能影響所選擇的模式650的某些問(wèn)題,開(kāi)始1402或者繼續(xù)現(xiàn)有應(yīng)用程序105項(xiàng)目,這些問(wèn)題例如但不限于對(duì)現(xiàn)有元素的框架的限制,這些元素例如在先應(yīng)用程序、當(dāng)前數(shù)據(jù)庫(kù)配置或這些元素的某些組合。開(kāi)發(fā)者然后回顧1404可能影響方法模式650選擇的設(shè)計(jì)參數(shù),可以包括的參數(shù)例如但不限于存在帶有由應(yīng)用程序105進(jìn)行模擬所需的良好理解的工作流和/或屏幕的現(xiàn)有應(yīng)用程序操作;可能存在將連接在后端上的特定數(shù)據(jù)源106,并且希望基于該特定數(shù)據(jù)源106模式來(lái)對(duì)應(yīng)用程序105建模;可能存在應(yīng)用程序應(yīng)該與之交互的現(xiàn)有web服務(wù)(數(shù)據(jù)源106),因此不應(yīng)對(duì)該web服務(wù)(數(shù)據(jù)源106)的行為做出改變;以及應(yīng)用程序105可能是web服務(wù)的簡(jiǎn)單測(cè)試,或者可能生成基于簡(jiǎn)單形式的接口。這些設(shè)計(jì)參數(shù)可以由模式654通過(guò)顯示器206按需向開(kāi)發(fā)者建議。
基于開(kāi)發(fā)方法模式650以哪個(gè)(哪些)組件400、402、404、406為中心的決定1404,推薦模式654可以自動(dòng)選擇1406(通過(guò)顯示器206傳送給開(kāi)發(fā)者)哪個(gè)模式,例如但不限于以消息組件404為中心的自下至上模式650a;以消息組件404為中心的懶人模式650b;以數(shù)據(jù)組件400為中心的數(shù)據(jù)驅(qū)動(dòng)方法650c;以及以數(shù)據(jù)組件400為中心的業(yè)務(wù)域模板模式650d,下面將進(jìn)一步描述。還應(yīng)認(rèn)識(shí)到,開(kāi)發(fā)者可以不使用推薦模式654,而是手動(dòng)選擇1406以哪個(gè)開(kāi)發(fā)方法模式650開(kāi)始。另外,認(rèn)識(shí)到,如果需要,其他開(kāi)發(fā)模式650可以是以屏幕組件402和/或工作流組件406為中心的。另外,認(rèn)識(shí)到,為了應(yīng)用程序開(kāi)發(fā)的目的,基于步驟1404,可能存在可以選擇多于一個(gè)組件400、402、404、406作為開(kāi)始點(diǎn)的情形。然而,在這種情形中,與所選擇的組件400、402、404、406之一相關(guān)聯(lián)的特定編輯器600或查看器602可以被選擇(手動(dòng)或自動(dòng))作為開(kāi)始開(kāi)發(fā)過(guò)程的模塊601。
再次參考圖14,如果在步驟1406中的模式650決定例如是存在可用的現(xiàn)有web服務(wù)(數(shù)據(jù)源106),并且應(yīng)用程序105被限制為采用相應(yīng)的web服務(wù)接口,那么在步驟1408中可以采取以消息組件404為中心的方法,稱作“自下至上方法”模式650a。這種情形的一種極端情形(其中,開(kāi)發(fā)者很少關(guān)心應(yīng)用程序看起來(lái)如何)可以允許使用也是以消息組件404為中心的懶人方法模式650c。另一方面,如果在步驟1406中,開(kāi)發(fā)者具有緊密監(jiān)視現(xiàn)有數(shù)據(jù)源模式的開(kāi)發(fā)任務(wù),則可以選擇1408以數(shù)據(jù)組件400為中心的數(shù)據(jù)驅(qū)動(dòng)方法模式650c。類似地,對(duì)特定業(yè)務(wù)域建模的數(shù)據(jù)組件400的標(biāo)準(zhǔn)集合可以是選擇1408也是以數(shù)據(jù)組件400為中心的業(yè)務(wù)域模板模式650d的原因。因此,根據(jù)以組件400、402、404、406為中心的推理,可以按需選擇上述或者其他的特定開(kāi)發(fā)模式650。
開(kāi)發(fā)模式650自下至上方法模式650a參考圖13和14,自下至上方法模式650a采用如下方法基于可用后端數(shù)據(jù)源106消息收發(fā)描述(例如SQL和WSDL)來(lái)生成合適的應(yīng)用程序105。該模式選擇650a中包括如下問(wèn)題如何智能且高效地建立對(duì)現(xiàn)有web服務(wù)或其他數(shù)據(jù)源106服務(wù)起作用的應(yīng)用程序105;以及一個(gè)或多個(gè)現(xiàn)有后端數(shù)據(jù)源106服務(wù)是否是所開(kāi)發(fā)的應(yīng)用程序105必須針對(duì)或與之通信的。要考慮的示例設(shè)計(jì)參數(shù)是典型公司具有其數(shù)據(jù)源106的可用服務(wù)的遺留集合,以及通過(guò)因特網(wǎng)可用的公共web服務(wù)集合可能是應(yīng)用程序105的框架。因此,上述細(xì)節(jié)和決定可以通過(guò)顯示器206向開(kāi)發(fā)者顯示,或者可以由開(kāi)發(fā)者手動(dòng)決定。根據(jù)以上描述,模式650a可以指導(dǎo)開(kāi)發(fā)者(通過(guò)顯示器206或用戶接口202的其他裝置)進(jìn)行如下操作1.在步驟1410選擇消息編輯器712(以及在步驟1408中選擇相關(guān)聯(lián)的消息相關(guān)向?qū)?04)(見(jiàn)圖7),用于組裝消息組件404;2.輸入目標(biāo)web服務(wù)的URL;3.挑選操作,以生成消息編輯器712的消息;4.選擇字段默認(rèn)值;5.確認(rèn)對(duì)通過(guò)消息自動(dòng)合并模式660b(下面進(jìn)一步討論)所生成的消息副本的推薦,例如通過(guò)使用模型生效器602(見(jiàn)圖6);6.如果開(kāi)發(fā)者希望生成合適的數(shù)據(jù)組件400,可以應(yīng)用消息內(nèi)容目標(biāo)模式658a(下面進(jìn)一步討論),以持續(xù)消息組件404的消息數(shù)據(jù),或者將消息組件404的消息鏈接到屏幕組件402中所定義的屏幕;以及8.通過(guò)利用相關(guān)向?qū)?04,使用相關(guān)聯(lián)的編輯器600和查看器602,指定任何額外的數(shù)據(jù)400、屏幕402和工作流406(例如,導(dǎo)航)組件,可以完成1412應(yīng)用程序的開(kāi)發(fā),如下面進(jìn)一步討論。這可以通過(guò)直接方法步驟1412或者通過(guò)在適當(dāng)?shù)南驅(qū)?04的指導(dǎo)下穿過(guò)步驟1408的路徑來(lái)實(shí)現(xiàn)(由標(biāo)號(hào)1409象征性地表示)。
懶人方法模式650b參考圖13和14,懶人方法模式650b可以是自下至上模式650a的擴(kuò)展,由此生成包括數(shù)據(jù)組件400和屏幕組件402的整個(gè)應(yīng)用程序6105。該模式選擇650b中包括如下問(wèn)題如何高效生成能夠?qū)ΜF(xiàn)有web服務(wù)數(shù)據(jù)源106進(jìn)行測(cè)試的應(yīng)用程序105;以及你處于開(kāi)發(fā)的早期階段,而你的目標(biāo)web服務(wù)數(shù)據(jù)源106正在頻繁改變消息收發(fā)模式,例如你希望能夠快速生成應(yīng)用程序105來(lái)測(cè)試接口,并不真正關(guān)注應(yīng)用程序105的顯示。要考慮的示例設(shè)計(jì)參數(shù)是應(yīng)用程序105的UI外觀可能對(duì)于與web服務(wù)數(shù)據(jù)源106交換的能力具有較小的影響;以及開(kāi)發(fā)者可能最關(guān)注后端數(shù)據(jù)源106的測(cè)試和調(diào)試。根據(jù)以上描述,模式650b可以引導(dǎo)開(kāi)發(fā)者(通過(guò)顯示器206或者用戶接口202的其他手段)進(jìn)行如下操作1.以自下至上方法模式650a開(kāi)始,這在步驟1408中應(yīng)用并被擴(kuò)展;2.在步驟1410以及1409(如果需要的話)中,結(jié)合數(shù)據(jù)編輯器710(以及可能結(jié)合編輯器704),模式650b提供建議數(shù)據(jù)組件400的集合,以對(duì)從消息組件404的消息調(diào)用傳遞或返回的數(shù)據(jù)建模;3.要呈現(xiàn)或者要輸入傳遞到web服務(wù)的數(shù)據(jù)的默認(rèn)屏幕的集合由屏幕編輯器708(以及可能由查看器804)生成并接受;以及4.通過(guò)利用相關(guān)向?qū)?04,使用相關(guān)聯(lián)的編輯器600和查看器602,指定任何額外的數(shù)據(jù)400、屏幕402和工作流406(例如,導(dǎo)航)組件,可以完成1412應(yīng)用程序105的開(kāi)發(fā),如下面進(jìn)一步討論。這可以通過(guò)直接方法步驟1412或者通過(guò)在適當(dāng)?shù)南驅(qū)?04的指導(dǎo)下穿過(guò)步驟1408的路徑來(lái)實(shí)現(xiàn)(由標(biāo)號(hào)1409象征性地表示)。
數(shù)據(jù)驅(qū)動(dòng)方法模式650c參考圖13和14,數(shù)據(jù)驅(qū)動(dòng)方法模式650c幫助開(kāi)發(fā)者利用與現(xiàn)有數(shù)據(jù)庫(kù)模式非常相像或類似的工具116來(lái)創(chuàng)建應(yīng)用程序105。該模式選擇650c中包括如下問(wèn)題如何產(chǎn)生其結(jié)構(gòu)主要源自現(xiàn)有數(shù)據(jù)源106模型的應(yīng)用程序105;目標(biāo)應(yīng)用程序數(shù)據(jù)結(jié)構(gòu)應(yīng)該接近/等同于一部分?jǐn)?shù)據(jù)源106模式;以及應(yīng)用程序105主要用來(lái)查看或更新后端數(shù)據(jù)源106中存儲(chǔ)的信息。要考慮的示例設(shè)計(jì)參數(shù)是應(yīng)用程序105是以數(shù)據(jù)為中心的,并且應(yīng)用程序105的功能表現(xiàn)為簡(jiǎn)單的查看/更新/刪除模式。根據(jù)以上描述,模式650c可以引導(dǎo)開(kāi)發(fā)者(通過(guò)顯示器206或者用戶接口202的其他手段)進(jìn)行如下操作(僅作為示例)1.在步驟1410選擇數(shù)據(jù)編輯器710(以及在步驟1408選擇相關(guān)聯(lián)的數(shù)據(jù)相關(guān)向?qū)?04);2.利用編輯器712(以及潛在地利用編輯器704),根據(jù)數(shù)據(jù)庫(kù)模式選擇生成數(shù)據(jù)組件400;3.提供數(shù)據(jù)庫(kù)模式的本地化(例如,可以通過(guò)ddl文件表達(dá));4.在之前的每個(gè)步驟中,建議匹配數(shù)據(jù)組件400以“緩存”由表來(lái)表達(dá)的數(shù)據(jù);5.開(kāi)發(fā)者可以選擇可用表的子集,從而工具116維護(hù)基于最小(或其他預(yù)定標(biāo)準(zhǔn))的相關(guān)聯(lián)必需表的關(guān)系集;6.用戶可以指定如何訪問(wèn)表,例如選擇/更新/刪除,并且可以由消息編輯器712生成建議消息,以支持這些功能;以及7.利用工具116所提供的相關(guān)向?qū)?04,通過(guò)提供消息組件400以利用消息編輯器712執(zhí)行與數(shù)據(jù)源106的交互(假設(shè)跳過(guò)步驟6.),并且提供屏幕組件402以通過(guò)在步驟1412中采用適當(dāng)?shù)钠聊痪庉嬈?08和查看器804可視化并操作數(shù)據(jù)組件400,完成1412應(yīng)用程序。
業(yè)務(wù)域模板模式650d參考圖13和14,業(yè)務(wù)域模板模式650d可以用來(lái)幫助開(kāi)發(fā)者,作為生成對(duì)應(yīng)用程序105的特定業(yè)務(wù)域建模的數(shù)據(jù)組件400的標(biāo)準(zhǔn)集合的主要方法的一部分。該模式選擇650d中包括如下問(wèn)題如何產(chǎn)生最適于特定垂直市場(chǎng)位置的應(yīng)用程序105;以及正在針對(duì)業(yè)務(wù)應(yīng)用的特定域(例如,保險(xiǎn)、衛(wèi)生部門(mén)、房地產(chǎn)、汽車工業(yè)等)開(kāi)發(fā)應(yīng)用程序105。要考慮的示例設(shè)計(jì)參數(shù)是業(yè)務(wù)部門(mén)通常具有其自身的良好定義的實(shí)體和關(guān)系;開(kāi)發(fā)者希望確保域用戶熟悉應(yīng)用程序105;希望避免重復(fù)勞動(dòng);并且希望確保應(yīng)用程序105堅(jiān)持慣例。根據(jù)以上描述,模式650d可以引導(dǎo)開(kāi)發(fā)者(通過(guò)顯示器206或者用戶接口202的其他手段)進(jìn)行如下操作(僅作為示例)1.通過(guò)開(kāi)發(fā)者使用UI 202,在顯示器206上調(diào)用1408業(yè)務(wù)域模板模式650d(例如,向?qū)?,并且提供業(yè)務(wù)域的模式(XSD)本地化;2.工具116在步驟1410中通過(guò)使用數(shù)據(jù)編輯器710生成匹配業(yè)務(wù)域的數(shù)據(jù)組件400的集合;3.開(kāi)發(fā)者可以選擇感興趣的模式的對(duì)象,丟棄不使用的那些對(duì)象(典型的域模式非常大);4.工具116維護(hù)模式中連接的數(shù)據(jù)表達(dá)之間的關(guān)系,以確保包括所有相互依存的組件400;以及5.利用工具116所提供的相關(guān)向?qū)?04,通過(guò)提供消息組件400以利用消息編輯器執(zhí)行與數(shù)據(jù)源106的交互,并且提供屏幕組件402以通過(guò)在步驟1412中采用適當(dāng)?shù)钠聊痪庉嬈?08和查看器804可視化并操作數(shù)據(jù)組件400,完成1412應(yīng)用程序105。
認(rèn)識(shí)到,除了上面僅作為示例所描述的那些,向?qū)?04也可以針對(duì)各個(gè)模式650a、b、c、d按需指導(dǎo)使用其他編輯器600和查看器602。這包括在向?qū)?04和相關(guān)聯(lián)的模式648之間進(jìn)行交互,這種交互優(yōu)選地通過(guò)在顯示器206上(或者通過(guò)用戶接口202)向開(kāi)發(fā)者所顯示的針對(duì)各個(gè)模式650a、a、c、d的向?qū)?04來(lái)指導(dǎo)。
生效模式660消息自動(dòng)合并模式660a消息自動(dòng)合并模式660a是可以減少與后端數(shù)據(jù)源106所交換的消息組件404的消息的定義重復(fù)的改良模式。作為開(kāi)發(fā)者在UI 202上輸入事件的結(jié)果,當(dāng)為了應(yīng)用程序105的生效目的調(diào)用生效器620(見(jiàn)圖6)時(shí),該模式660a可以實(shí)現(xiàn)在顯示器206上。該模式選擇660a中包括如下問(wèn)題如何生成消息的最高效集合,以與后端web服務(wù)交互;以及正在利用自下至上方法模式650a開(kāi)發(fā)應(yīng)用程序105,并且已經(jīng)針對(duì)特定的web服務(wù)(數(shù)據(jù)源106)生成了消息集合。要考慮的示例設(shè)計(jì)參數(shù)是某些接口可能交換類似或重復(fù)的參數(shù)集合;以及每個(gè)重復(fù)的規(guī)范在無(wú)線傳輸開(kāi)銷之外對(duì)于設(shè)備運(yùn)行時(shí)環(huán)境RE需求具有根據(jù)應(yīng)用程序105大小的相關(guān)聯(lián)(且多余的)成本。根據(jù)以上描述,模式660a可以引導(dǎo)開(kāi)發(fā)者(通過(guò)顯示器206或者用戶接口202的其他手段)進(jìn)行如下操作(僅作為示例)1.(例如)由自下至上方法模式650a如上所述提供(例如由消息編輯器712提供的消息組件404的)生成消息的集合;2.分析消息,以確定在消息方面是否存在公共性,例如,一個(gè)消息是另一消息的子集(比較字段數(shù)目&類型)和/或任意重復(fù)消息定義;3.工具116推薦何處可以使用原型通過(guò)繼承來(lái)定義類似消息,或者何處可以去除重復(fù)消息。
數(shù)據(jù)自動(dòng)合并模式660b當(dāng)應(yīng)用于所開(kāi)發(fā)的應(yīng)用程序105的數(shù)據(jù)組件400規(guī)范(例如,通過(guò)數(shù)據(jù)編輯器710)時(shí),該模式660b能夠提供與針對(duì)消息自動(dòng)合并模式660a中的消息所討論的相同種類的優(yōu)化和步驟。
屏幕模式656參考圖14,在步驟1410和/或1412可以應(yīng)用屏幕模式656作為副模式648,以幫助根據(jù)主模式650指導(dǎo)/協(xié)調(diào)來(lái)生成屏幕組件402,即,在幫助開(kāi)發(fā)者生成應(yīng)用程序105的屏幕組件402時(shí),模式650驅(qū)動(dòng)模式656,該模式656驅(qū)動(dòng)屏幕編輯器/查看器704、804的操作。圖15示出了主、副模式的協(xié)調(diào)1500,其中(例如由模式654)首先調(diào)用1502主模式(例如,模式650)。然后主模式調(diào)用或者選擇1504副模式(例如,模式652、656、658、660),副模式又幫助或調(diào)用適當(dāng)?shù)木庉嬈?00和查看器602,用于由開(kāi)發(fā)者按需或者由模式652、656、658、660(即,向?qū)?04)指導(dǎo)開(kāi)發(fā)組件400、402、404、406。還應(yīng)認(rèn)識(shí)到,主模式可以按需直接調(diào)用1508適當(dāng)?shù)木庉嬈?查看器600、602。此外,一旦副模式在開(kāi)發(fā)相應(yīng)組件400、402、404、406時(shí)完成其對(duì)相關(guān)聯(lián)的編輯器/查看器600、602的指導(dǎo)(即,模式658指導(dǎo)編輯器712來(lái)構(gòu)建消息組件404),可以將指導(dǎo)權(quán)歸還1510給原始的主模式或不同的主模式,或者交給1512其他副模式,以繼續(xù)應(yīng)用程序105開(kāi)發(fā)。
表格模式656b表格模式656b向開(kāi)發(fā)者提供利用屏幕編輯器704和查看器804高效生成屏幕(作為屏幕組件)的方式,其收集并提交某些值。該模式選擇656b中包括如下問(wèn)題如何高效產(chǎn)生表格來(lái)收集并提交某些信息;以及要產(chǎn)生的屏幕具有結(jié)構(gòu)化(例如,基于表的)格式。要考慮的示例設(shè)計(jì)參數(shù)是頻繁使用表格來(lái)收集信息(例如,用戶詳情、首選項(xiàng))的標(biāo)準(zhǔn)集合。根據(jù)以上描述,模式656b可以引導(dǎo)開(kāi)發(fā)者(通過(guò)顯示器206或者用戶接口202的其他手段)進(jìn)行如下操作(僅作為示例)1.模式656b利用編輯器/查看器704、804向開(kāi)發(fā)者提示表格中將出現(xiàn)的列數(shù);2.或者表格中要出現(xiàn)的每一行;a.開(kāi)發(fā)者識(shí)別什么類型的控制出現(xiàn)在每一列中,例如標(biāo)簽、編輯框、圖像等,從而開(kāi)發(fā)者針對(duì)任何標(biāo)簽輸入所需文本,并且在合適時(shí)識(shí)別數(shù)據(jù)映射;3.開(kāi)發(fā)者通過(guò)提交來(lái)識(shí)別如何進(jìn)行屏幕轉(zhuǎn)換,例如通過(guò)按鈕提交,通過(guò)菜單項(xiàng)提交,并且在合適時(shí)應(yīng)用消息發(fā)起模式652a;以及4.完成屏幕組件402開(kāi)發(fā)(全部或局部),并且直接調(diào)用或者通過(guò)隨后的向?qū)?04調(diào)用隨后的編輯器/查看器600、602。
數(shù)據(jù)單模式656e數(shù)據(jù)單模式656e提供例如基于數(shù)據(jù)組件400的數(shù)據(jù)定義生成屏幕的方式。該模式選擇656e中包括如下問(wèn)題如何生成基于現(xiàn)有數(shù)據(jù)定義的屏幕;以及在使用該模式656e時(shí),屏幕變?yōu)榭梢暿侄我员硎緮?shù)據(jù)結(jié)構(gòu)本身。要考慮的示例設(shè)計(jì)參數(shù)是僅僅為了修改數(shù)據(jù)組件400的目的而生成某些屏幕。根據(jù)以上描述,模式656e可以引導(dǎo)開(kāi)發(fā)者(通過(guò)顯示器206或者用戶接口202的其他手段)進(jìn)行如下操作(僅作為示例)1.利用屏幕編輯器/查看器704、804,開(kāi)發(fā)者提供數(shù)據(jù)組件400定義,根據(jù)該定義來(lái)生成屏幕;
2.工具116生成屏幕(利用屏幕組件402以及相關(guān)聯(lián)的編輯器/查看器600、602),該屏幕具有兩列一列用于字段名稱,另一列用于字段值,從而a.可以基于數(shù)據(jù)組件400定義字段名稱,自動(dòng)生成控制名稱,b.基于數(shù)據(jù)類型生成控制類型,其中,i.簡(jiǎn)單字段映射到編輯框,以及ii.嵌套數(shù)據(jù)字段產(chǎn)生“添加”、“編輯”和“去除”按鈕。重新應(yīng)用數(shù)據(jù)單模式656e,以生成將嵌套數(shù)據(jù)組件400可視化的屏幕(屏幕組件402),從而,I.“添加”、“編輯”和“去除”按鈕的顯示取決于運(yùn)行時(shí)條件(即,嵌套組件是否為空),iii.嵌套數(shù)組類型字段生成選擇列表,從而I.簡(jiǎn)單值的數(shù)組可以直接由選擇列表表示,II.組件的數(shù)組使用要針對(duì)所包含的數(shù)據(jù)類型重復(fù)應(yīng)用的數(shù)據(jù)單模式656e,以及III.可以基于運(yùn)行時(shí)條件顯示“添加”、“編輯”和“去除”按鈕,a.總是顯示“添加”,i.在運(yùn)行時(shí),“添加”按鈕可以打開(kāi)對(duì)話605,以收集簡(jiǎn)單值,或者可以將應(yīng)用程序105轉(zhuǎn)換到子頁(yè)面,以創(chuàng)建數(shù)據(jù)組件400,b.在做出選擇時(shí)顯示“編輯”,c.在做出選擇時(shí)顯示“去除”,i.如果用戶希望去除所有嵌套數(shù)據(jù)實(shí)例,可以向用戶提示去除數(shù)據(jù)組件400,iv.字段在圖像字段中具有資源指定結(jié)果,c.應(yīng)該由開(kāi)發(fā)者輸入字段標(biāo)簽,d.開(kāi)發(fā)者可以自行跳過(guò)任何特定字段,3.工具116生成應(yīng)用值的提交按鈕,以及4.完成屏幕組件402開(kāi)發(fā)(全部或局部),并且直接調(diào)用或者通過(guò)隨后的向?qū)?04調(diào)用隨后的編輯器/查看器600、602。
幻燈片放映模式656a幻燈片放映模式656a生成將圖像的動(dòng)態(tài)集合可視化的屏幕(即,屏幕組件402)。該模式選擇656a中包括如下問(wèn)題如何高效放映一系列圖像,其中圖像數(shù)目是動(dòng)態(tài)的,這在設(shè)計(jì)時(shí)不能確定;以及應(yīng)用程序105依賴于URLS的動(dòng)態(tài)集合,其中URLS可以基于某些在先條件指向不同圖像。要考慮的示例設(shè)計(jì)參數(shù)是產(chǎn)生屏幕以及允許這種行為的腳本是困難且耗時(shí)的。根據(jù)如上描述,模式656a可以引導(dǎo)開(kāi)發(fā)者(通過(guò)顯示器206或者用戶接口202的其他手段)進(jìn)行如下操作(僅作為示例)1.利用屏幕編輯器/查看器704、804,開(kāi)發(fā)者識(shí)別URLS的源(根據(jù)數(shù)組)a.可能是關(guān)于數(shù)據(jù)組件400的數(shù)組字段,b.可能是關(guān)于接收到的消息的數(shù)組字段;2.工具116生成基本屏幕(組件402),該基本屏幕具有映射到全局變量的圖像控制a.工具116生成全局變量;3.工具116生成“下一”按鈕a.生成附加腳本組件406,其向2.a的全局變量加載自1開(kāi)始的下一圖像URL;4.工具生成“完成”按鈕;以及5.完成屏幕組件402開(kāi)發(fā)(全部或局部),并且直接調(diào)用或者通過(guò)隨后的向?qū)?04調(diào)用隨后的編輯器/查看器600、602。
訪問(wèn)設(shè)備數(shù)據(jù)模式656c訪問(wèn)設(shè)備數(shù)據(jù)模式656c基于設(shè)備訪問(wèn)(例如,日歷約會(huì)、地址簿條目等),提供對(duì)“內(nèi)置”類集的智能處理。模式656c提供在由設(shè)備100所管理的全部組件類集與由應(yīng)用程序105創(chuàng)建并管理的組件子集之間進(jìn)行區(qū)分的手段。該模式選擇656c中包括如下問(wèn)題如何容易地區(qū)分整個(gè)設(shè)備100所管理的外部組件類集的使用與僅僅是應(yīng)用程序100在其上運(yùn)行的組件子集;以及正在開(kāi)發(fā)引用外部類集(例如,日歷約會(huì))的屏幕組件402。要考慮的示例設(shè)計(jì)參數(shù)是某些應(yīng)用程序105可能希望在外部應(yīng)用程序所管理的所有外部類集實(shí)體上運(yùn)行;某些應(yīng)用程序105可能希望表示僅由其自身創(chuàng)建并管理的外部應(yīng)用程序組件。根據(jù)以上描述,模式656c可以引導(dǎo)開(kāi)發(fā)者(通過(guò)顯示器206或者用戶接口202的其他手段)進(jìn)行如下操作(僅作為示例)1.利用屏幕編輯器/查看器704、804,開(kāi)發(fā)者將控制鏈接到“內(nèi)置”類集(例如,日歷或地址簿);2.開(kāi)發(fā)者為內(nèi)置類集指示包含關(guān)系a.類集可以包括由所訪問(wèn)的應(yīng)用程序在外部創(chuàng)建和管理的所有參考b.類集可以僅包括由應(yīng)用程序創(chuàng)建或明確引用的那些組件;3.工具116針對(duì)2中所指示的情形,生成數(shù)據(jù)組件400a.對(duì)于組件的標(biāo)準(zhǔn)類集,應(yīng)用程序105數(shù)據(jù)組件400通過(guò)名稱(例如,“地址”)簡(jiǎn)單地使用內(nèi)置組件,b.對(duì)于應(yīng)用程序105所管理的類集,應(yīng)用程序數(shù)據(jù)組件400擴(kuò)展內(nèi)置組件并添加UID鍵字段,i.向所擴(kuò)展的數(shù)據(jù)組件400給予隱藏名稱,可能通過(guò)將應(yīng)用程序105名稱掛在類集名稱之前,ii.工具116然后在生成屏幕時(shí)利用該隱藏名稱,但是在設(shè)計(jì)工具116的視圖時(shí)繼續(xù)使用內(nèi)置類集名稱,iii.工具116維護(hù)關(guān)系,以在將數(shù)據(jù)傳遞到腳本或另一屏幕組件406、402時(shí)校正底層類型;以及4.完成屏幕組件402開(kāi)發(fā)(全部或局部),并且直接調(diào)用或者通過(guò)隨后的向?qū)?04調(diào)用隨后的編輯器/查看器600、602。
支持代碼可以如下擴(kuò)展內(nèi)置類集,以允許應(yīng)用程序105所管理的類集<data name=”[wicletName]Address”prototype=”[UIDpkg]”pkey=”UID”>
<dfield name=”UID”type=.../>
</data>
制作屏幕控制條件模式656d制作屏幕控制條件模式656d允許開(kāi)發(fā)者將條件附加到屏幕控制上,其中屏幕控制指定確定可視性的標(biāo)準(zhǔn)。該模式選擇656d中包括如下問(wèn)題如何指定特定控制只可能在特定環(huán)境下才示出;如何按照將盡可能少的導(dǎo)航邏輯嵌入到腳本組件406中、而是以屏幕定義來(lái)表達(dá)的方式來(lái)編寫(xiě)應(yīng)用程序105;以及正在開(kāi)發(fā)具有以某些可測(cè)試標(biāo)準(zhǔn)為條件的導(dǎo)航或消息發(fā)送的應(yīng)用程序105。要考慮的示例設(shè)計(jì)參數(shù)是希望將用于導(dǎo)航的條件邏輯從腳本移入屏幕組件402的定義中;以及希望完全利用其他更有幫助的模式,例如消息發(fā)起模式652a(例如)。根據(jù)以上描述,模式656d可以引導(dǎo)開(kāi)發(fā)者(通過(guò)顯示器206或者用戶接口202的其他手段)進(jìn)行如下操作(僅作為示例)1.利用屏幕編輯器/查看器704、804,開(kāi)發(fā)者指示特定控制受到條件邏輯的支配;2.工具116呈現(xiàn)可以用來(lái)表示條件的區(qū)域a.顯示在先生成的條件以便重新使用;3.工具116將條件關(guān)聯(lián)到控制,并且提示是否要應(yīng)用諸如消息發(fā)起652a之類的其他模式;以及4.完成屏幕組件402開(kāi)發(fā)(全部或局部),并且直接調(diào)用或者通過(guò)隨后的向?qū)?04調(diào)用隨后的編輯器/查看器600、602。
支持代碼考慮如下兩個(gè)示例示例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(錯(cuò)誤方法)<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示出了用來(lái)通過(guò)條件腳本將條件導(dǎo)航嵌入到屏幕中的正確方法。執(zhí)行屏幕轉(zhuǎn)換和消息發(fā)送的腳本由User.selection的當(dāng)前狀態(tài)來(lái)節(jié)制。示例B示出了用來(lái)在單個(gè)腳本內(nèi)評(píng)價(jià)條件邏輯的不那么令人滿意的方法。通過(guò)使用示例A的方法,消息發(fā)起模式652a可以更容易應(yīng)用。
腳本模式652消息發(fā)起模式652a消息發(fā)起模式652a提供了生成發(fā)送消息組件404的消息所需腳本的智能手段。模式652a應(yīng)用某些規(guī)則來(lái)確定消息的內(nèi)容應(yīng)該源自何處。該模式選擇652a中包括如下問(wèn)題正在開(kāi)發(fā)將收集或操作某些信息然后發(fā)送消息的屏幕組件402;如何容易地產(chǎn)生發(fā)送該消息所需的腳本;屏幕組件402具有用于處理的相關(guān)聯(lián)數(shù)據(jù)類型,這可以是作為屏幕中所構(gòu)建的參數(shù)提供的,或者是作為類集的一部分引用的。要考慮的示例設(shè)計(jì)參數(shù)是生成用于公用的腳本的能力可以減小開(kāi)發(fā)應(yīng)用程序105的復(fù)雜度;以及依附于應(yīng)用程序105開(kāi)發(fā)最佳實(shí)踐的消息、屏幕、數(shù)據(jù)定義或者各個(gè)組件以及它們之間的關(guān)系通??赡苁艿揭唤M公認(rèn)處理規(guī)則的支配。根據(jù)以上描述,模式652a可以引導(dǎo)開(kāi)發(fā)者(通過(guò)顯示器206或者用戶接口202的其他手段)進(jìn)行如下操作(僅作為示例)1.利用工作流/腳本編輯器702、706,在開(kāi)發(fā)可能有條件地分支到其他屏幕(組件402)或者發(fā)送不同消息的工作流組件406時(shí),條件邏輯應(yīng)該在屏幕組件402設(shè)計(jì)中捕獲,而不是轉(zhuǎn)移到工作流組件406(觀察制作屏幕控制條件656d方法),從而利用該方法的效果是,不需要將條件邏輯嵌入到消息發(fā)起模式652a所生成的腳本中;2.作為按鈕或菜單項(xiàng)的一部分,用戶可以附上腳本以定制處理。一種典型處理是發(fā)送消息并轉(zhuǎn)換到另一屏幕a.向用戶提示腳本是否是發(fā)送消息,并且識(shí)別要發(fā)送的消息類型(M),i.通過(guò)觀察針對(duì)組件402的屏幕定義中已經(jīng)使用的數(shù)據(jù)類型正在使用的映射(參數(shù)或鏈接數(shù)據(jù)),可以提取最可能發(fā)送的消息的子集,ii.可以選擇先前所定義的任何其他消息,b.向用戶提示應(yīng)用程序?qū)⑥D(zhuǎn)換到的屏幕;3.確定消息類型M的映射規(guī)則a.適當(dāng)映射到一個(gè)或多個(gè)數(shù)據(jù)類型(消息映射或字段映射),i.必須指示映射數(shù)據(jù)類型的源,I.可能是傳遞到屏幕組件402的數(shù)據(jù)參數(shù),II.可能是連接到屏幕組件402中其他地方所使用的控制的數(shù)據(jù)類型,III.可能是類集的基礎(chǔ)數(shù)據(jù)類型(例如,數(shù)據(jù)),IV.可能是另一數(shù)據(jù)類型上的類集類型字段的基礎(chǔ)數(shù)據(jù)類型(例如,Data1.Data2)ii.生成利用所識(shí)別的數(shù)據(jù)發(fā)送消息的腳本,iii.字段映射消息生成組件406的腳本,其利用傳遞到該腳本的數(shù)據(jù)實(shí)例來(lái)在發(fā)送之前初始化字段,iv.包含擴(kuò)展字段的字段映射消息使工具116提示這些字段的值(例如,可能根據(jù)屏幕控制,或者僅僅是原義值),v.生成利用指定數(shù)據(jù)發(fā)送消息并接受適當(dāng)參數(shù)的腳本。
按需生成消息字段集合,并且請(qǐng)求下一屏幕,b.對(duì)消息類型M沒(méi)有映射,i.工具116提示用戶確定每一個(gè)字段值來(lái)自1.可能來(lái)自其它屏幕字段,2.可能是簡(jiǎn)單的字母值,3.可能被忽略,ii.工具116產(chǎn)生可以接收所需的參數(shù)的腳本,設(shè)置字段并發(fā)送消息,然后過(guò)渡到屏幕組件402的下一屏幕,c.適當(dāng)映射,但是所映射的數(shù)據(jù)類型沒(méi)有傳遞到屏幕或者沒(méi)有在屏幕那使用,i.生成錯(cuò)誤消息,該消息不能從該屏幕上看到;4.作為對(duì)現(xiàn)有消息實(shí)施映射的可選方案,提供創(chuàng)建新消息的選項(xiàng)a.可以基于屏幕內(nèi)當(dāng)前所使用的字段或者可能是消息映射候選的鏈接數(shù)據(jù)類型,建議消息的初始定義;以及5.完成工作流組件406開(kāi)發(fā)(全部或局部),并且直接調(diào)用或者通過(guò)隨后的向?qū)?04調(diào)用隨后的編輯器/查看器600、602。
消息接收652c消息接收模式652c提供了在接收消息時(shí)利用公共處理的手段。該模式選擇652c中包括如下問(wèn)題在接收到消息時(shí)如何通過(guò)腳本來(lái)簡(jiǎn)化應(yīng)用程序105的效果的規(guī)范;正在編寫(xiě)接收消息的應(yīng)用程序105;感興趣的消息包含字段級(jí)映射,指示可能需要通過(guò)工作流組件406的腳本的額外處理。要考慮的示例設(shè)計(jì)參數(shù)是存在可以適用于字段級(jí)映射消息的公共場(chǎng)景;以及消息中存在不更新其他映射數(shù)據(jù)字段的主鍵字段映射。根據(jù)以上描述,模式652c可以引導(dǎo)開(kāi)發(fā)者(通過(guò)顯示器206或者用戶接口202的其他手段)進(jìn)行如下操作(僅作為示例)1.利用工作流/腳本編輯器702、706,分析消息M的消息規(guī)范,
a.消息映射適當(dāng)?shù)刂甘拘枰~外處理的可能性較低,其中不需要工具116向開(kāi)發(fā)者提示附上腳本,b.字段映射關(guān)系適當(dāng)?shù)刂甘就ㄟ^(guò)腳本進(jìn)行額外處理的可能性較高,尤其是i.具有主鍵字段映射到?jīng)]有引用其他消息字段的數(shù)據(jù)類型的消息是直接觸發(fā),或者通過(guò)工具116提示需要額外處理;2.檢測(cè)主鍵字段映射,a.如果存在一個(gè)隔離的主鍵字段映射(即,創(chuàng)建),工具116可以向開(kāi)發(fā)者提示是否希望通過(guò)腳本附上額外處理,在這種情形中所創(chuàng)建的工作流組件406的腳本將為空,b.如果存在兩個(gè)或多個(gè)這樣的上述隔離映射i.如果一個(gè)映射數(shù)據(jù)類型是其他數(shù)據(jù)類型的嵌套字段數(shù)據(jù)1.x,x的類型是數(shù)據(jù)2,I.工具116推薦將數(shù)據(jù)2的實(shí)例設(shè)置在數(shù)據(jù)1字段x上II.生成工作流406的腳本,執(zhí)行設(shè)置操作ii.如果一個(gè)映射數(shù)據(jù)類型是另一數(shù)據(jù)類型上的嵌套類集的基礎(chǔ)類型Data1.x,x的類型是Data2,I.工具116推薦可以執(zhí)行添加或去除,II.開(kāi)發(fā)者選擇優(yōu)選選項(xiàng),并且生成工作流組件406的相關(guān)聯(lián)腳本;3.如果字段映射被指定為沒(méi)有被主鍵映射相關(guān)的數(shù)據(jù)類型a.工具116可以向開(kāi)發(fā)者提示該數(shù)據(jù)類型的類集中每個(gè)實(shí)例是否應(yīng)該用該字段值來(lái)更新,i.可以通過(guò)where子句指定整個(gè)類集的子集,I.工具116提示數(shù)據(jù)類型的條件字段,II.工具116提示比較算符III.工具116提示比較值,a.可能被指定為源自沒(méi)有被映射的消息的另一字段;以及4.完成工作流組件406開(kāi)發(fā)(全部或局部),并且直接調(diào)用或者通過(guò)隨后的向?qū)?04調(diào)用隨后的編輯器/查看器600、602。
控制條件模式652b控制條件模式652b提供通過(guò)工作流組件406中可能包含的腳本生成影響特定屏幕控制顯示的條件所必需的指南??刂茥l件總是評(píng)價(jià)為布爾結(jié)果。該模式選擇652b中包括如下問(wèn)題如何指定屏幕控制的顯示取決于滿足一組條件;如何容易地生成腳本以實(shí)現(xiàn)該條件行為;正在開(kāi)發(fā)基于數(shù)據(jù)元素的當(dāng)前狀態(tài)、屏幕控制的狀態(tài)或者所傳遞的參數(shù)的值具有分支或動(dòng)態(tài)屏幕行為的應(yīng)用程序105。要考慮的示例設(shè)計(jì)參數(shù)是開(kāi)發(fā)者可能具有很少的腳本知識(shí);以及編寫(xiě)腳本是易于出錯(cuò)。根據(jù)以上描述,模式652b可以引導(dǎo)開(kāi)發(fā)者(通過(guò)顯示器206或者用戶接口202的其他手段)進(jìn)行如下操作(僅作為示例)1.利用工作流/腳本編輯器702、706和/或屏幕編輯器,向開(kāi)發(fā)者呈現(xiàn)可用的如下各項(xiàng)的列表a.數(shù)據(jù)類集,b.當(dāng)前屏幕控制名稱(編輯框和列表控制),c.傳遞到屏幕的可用參數(shù),2.開(kāi)發(fā)者選擇1中所提供的可用實(shí)體之一a.對(duì)于類集i.開(kāi)發(fā)者可以測(cè)試存在至少一個(gè)元素(size()>0),ii.開(kāi)發(fā)者可以測(cè)試包含特定字段,I.針對(duì)類集顯示“包含字段”文本,II.針對(duì)無(wú)鍵(單件)類集顯示“字段值是”,III.開(kāi)發(fā)者可以輸入字段名稱,IV.開(kāi)發(fā)者可以指定字段值,a.可以是原義(設(shè)計(jì)時(shí)),b.可以是運(yùn)行時(shí)值,i.所創(chuàng)建或傳遞到屏幕的數(shù)據(jù)實(shí)例的字段,
ii.當(dāng)前屏幕的控制字段,b.對(duì)于屏幕參數(shù),i.參數(shù)本身,I.開(kāi)發(fā)者可以測(cè)試實(shí)例是否未定義(即,空)ii.單個(gè)實(shí)例參數(shù)字段,I.開(kāi)發(fā)者可以測(cè)試單個(gè)實(shí)例未定義(即,空),II.開(kāi)發(fā)者可以測(cè)試參數(shù)的字段具有特定值(與2.a.ii.3&4相同),iii.數(shù)組參數(shù)字段,I.開(kāi)發(fā)者可以測(cè)試是否存在至少一個(gè)元素(size()>0),II.開(kāi)發(fā)者可以測(cè)試是否包含特定字段(與2.a.ii相同),測(cè)試選項(xiàng)由選擇何種類型元素控制,c.對(duì)于屏幕控制字段,i.對(duì)于選定的編輯或文本區(qū)域控制,I.開(kāi)發(fā)者可以測(cè)試值是否為空,II.開(kāi)發(fā)者可以將值與開(kāi)發(fā)者輸入的原義比較,III.開(kāi)發(fā)者可以利用掩碼測(cè)試值,ii.對(duì)于選定的選擇控制I.開(kāi)發(fā)者可以測(cè)試選擇控制是否為空(真或假),II.開(kāi)發(fā)者可以測(cè)試是否選擇了特定索引,III.開(kāi)發(fā)者可以與所提供的原義比較,IV.開(kāi)發(fā)者可以利用掩碼測(cè)試值;3.開(kāi)發(fā)者可以通過(guò)選擇“更多”并選擇適當(dāng)?shù)乃惴?例如,AND/OR)來(lái)組合另一條件;4.如果需要其他高級(jí)行為,開(kāi)發(fā)者可以選擇以腳本形式編輯條件;以及5.完成工作流組件406開(kāi)發(fā)(全部或局部),并且直接調(diào)用或者通過(guò)隨后的向?qū)?04調(diào)用隨后的編輯器/查看器600、602。
消息收發(fā)模式658
通知建立模式658b通知建立模式658b提供了根據(jù)通知數(shù)據(jù)源106生成通知和訂閱支持的手段。該模式選擇652c中包括如下問(wèn)題如何容易地生成屏幕和消息以支持后端的通知接口;如何生成用于篩選通知的過(guò)濾器;以及正在為通過(guò)WSDL文件(作為示例后端模式)表達(dá)的通知接口工作。要考慮的示例設(shè)計(jì)參數(shù)是預(yù)期通知web服務(wù)將變得更廣泛;通知接口以及支持訂閱和過(guò)濾是復(fù)雜區(qū)域;開(kāi)發(fā)者必須至少知道數(shù)據(jù)源106通過(guò)文檔或者某些其他源所支持的通知類型,和/或模式658b不能區(qū)分用于通知的復(fù)雜類型與作為常規(guī)同步請(qǐng)求/響應(yīng)交換的那些類型。根據(jù)以上描述,模式658b可以引導(dǎo)開(kāi)發(fā)者(通過(guò)顯示器206或者用戶接口202的其他手段)進(jìn)行如下操作(僅作為示例)1.利用消息編輯器712,開(kāi)發(fā)者將工具116指向數(shù)據(jù)源WSDL(即,模式),a.工具116根據(jù)WSDL呈現(xiàn)可用復(fù)雜類型的列表,b.工具116根據(jù)WSDL呈現(xiàn)可用操作的列表,c.開(kāi)發(fā)者可以基于暴露的服務(wù)的先驗(yàn)知識(shí),從所呈現(xiàn)的通知中選擇;2.工具116詢問(wèn)開(kāi)發(fā)者他們是否希望接收到針對(duì)特定通知的提醒(建立通知標(biāo)準(zhǔn))a.工具116詢問(wèn)開(kāi)發(fā)者他們是否希望對(duì)提醒指定單獨(dú)的標(biāo)準(zhǔn)(即,過(guò)濾器)i.如果不,則提醒將是簡(jiǎn)單的復(fù)選框ii.如果是,則提醒將具有獨(dú)立的過(guò)濾器標(biāo)準(zhǔn);3.工具116收集通知和提醒的過(guò)濾器要求作為一組過(guò)濾器部件a.開(kāi)發(fā)者可以從通知復(fù)雜類型的字段中選擇b.開(kāi)發(fā)者可以選擇比較算符i.對(duì)于串,==、?。?,ii.對(duì)于數(shù)字,==、?。健ⅲ?、<、>=、<=,iii.其他類型,c.開(kāi)發(fā)者可以選擇比較字段
i.通知的另一字段(無(wú)窗口小部件)或者單個(gè)原義值,I.開(kāi)發(fā)者可以指示該過(guò)濾器部件是有條件的,a.使用復(fù)選框?qū)⑵浔硎驹谄聊簧?,ii.自由形式條目字段,I.使用編輯框?qū)⒃撨^(guò)濾器部件表示在屏幕上,II.開(kāi)發(fā)者提供文本標(biāo)簽,iii.枚舉值,I.使用下拉或無(wú)線按鈕來(lái)將該過(guò)濾器部件表示在屏幕上,d.開(kāi)發(fā)者對(duì)過(guò)濾器部件命名(這用于在屏幕上顯示的目的),e.開(kāi)發(fā)者可以指示添加另一過(guò)濾器部件(布爾表達(dá)式),利用&&或者‖算符結(jié)合;4.工具116記錄所有引用的通知字段,其他字段是靜態(tài)通知標(biāo)準(zhǔn)的候選,即,在設(shè)立通知時(shí)用戶提供的信息a.詢問(wèn)開(kāi)發(fā)者是否要組合其他字段作為元素濾波器標(biāo)準(zhǔn)的一部分,b.如果這樣的話,利用步驟3的方法建立額外的濾波器部件,由此只允許編輯框和下拉字段進(jìn)行輸入(這里沒(méi)有條件過(guò)濾器部件),從而該標(biāo)準(zhǔn)變?yōu)殪o態(tài)標(biāo)準(zhǔn);5.工具116利用適當(dāng)?shù)木庉嬈?00和查看器602生成所需的組件a.數(shù)據(jù)組件400,包含通知的所有字段+額外的主鍵字段(id),b.通知消息組件404i.針對(duì)所支持的每個(gè)通知類型的訂閱消息組件404,ii.針對(duì)多支持的每個(gè)通知類型的退訂消息組件404,iii.映射到數(shù)據(jù)通知組件404的通知消息,c.提醒消息組件404(如果選擇的話)i.針對(duì)所支持的每個(gè)通知類型的提醒訂閱消息組件404,ii.針對(duì)所支持的每個(gè)通知類型的提醒退訂消息組件404,iii.具有合適的提醒標(biāo)簽的提醒通知消息組件404,d.包含每個(gè)通知和提醒的過(guò)濾器的映射文件i.包含在過(guò)濾器部件映射到復(fù)選框控制時(shí)出現(xiàn)的條件元素的過(guò)濾器(即,動(dòng)態(tài)過(guò)濾器)生成過(guò)濾器部件的組合(對(duì)于第一階段只支持一個(gè)這樣的過(guò)濾器部件,即,至多2個(gè)過(guò)濾器),I.針對(duì)通知或提醒的訂閱消息包括指示是否已經(jīng)選擇該標(biāo)記的布爾字段,從而應(yīng)用程序網(wǎng)關(guān)AG基于標(biāo)記狀態(tài)應(yīng)用正確的過(guò)濾器;6.工具116生成支持屏幕(組件402)a.工具116決定通知基本布局1600最佳方法(見(jiàn)下述圖16),i.對(duì)于大于4個(gè)可視通知信息字段1604,推薦字段1604的堆疊(垂直)布局1602,ii.對(duì)于小于4個(gè)可視通知信息字段1604,推薦字段的行(流)布局1606,b.開(kāi)發(fā)者指示用戶是否應(yīng)該i.查看結(jié)果并修改相同頁(yè)面上的過(guò)濾器,I.優(yōu)點(diǎn)較少的頁(yè)面遍歷,II.缺點(diǎn)焦點(diǎn)訪問(wèn)每個(gè)可編輯的過(guò)濾器字段,III.見(jiàn)下面參考圖17的統(tǒng)一屏幕討論,ii.查看結(jié)果并修改分離頁(yè)面上的過(guò)濾器,I.優(yōu)點(diǎn)快速滾動(dòng)通知,II.確定必須進(jìn)入另一屏幕以編輯過(guò)濾器,III.見(jiàn)下面參考圖18的分離屏幕討論c.開(kāi)發(fā)者可以將額外字段1604附加到不是通知過(guò)濾器標(biāo)準(zhǔn)的一部分而是可能是通知結(jié)果的一部分的顯示中(即,映射到5.a中生成的通知數(shù)據(jù)類型);以及7.完成工作流組件404開(kāi)發(fā)(全部或局部),并且直接調(diào)用或者通過(guò)隨后的向?qū)?04調(diào)用隨后的編輯器/查看器600、602。
統(tǒng)一屏幕例如,圖17示出了用于通知結(jié)果和過(guò)濾器的統(tǒng)一可視化的生成屏幕1700。這里示出了行布局,但是對(duì)于屏幕的行為沒(méi)有影響。黑和白框1702映射到通知的字段(字段A至D)。黑框1702被認(rèn)為只讀,而白框1702可以修改。主屏幕將靜態(tài)標(biāo)準(zhǔn)1707顯示為只讀。用戶能夠修改通知以及觸發(fā)改變動(dòng)作1705(這可能不是菜單項(xiàng)的結(jié)果,而是改變字段的默認(rèn)行為)的提醒標(biāo)準(zhǔn)1706。更新訂閱腳本1710負(fù)責(zé)發(fā)送適當(dāng)?shù)耐ㄖ?或提醒消息。添加1712菜單項(xiàng)將用戶轉(zhuǎn)換到新通知屏幕1704,其中可以指定通知和提醒字段以及訂閱的靜態(tài)標(biāo)準(zhǔn)1707。提交按鈕1714調(diào)用創(chuàng)建訂閱腳本1716,其發(fā)送適當(dāng)?shù)挠嗛喯?。最后,去?718菜單項(xiàng)運(yùn)行腳本1720,其去除當(dāng)前通知和相關(guān)訂閱。
分離屏幕圖18示出了用于分離的結(jié)果和過(guò)濾器修改屏幕的生成屏幕1800。這里示出了行布局,但是對(duì)于屏幕的行為沒(méi)有影響。黑和白框1802映射到通知的字段(字段A至D)。黑框1802被認(rèn)為只讀,而白框1802可以修改。主屏幕1806在重復(fù)布局1808中顯示了所有先前設(shè)立的通知結(jié)果。不能從該屏幕1806修改過(guò)濾器。改變1810菜單項(xiàng)將用戶轉(zhuǎn)換到屏幕1812,其中顯示單個(gè)通知。在該屏幕1812中不修改靜態(tài)標(biāo)準(zhǔn)1814,而是可以更新通知字段,以生成重新訂閱。更新訂閱腳本1814將負(fù)責(zé)發(fā)送適當(dāng)?shù)挠嗛喯?,包括是否修改了提醒和通知過(guò)濾器。添加1818菜單項(xiàng)將用戶轉(zhuǎn)換到屏幕1814,其中可以指定通知和提醒過(guò)濾器以及訂閱的靜態(tài)標(biāo)準(zhǔn)1814。提交按鈕1822調(diào)用創(chuàng)建訂閱腳本1824,其發(fā)送適當(dāng)?shù)挠嗛喯?。最后,去?818菜單項(xiàng)運(yùn)行腳本1820,其去除當(dāng)前通知和相關(guān)訂閱。
示例將使用來(lái)自“AG、RE、IDE通知”文檔的天氣通知示例來(lái)說(shuō)明該模式658b。
1.開(kāi)發(fā)者指向天氣通知web服務(wù),2.開(kāi)發(fā)者選擇通知復(fù)雜對(duì)象作為通知對(duì)象,3.開(kāi)發(fā)者指示他們將接收提醒以及通知,a.開(kāi)發(fā)者指示提醒將不指定其自身的標(biāo)準(zhǔn),只是允許將其打開(kāi)及關(guān)閉生成復(fù)選框,4.工具116開(kāi)始建立通知標(biāo)準(zhǔn),a.開(kāi)發(fā)者指示來(lái)自通知的自動(dòng)類型,b.開(kāi)發(fā)者指示算符==,c.開(kāi)發(fā)者指示與枚舉類型值“提醒”、“預(yù)報(bào)”、“報(bào)告”比較生成下拉按鈕,d.開(kāi)發(fā)者為過(guò)濾器部件命名提醒類型,e.開(kāi)發(fā)者指示利用算符&&添加另一過(guò)濾器部件,f.開(kāi)發(fā)者指示來(lái)自通知的字段‘溫度差(temperatureDiff)’,g.開(kāi)發(fā)者指示算符==,h.開(kāi)發(fā)者指示與枚舉數(shù)字范圍5、10、15、20、25、30、25、40比較生成下拉按鈕,i.開(kāi)發(fā)者為過(guò)濾器部件命名溫度差,j.開(kāi)發(fā)者指示利用算符&&添加最終過(guò)濾器部件,k.開(kāi)發(fā)者指示來(lái)自通知的字段‘原始天氣’,l.開(kāi)發(fā)者指示算符?。?,m.開(kāi)發(fā)者指示來(lái)自通知的字段‘新天氣’i.工具詢問(wèn)開(kāi)發(fā)者這是否為條件字段ii.開(kāi)發(fā)者指示是生成復(fù)選框n.開(kāi)發(fā)者為過(guò)濾器部件命名天氣改變5.工具116識(shí)別沒(méi)有包括在通知標(biāo)準(zhǔn)中的一組通知字段,6.開(kāi)發(fā)者指示存在要包括在訂閱中的額外字段。它們不能由用戶動(dòng)態(tài)改變,只能在設(shè)立新訂閱時(shí)指定(靜態(tài)標(biāo)準(zhǔn)),7.開(kāi)發(fā)者通過(guò)針對(duì)通知的位置、國(guó)家和州中每一個(gè)指定自由形式輸入框,向過(guò)濾器添加部件4。針對(duì)邏輯算符重復(fù)應(yīng)用部件4的機(jī)制為每一個(gè)生成編輯框,8.工具116基于靜態(tài)和通知標(biāo)準(zhǔn)中的字段數(shù)目推薦堆疊布局,9.開(kāi)發(fā)者從統(tǒng)一屏幕或分離屏幕方法中選擇,以便修改通知標(biāo)準(zhǔn),10.工具116生成a.針對(duì)提醒+通知的必需訂閱消息,i.生成布爾標(biāo)記,指示是否選擇了天氣改變復(fù)選框,b.包括所有過(guò)濾器的必需映射文件,i.針對(duì)天氣改變過(guò)濾器部件的分離過(guò)濾器,c.必須退訂消息d.利用堆疊布局的屏幕,i.在除了添加通知屏幕之外的所有屏幕中,靜態(tài)標(biāo)準(zhǔn)字段都是標(biāo)簽ii.通知標(biāo)準(zhǔn)字段在添加通知屏幕和改變通知屏幕以及主屏幕(如果利用統(tǒng)一屏幕的話)中是可編輯的,iii.為每個(gè)過(guò)濾器部件提供的標(biāo)簽附加到相應(yīng)的編輯框、復(fù)選框或下拉按鈕。
消息內(nèi)容目標(biāo)模式658a該模式658a用來(lái)確定什么元素受到消息影響。消息的目標(biāo)通常是屏幕402和數(shù)據(jù)400組件。該模式選擇658a中包括如下問(wèn)題利用手頭的消息定義,如何指定接收消息對(duì)應(yīng)用程序的效果;正在使用自下至上方法模式650a,或者正在定義自己的消息集合;以及希望將這些消息連接到應(yīng)用程序105的某些元素,以指定消息接收如何影響應(yīng)用程序105行為。要考慮的示例設(shè)計(jì)參數(shù)是消息接收以某種方式影響應(yīng)用程序105的操作;消息接收可以具有一組標(biāo)準(zhǔn)效果。根據(jù)以上描述,模式658b可以引導(dǎo)開(kāi)發(fā)者(通過(guò)顯示器206或者用戶接口202的其他手段)進(jìn)行如下操作(僅作為示例)1.利用具有手頭的消息定義的消息編輯器712,開(kāi)發(fā)者可以指定消息
a.生成數(shù)據(jù)組件400實(shí)例下面定義了由應(yīng)用程序網(wǎng)關(guān)AG用來(lái)將通過(guò)網(wǎng)絡(luò)10的應(yīng)用程序消息收發(fā)與WSDL中定義的web服務(wù)SOAP消息聯(lián)系起來(lái)的示例映射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&lt;a href=′http://www.serviceobjects.com/products/default.asp′target=′new′>our website&lt;/a>&lt;br/>&lt;br/>&lt;ahref=′http://www.serviceobjects.com′target=′new′>&lt;imgsrc=′http://www.serviceobjects.com/images/so_logo_2_inside.gif′border=′0′/>&lt;/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下面定義了可采納應(yīng)用程序105的jar文件(要提供給設(shè)備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下面定義了應(yīng)用程序105工作流腳本(例如,工作流組件406),在提供給設(shè)備100時(shí),可以增強(qiáng)上面給出的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(文檔類型定義))下面定義了應(yīng)用程序105的示例文檔結(jié)構(gòu)。<!ENTITY%commonFieldAttrs′name CDATA#REQUIREDtype(string|integer|decimal|boolean|date|data|enumeration)"string"component IDREF#IMPLIEDarray(true|false)"false"′><!ENTITY%commonCtrlAttrs′name CDATA#REQUIREDinValue CDATA#IMPLIEDplacement CDATA#IMPLIEDstyle 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 applicationname CDATA#REQUIREDuri CDATA#REQUIREDentry IDREF#IMPLIEDvendor CDATA#IMPLIEDversion CDATA#IMPLIEDsize CDATA#IMPLIEDicon CDATA#IMPLIEDpersistence(reliable|performant)"performant"messageDelivery(standard|bestEffort|reliable)"standard"><!ELEMENT desc(#PCDATA)><!ELEMENT dependency EMPTY><!ATTLIST dependencytype(application|application|runtime|feature)"application"value CDATA#IMPLIEDversion CDATA#IMPLIED><!ELEMENT resource EMPTY><!--mimeType:text/xml,image/gif,image/jpeg,media/pme, --><!ATTLIST resourcename ID#REQUIREDurl CDATA#REQUIREDmimeType CDATA#REQUIRED
deferred(true|false)"false"><!ELEMENT global(value*)><!ATTLIST global%commonFieldAttrs;><!ELEMENT enumeration(value+)><!ATTLIST enumerationname 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 dataname ID#REQUIREDprototype CDATA#IMPLIEDpersist(true|false)#IMPLIEDkey 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 messagename ID#REQUIREDprototype IDREF#IMPLIEDscript IDREF#IMPLIEDsecure(true|false)#IMPLIED><!--attrib mapping maps mfield to data.field--><!ELEMENT mappedField EMPTY><!ATTLIST mappedFieldname CDATA#REQUIREDmapping CDATA#IMPLIED><!ELEMENT alert EMPTY><!--perhaps an inbox alert later--><!ATTLIST alertbeep(true|false)"false"ribbon(true|false)"false"
dialogText CDATA#IMPLIED><!ELEMENT style EMPTY><!ATTLIST stylename ID#REQUIREDfont CDATA#IMPLIEDsize CDATA#IMPLIEDbold(true|false)"false"italic(true|false)"false"underline(true|false)"false"fgColor CDATA#IMPLIEDbgColor CDATA#IMPLIEDbgImage IDREF#IMPLIED><!ELEMENT screen(param*,var*,(%nestedCtrlElements;|repetition),menu ,onInit )><!--no menu for dialog--><!--attr refreshMsg points to message--><!ATTLIST screenname ID#REQUIREDtitle CDATA#IMPLIEDdialog(true|false)"false"layout(grid|flow|vertical)#REQUIREDstyle IDREF#IMPLIEDrefreshMsg IDREFS#IMPLIED><!--local variable for a screen;can be mapped to--><!ELEMENT var EMPTY><!ATTLIST varname CDATA#REQUIREDcomponent IDREF#REQUIRED><!ELEMENT region(condition ,%nestedCtrlElements;)><!ATTLIST regionlayout(grid|flow|vertical)#REQUIREDplacement CDATA#IMPLIEDstyle IDREF#IMPLIED><!--item/control visibility condition--><!ELEMENT condition EMPTY><!ATTLIST conditionparams CDATA#IMPLIEDscript IDREF#REQUIREDonTrue(show|hide)"show"><!ELEMENT onInit EMPTY><!ATTLIST onInitparams CDATA#IMPLIEDscript IDREF#IMPLIED><!ELEMENT onChange EMPTY><!ATTLIST onChangeparams CDATA#IMPLIEDscript IDREF#IMPLIED><!ELEMENT onFocusOut EMPTY><!ATTLIST onFocusOutparams CDATA#IMPLIEDscript IDREF#IMPLIED><!--transaction can be used to accept/rollback changes on the screen--><!ELEMENT onClick EMPTY><!ATTLIST onClickparams CDATA#IMPLIEDtransition IDREF#IMPLIEDtransaction(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#IMPLIEDcollapsible(true|false)"false"><!ELEMENT menu(item*)><!ELEMENT item(condition ,onClick)><!ATTLIST itemname CDATA#REQUIREDinValue 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#IMPLIEDreadOnly(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#IMPLIEDreadOnly(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#IMPLIEDformat CDATA#IMPLIEDtype(list|dropdown|radio)"radio"visibleRows CDATA#IMPLIED><!ELEMENT multiChoice(condition ,onInit ,onChange )><!ATTLIST multiChoice%commonCtrlAttrs;
mapping CDATA#IMPLIEDformat CDATA#IMPLIEDtype(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 scriptname ID#REQUIRED><!ELEMENT param EMPTY><!ATTLIST paramname CDATA#REQUIREDcomponent IDREF#REQUIRED>
雖然這里的公開(kāi)針對(duì)一個(gè)或多個(gè)示例性系統(tǒng)和方法,但是本領(lǐng)域的技術(shù)人員將清楚許多變化,包括除了在描述模式648時(shí)用于示例性目的那些之外的其他適當(dāng)編輯器600和查看器602的替換。另外,應(yīng)該認(rèn)識(shí)到,用戶接口202和顯示器206可以被一起定義為工具116的用戶接口。雖然在所提供的示例中使用了XML和ECMAScript的子集,但是可以使用其他語(yǔ)言和語(yǔ)言變體來(lái)定義組件應(yīng)用程序。例如,可以使用所提出的E4X標(biāo)準(zhǔn)腳本語(yǔ)言代替ECMAScript。另外,除了上述XML之外的其他結(jié)構(gòu)化定義語(yǔ)言可以包括例如但不限于資源描述框架(RDF)、XSLT和XHTML。
權(quán)利要求
1.一種用于協(xié)調(diào)應(yīng)用程序開(kāi)發(fā)的系統(tǒng),其中應(yīng)用程序包括具有以結(jié)構(gòu)化定義語(yǔ)言表達(dá)的定義的第一組件和具有指令序列的第二組件,這些組件用于定義對(duì)設(shè)備與數(shù)據(jù)源之間通過(guò)網(wǎng)絡(luò)傳送的消息的設(shè)備運(yùn)行時(shí)環(huán)境的處理,所述系統(tǒng)包括第一開(kāi)發(fā)模式模塊,被配置為與計(jì)算機(jī)用戶接口所提供的開(kāi)發(fā)環(huán)境交互,第一開(kāi)發(fā)模式模塊用于向用戶接口的用戶指導(dǎo)多個(gè)預(yù)定步驟,以通過(guò)經(jīng)由用戶接口的用戶輸入事件來(lái)協(xié)調(diào)應(yīng)用程序組件的開(kāi)發(fā),第一開(kāi)發(fā)模式模塊被配置為基于以第一開(kāi)發(fā)模式模塊為中心的組件類型從多個(gè)模式中選擇第一模式,用于從多個(gè)類型中進(jìn)行選擇的組件類型包括數(shù)據(jù)、消息、屏幕和工作流中至少一個(gè);以及第一模塊,其與所選擇的組件類型相對(duì)應(yīng),并且被配置為耦合到第一開(kāi)發(fā)模式模塊,所述第一模塊用于通過(guò)與提供應(yīng)用程序持久狀態(tài)的開(kāi)發(fā)環(huán)境的數(shù)據(jù)模型交互來(lái)開(kāi)發(fā)至少一個(gè)組件的定義,利用通過(guò)用戶接口傳送到用戶的多個(gè)預(yù)定步驟來(lái)協(xié)調(diào)第一模塊的操作;其中,所開(kāi)發(fā)的組件實(shí)質(zhì)上被組裝為應(yīng)用程序。
2.根據(jù)權(quán)利要求1所述的系統(tǒng),還包括第二開(kāi)發(fā)模式模塊,被配置為與計(jì)算機(jī)用戶接口所提供的開(kāi)發(fā)環(huán)境交互,所述第二開(kāi)發(fā)模式模塊耦合到第一開(kāi)發(fā)模式模塊,從而第一開(kāi)發(fā)模式模塊與第二開(kāi)發(fā)模式模塊協(xié)作,第二開(kāi)發(fā)模式模塊用于向用戶接口的用戶指導(dǎo)多個(gè)預(yù)定步驟中的一部分,以通過(guò)經(jīng)由用戶接口的用戶輸入事件來(lái)協(xié)調(diào)應(yīng)用程序組件的開(kāi)發(fā),第二開(kāi)發(fā)模式模塊被配置為基于以第二開(kāi)發(fā)模式模塊為中心的組件類型從多個(gè)模式中選擇第二模式。
3.根據(jù)權(quán)利要求2所述的系統(tǒng),其中第一模式是主模式,被配置為直接選擇模塊,或者通過(guò)與作為副模式的第二模式協(xié)作來(lái)間接選擇模塊。
4.根據(jù)權(quán)利要求2或3所述的系統(tǒng),其中第二模式是副模式,被配置為將組件開(kāi)發(fā)的協(xié)調(diào)返回給作為主模式的第一模式。
5.根據(jù)權(quán)利要求4所述的系統(tǒng),其中主模式采用預(yù)定步驟,以幫助選擇與所選擇的組件類型相對(duì)應(yīng)的第二模塊,其中所選擇的組件類型不同于第一模塊的組件類型。
6.根據(jù)權(quán)利要求4或5所述的系統(tǒng),其中副模式將組件開(kāi)發(fā)的協(xié)調(diào)返回給與原始主模式不同的另一主模式。
7.根據(jù)權(quán)利要求1至6中任一項(xiàng)所述的系統(tǒng),其中從如下各項(xiàng)中選擇第一模式用于基于可用后端數(shù)據(jù)源消息收發(fā)描述來(lái)生成合適的應(yīng)用程序的模式;用于基于可用后端數(shù)據(jù)源消息收發(fā)描述來(lái)開(kāi)發(fā)合適的應(yīng)用程序從而所開(kāi)發(fā)的整個(gè)應(yīng)用程序包括數(shù)據(jù)組件和屏幕組件的模式;用于基于現(xiàn)有數(shù)據(jù)庫(kù)模式開(kāi)發(fā)應(yīng)用程序105的模式;和/或用于開(kāi)發(fā)對(duì)應(yīng)用程序的特定業(yè)務(wù)域建模的數(shù)據(jù)組件標(biāo)準(zhǔn)集合的模式。
8.根據(jù)權(quán)利要求1至6中任一項(xiàng)所述的系統(tǒng),其中從如下各項(xiàng)中選擇第一模式用于協(xié)調(diào)作為第一組件的屏幕組件的開(kāi)發(fā)的屏幕模式;用于協(xié)調(diào)作為第一組件的消息組件的開(kāi)發(fā)的消息模式;和/或用于協(xié)調(diào)作為第二組件的工作流組件的開(kāi)發(fā)的腳本模式。
9.根據(jù)權(quán)利要求8所述的系統(tǒng),其中作為第一組件的數(shù)據(jù)組件是通過(guò)應(yīng)用從如下各項(xiàng)中選擇的第一模式來(lái)開(kāi)發(fā)的屏幕模式和/或消息模式。
10.根據(jù)權(quán)利要求2至9中任一項(xiàng)所述的系統(tǒng),其中從如下各項(xiàng)中選擇第二模式用于協(xié)調(diào)作為第一組件的屏幕組件的開(kāi)發(fā)的屏幕模式;用于協(xié)調(diào)作為第一組件的消息組件的開(kāi)發(fā)的消息模式;和/或用于協(xié)調(diào)作為第二組件的工作流組件的開(kāi)發(fā)的腳本模式。
11.根據(jù)權(quán)利要求10所述的系統(tǒng),其中作為第一組件的數(shù)據(jù)組件是通過(guò)應(yīng)用從如下各項(xiàng)中選擇的第二模式來(lái)開(kāi)發(fā)的屏幕模式和/或消息模式。
12.根據(jù)權(quán)利要求1至11中任一項(xiàng)所述的系統(tǒng),其中模塊還包括命令裝置,被配置為訪問(wèn)并改變數(shù)據(jù)模型的狀態(tài)。
13.根據(jù)權(quán)利要求12所述的系統(tǒng),其中模塊被配置為受到響應(yīng)于命令裝置、來(lái)自數(shù)據(jù)模型的事件通知的影響。
14.根據(jù)權(quán)利要求1至13中任一項(xiàng)所述的系統(tǒng),其中從編輯器和/或查看器中選擇模塊。
15.根據(jù)權(quán)利要求14所述的系統(tǒng),其中從如下各項(xiàng)中選擇模塊屏幕模塊;數(shù)據(jù)模塊;消息模塊;工作流模塊;消息和數(shù)據(jù)關(guān)系模塊;后端可視化器模塊;本地化模塊;腳本編輯器模塊;測(cè)試模塊;數(shù)據(jù)和屏幕關(guān)系模塊;和/或?qū)Ш侥K。
16.根據(jù)權(quán)利要求2至15中任一項(xiàng)所述的系統(tǒng),其中第二模式是生效器模式,用于確認(rèn)代表應(yīng)用程序消息的數(shù)據(jù)模型與消息收發(fā)操作的數(shù)據(jù)源呈現(xiàn)一致。
17.根據(jù)權(quán)利要求16所述的系統(tǒng),其中生效器模式將模塊的操作協(xié)調(diào)為具有從如下各項(xiàng)中選出的功能的生效器模塊工作流組件的工作流完整性;組件的參數(shù)和字段級(jí)映射的一致性;屏幕組件的屏幕控制映射的一致性;屏幕組件的屏幕刷新消息的一致性;確認(rèn)消息組件中消息重復(fù)的存在;確認(rèn)組件中數(shù)據(jù)重復(fù)的存在;和/或使代表數(shù)據(jù)源消息收發(fā)關(guān)系的數(shù)據(jù)模型生效。
18.根據(jù)權(quán)利要求1至17中任一項(xiàng)所述的系統(tǒng),其中從如下各項(xiàng)中選擇組件用于定義應(yīng)用程序所使用的數(shù)據(jù)實(shí)體的數(shù)據(jù)組件;用于定義顯示在設(shè)備上的應(yīng)用程序的外觀和行為的屏幕組件;用于定義應(yīng)用程序用來(lái)與數(shù)據(jù)源通信的消息的格式的消息組件;和/或用于定義在要執(zhí)行動(dòng)作時(shí)出現(xiàn)的應(yīng)用程序處理的工作流組件。
19.根據(jù)權(quán)利要求1至18中任一項(xiàng)所述的系統(tǒng),其中數(shù)據(jù)模型包含從如下各項(xiàng)中選擇的模型成分?jǐn)?shù)據(jù)組件定義;全局變量定義;消息組件定義;資源定義;屏幕組件定義;腳本;風(fēng)格定義;和/或數(shù)據(jù)源的映射描述符。
20.根據(jù)權(quán)利要求2至19中任一項(xiàng)所述的系統(tǒng),還包括第三模式模塊,用于指導(dǎo)開(kāi)發(fā)者選擇最適于當(dāng)前應(yīng)用程序開(kāi)發(fā)活動(dòng)的第一模式,從包括如下各項(xiàng)的組中選擇第一模式用于基于可用后端數(shù)據(jù)源消息收發(fā)描述來(lái)生成合適的應(yīng)用程序的模式;用于基于可用后端數(shù)據(jù)源消息收發(fā)描述來(lái)開(kāi)發(fā)合適的應(yīng)用程序從而所開(kāi)發(fā)的整個(gè)應(yīng)用程序包括數(shù)據(jù)組件和屏幕組件的模式;用于基于現(xiàn)有數(shù)據(jù)庫(kù)模式開(kāi)發(fā)應(yīng)用程序105的模式;和/或用于開(kāi)發(fā)對(duì)應(yīng)用程序的特定業(yè)務(wù)域建模的數(shù)據(jù)組件標(biāo)準(zhǔn)集合的模式。
21.一種用于協(xié)調(diào)應(yīng)用程序開(kāi)發(fā)的方法,其中應(yīng)用程序包括具有以結(jié)構(gòu)化定義語(yǔ)言表達(dá)的定義的第一組件和具有指令序列的第二組件,這些組件用于定義對(duì)設(shè)備與數(shù)據(jù)源之間通過(guò)網(wǎng)絡(luò)傳送的消息的設(shè)備運(yùn)行時(shí)環(huán)境的處理,所述方法包括如下步驟選擇第一開(kāi)發(fā)模式模塊,所述第一開(kāi)發(fā)模式模塊被配置為與計(jì)算機(jī)用戶接口所提供的開(kāi)發(fā)環(huán)境交互;通過(guò)第一開(kāi)發(fā)模式模塊向用戶接口的用戶指導(dǎo)多個(gè)預(yù)定步驟,以通過(guò)經(jīng)由用戶接口的用戶輸入事件來(lái)協(xié)調(diào)應(yīng)用程序組件的開(kāi)發(fā),第一開(kāi)發(fā)模式模塊被配置為基于以第一開(kāi)發(fā)模式模塊為中心的組件類型從多個(gè)模式中選擇第一模式,用于從多個(gè)類型中進(jìn)行選擇的組件類型包括數(shù)據(jù)、消息、屏幕和工作流中至少一個(gè);選擇與所選擇的組件類型相對(duì)應(yīng)并且配置為耦合到第一模式的第一模塊;以及利用第一模塊通過(guò)與提供應(yīng)用程序持久狀態(tài)的開(kāi)發(fā)環(huán)境的數(shù)據(jù)模型交互來(lái)開(kāi)發(fā)至少一個(gè)組件的定義,利用通過(guò)用戶接口傳送到用戶的多個(gè)預(yù)定步驟來(lái)協(xié)調(diào)第一模塊的操作;其中,所開(kāi)發(fā)的組件實(shí)質(zhì)上被組裝為應(yīng)用程序。
22.根據(jù)權(quán)利要求21所述的方法,其中第二開(kāi)發(fā)模式模塊被配置為與計(jì)算機(jī)用戶接口所提供的開(kāi)發(fā)環(huán)境交互,所述第二開(kāi)發(fā)模式模塊耦合到第一開(kāi)發(fā)模式模塊,從而第一開(kāi)發(fā)模式模塊與第二開(kāi)發(fā)模式模塊協(xié)作,第二開(kāi)發(fā)模式模塊用于向用戶接口的用戶指導(dǎo)多個(gè)預(yù)定步驟中的一部分,以通過(guò)經(jīng)由用戶接口的用戶輸入事件來(lái)協(xié)調(diào)應(yīng)用程序組件的開(kāi)發(fā),第二開(kāi)發(fā)模式模塊被配置為基于以第二開(kāi)發(fā)模式模塊為中心的組件類型從多個(gè)模式中選擇第二模式。
23.根據(jù)權(quán)利要求22所述的方法,還包括如下步驟通過(guò)被配置為主模式的第一模式直接選擇模塊,或者通過(guò)與作為副模式的第二模式協(xié)作來(lái)間接選擇模塊。
24.根據(jù)權(quán)利要求22或23所述的方法,還包括如下步驟由作為副模式的第二模式將組件開(kāi)發(fā)的協(xié)調(diào)返回給作為主模式的第二模式。
25.根據(jù)權(quán)利要求24所述的方法,其中主模式采用預(yù)定步驟,以幫助選擇與所選擇的組件類型相對(duì)應(yīng)的第二模塊,其中所選擇的組件類型不同于第一模塊的組件類型。
26.根據(jù)權(quán)利要求24或25所述的方法,其中副模式將組件開(kāi)發(fā)的協(xié)調(diào)返回給與原始主模式不同的另一主模式。
27.根據(jù)權(quán)利要求21至26中任一項(xiàng)所述的方法,其中從如下各項(xiàng)中選擇第一模式用于基于可用后端數(shù)據(jù)源消息收發(fā)描述來(lái)生成合適的應(yīng)用程序的模式;用于基于可用后端數(shù)據(jù)源消息收發(fā)描述來(lái)開(kāi)發(fā)合適的應(yīng)用程序從而所開(kāi)發(fā)的整個(gè)應(yīng)用程序包括數(shù)據(jù)組件和屏幕組件的模式;用于基于現(xiàn)有數(shù)據(jù)庫(kù)模式開(kāi)發(fā)應(yīng)用程序105的模式;和/或用于開(kāi)發(fā)對(duì)應(yīng)用程序的特定業(yè)務(wù)域建模的數(shù)據(jù)組件標(biāo)準(zhǔn)集合的模式。
28.根據(jù)權(quán)利要求21至27中任一項(xiàng)所述的方法,其中從如下各項(xiàng)中選擇第一模式用于協(xié)調(diào)作為第一組件的屏幕組件的開(kāi)發(fā)的屏幕模式;用于協(xié)調(diào)作為第一組件的消息組件的開(kāi)發(fā)的消息模式;和/或用于協(xié)調(diào)作為第二組件的工作流組件的開(kāi)發(fā)的腳本模式。
29.根據(jù)權(quán)利要求28所述的方法,其中作為第一組件的數(shù)據(jù)組件是通過(guò)應(yīng)用從如下各項(xiàng)中選擇的第一模式來(lái)開(kāi)發(fā)的屏幕模式和/或消息模式。
30.根據(jù)權(quán)利要求22至29中任一項(xiàng)所述的方法,其中從如下各項(xiàng)中選擇第二模式用于協(xié)調(diào)作為第一組件的屏幕組件的開(kāi)發(fā)的屏幕模式;用于協(xié)調(diào)作為第一組件的消息組件的開(kāi)發(fā)的消息模式;和/或用于協(xié)調(diào)作為第二組件的工作流組件的開(kāi)發(fā)的腳本模式。
31.根據(jù)權(quán)利要求30所述的方法,其中作為第一組件的數(shù)據(jù)組件是通過(guò)應(yīng)用從如下各項(xiàng)中選擇的第二模式來(lái)開(kāi)發(fā)的屏幕模式和/或消息模式。
32.根據(jù)權(quán)利要求21至30中任一項(xiàng)所述的方法,還包括如下步驟由模塊生成命令,用于訪問(wèn)并改變數(shù)據(jù)模型的狀態(tài)。
33.根據(jù)權(quán)利要求32所述的方法,還包括如下步驟由響應(yīng)于命令來(lái)自數(shù)據(jù)模型的事件通知影響模塊。
34.根據(jù)權(quán)利要求21至33中任一項(xiàng)所述的方法,其中從編輯器和/或查看器中選擇模塊。
35.根據(jù)權(quán)利要求34所述的方法,其中從如下各項(xiàng)中選擇模塊屏幕模塊;數(shù)據(jù)模塊;消息模塊;工作流模塊;消息和數(shù)據(jù)關(guān)系模塊;后端可視化器模塊;本地化模塊;腳本編輯器模塊;測(cè)試模塊;數(shù)據(jù)和屏幕關(guān)系模塊;和/或?qū)Ш侥K。
36.根據(jù)權(quán)利要求22至35中任一項(xiàng)所述的方法,其中第二模式是生效器模式,用于確認(rèn)代表應(yīng)用程序消息的數(shù)據(jù)模型與消息收發(fā)操作的數(shù)據(jù)源呈現(xiàn)一致。
37.根據(jù)權(quán)利要求36所述的方法,其中生效器模式將模塊的操作協(xié)調(diào)為具有從如下各項(xiàng)中選出的功能的生效器模塊工作流組件的工作流完整性;組件的參數(shù)和字段級(jí)映射的一致性;屏幕組件的屏幕控制映射的一致性;屏幕組件的屏幕刷新消息的一致性;確認(rèn)消息組件中消息重復(fù)的存在;確認(rèn)組件中數(shù)據(jù)重復(fù)的存在;和/或使代表數(shù)據(jù)源消息收發(fā)關(guān)系的數(shù)據(jù)模型生效。
38.根據(jù)權(quán)利要求21至37中任一項(xiàng)所述的方法,其中從如下各項(xiàng)中選擇組件用于定義應(yīng)用程序所使用的數(shù)據(jù)實(shí)體的數(shù)據(jù)組件;用于定義顯示在設(shè)備上的應(yīng)用程序的外觀和行為的屏幕組件;用于定義應(yīng)用程序用來(lái)與數(shù)據(jù)源通信的消息的格式的消息組件;和/或用于定義在要執(zhí)行動(dòng)作時(shí)出現(xiàn)的應(yīng)用程序處理的工作流組件。
39.根據(jù)權(quán)利要求21至38中任一項(xiàng)所述的方法,其中數(shù)據(jù)模型包含從如下各項(xiàng)中選擇的模型成分?jǐn)?shù)據(jù)組件定義;全局變量定義;消息組件定義;資源定義;屏幕組件定義;腳本;風(fēng)格定義;和/或數(shù)據(jù)源的映射描述符。
40.根據(jù)權(quán)利要求22至39中任一項(xiàng)所述的方法,還包括如下步驟由第三模式指導(dǎo)開(kāi)發(fā)者選擇最適于當(dāng)前應(yīng)用程序開(kāi)發(fā)活動(dòng)的第一模式,從如下各項(xiàng)中選擇第一模式用于基于可用后端數(shù)據(jù)源消息收發(fā)描述來(lái)生成合適的應(yīng)用程序的模式;用于基于可用后端數(shù)據(jù)源消息收發(fā)描述來(lái)開(kāi)發(fā)合適的應(yīng)用程序從而所開(kāi)發(fā)的整個(gè)應(yīng)用程序包括數(shù)據(jù)組件和屏幕組件的模式;用于基于現(xiàn)有數(shù)據(jù)庫(kù)模式開(kāi)發(fā)應(yīng)用程序105的模式;和/或用于開(kāi)發(fā)對(duì)應(yīng)用程序的特定業(yè)務(wù)域建模的數(shù)據(jù)組件標(biāo)準(zhǔn)集合的模式。
41.一種用于協(xié)調(diào)應(yīng)用程序開(kāi)發(fā)的計(jì)算機(jī)程序產(chǎn)品,其中應(yīng)用程序包括具有以結(jié)構(gòu)化定義語(yǔ)言表達(dá)的定義的第一組件和具有指令序列的第二組件,這些組件用于定義對(duì)設(shè)備與數(shù)據(jù)源之間通過(guò)網(wǎng)絡(luò)傳送的消息的設(shè)備運(yùn)行時(shí)環(huán)境的處理,所述計(jì)算機(jī)程序產(chǎn)品包括計(jì)算機(jī)可讀介質(zhì),包括可在根據(jù)權(quán)利要求1至20中任一項(xiàng)所述的系統(tǒng)上執(zhí)行的程序代碼裝置,用于實(shí)現(xiàn)根據(jù)權(quán)利要求21至40中任一項(xiàng)所述的方法。
42.一種移動(dòng)通信設(shè)備,包括根據(jù)權(quán)利要求1至20中任一項(xiàng)所述的系統(tǒng)。
43.一種通信網(wǎng)絡(luò)系統(tǒng),包括至少一個(gè)根據(jù)權(quán)利要求42所述的移動(dòng)通信設(shè)備。
全文摘要
公開(kāi)一種用于協(xié)調(diào)應(yīng)用程序開(kāi)發(fā)的系統(tǒng)和方法。該系統(tǒng)和方法包括第一開(kāi)發(fā)模式模塊,被配置為與計(jì)算機(jī)用戶接口所提供的開(kāi)發(fā)環(huán)境交互,第一開(kāi)發(fā)模式模塊用于向用戶接口的用戶指導(dǎo)多個(gè)預(yù)定步驟,以通過(guò)經(jīng)由用戶接口的用戶輸入事件來(lái)協(xié)調(diào)應(yīng)用程序組件的開(kāi)發(fā)。第一開(kāi)發(fā)模式模塊被配置為基于以第一開(kāi)發(fā)模式為中心的組件類型,從多個(gè)模式中選擇,從而從多個(gè)類型中選擇的組件類型包括數(shù)據(jù)、消息、屏幕和工作流中至少一個(gè)。該系統(tǒng)和方法還包括第一模塊,用于通過(guò)與提供應(yīng)用程序持久狀態(tài)的開(kāi)發(fā)環(huán)境的數(shù)據(jù)模型交互來(lái)開(kāi)發(fā)至少一個(gè)組件的定義。利用通過(guò)用戶接口傳送到用戶的多個(gè)預(yù)定步驟來(lái)協(xié)調(diào)第一模塊的操作;所開(kāi)發(fā)的組件實(shí)質(zhì)上被組裝為應(yīng)用程序。
文檔編號(hào)G06F9/44GK1834908SQ20061006783
公開(kāi)日2006年9月20日 申請(qǐng)日期2006年3月14日 優(yōu)先權(quán)日2005年3月14日
發(fā)明者邁克爾·謝菲爾德, 布賴恩·戈林, 丹尼爾·馬德蘇 申請(qǐng)人:捷訊研究有限公司