專利名稱:用于改進(jìn)消息代理中的消息語法分析的方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明一般涉及企業(yè)應(yīng)用集成程序,更具體地涉及由消息代理執(zhí)行的消息分析功能,該消息代理轉(zhuǎn)換從第一應(yīng)用接收的消息的內(nèi)容,以使該消息內(nèi)容易于被目標(biāo)應(yīng)用理解。
背景技術(shù):
隨著面向消息的中間件(MOM)程序的使用,不同種類的應(yīng)用無需明白它們之間的通信方式就可以通信。使用異步通信協(xié)議,MOM程序提供以無連接模式松散連接的應(yīng)用之間地消息管理。MOM維護(hù)消息傳輸層,并為應(yīng)用管理消息隊列。然而,使用MOM服務(wù)的每個應(yīng)用需要知道與它通信的應(yīng)用的消息格式。
為了提供更深度的企業(yè)應(yīng)用集成(EAI),使應(yīng)用適應(yīng)于作為利用使用實時消息機(jī)制(例如,公布/預(yù)訂、請求/答復(fù)、同步、異步)進(jìn)行通信的面向交易來出現(xiàn)。一種新的編程層,消息代理程序,負(fù)責(zé)瀏覽消息內(nèi)容以識別消息類型、查看對應(yīng)的消息格式、識別消息的邏輯內(nèi)容、必要時修改消息內(nèi)容、啟動對目標(biāo)應(yīng)用的格式化適應(yīng)、以及把消息路由發(fā)送到MOM隊列或直接路由發(fā)送到目標(biāo)應(yīng)用。一個例子是IBM的WebSphere MQIntegrator V2(在本文檔中記為WMQI)(在某些國家,IBM、WebSphere和MQIntegrator是IBM公司的商標(biāo))。
EAI軟件廠商目前出售的消息代理支持二進(jìn)制形式的(C語言或者面向商業(yè)的通用語言(Cobol)消息)消息、可選地包括固定格式(諸如SWIFT、EDI、或者FIX消息)的標(biāo)記消息、或者已標(biāo)記但靈活的自描述消息例如符合XML協(xié)議。
可以用不同的分析程序來產(chǎn)生消息代理,每個分析程序執(zhí)行對不同消息類型的語法(syntactical)分析。通常,消息代理程序提供接口以添加更多的分析程序。然而,消息代理不能支持諸如電子郵件消息的更高程度靈活的語法消息。這類消息以基于上下文無關(guān)語言的消息的名義而公知。在本文檔的其余部分,將把這類消息稱為‘電子郵件之類(e-mail like)’類型的消息。WMQI消息代理支持XML類型的消息或者Cobol之類定制電報格式(Custom WireFormat)消息或者標(biāo)記消息。這些電子郵件之類類型的消息是具有不能由COBOL或C結(jié)構(gòu)或標(biāo)記描述的更復(fù)雜結(jié)構(gòu)的消息。作為例子,電子郵件地址可以在地址的任何位置上包括“(”和“)”之間任選的注解。根據(jù)描述電子郵件語法的RFC2822,表達(dá)Dupont.(I am the greatest)Marc@(the)Vegas.WBA是個有效的地址,并且等價于Dupont.Marc@Vegas.WBA或者甚至等價于Dupont.(I am).(the)Marc(greatest)@(The)Vegas(in nevada).WBA。如果消息包含這樣一個可變的內(nèi)容文本,那么因為這樣注釋發(fā)生在任何位置,所以固定的分析不能處理它,并且使用″(″的標(biāo)記描述將導(dǎo)致太復(fù)雜的定義。此外,因為這些消息的解釋依賴于大量序列的記號(token)而不是一個簡單的標(biāo)記/值或者甚至標(biāo)記/副標(biāo)記遞規(guī)序列,所以這些消息包含不能用固定的標(biāo)記描述的語法結(jié)構(gòu)。結(jié)果,到現(xiàn)在為止的存在于修改消息代理分析程序的解決方法將導(dǎo)致要重復(fù)執(zhí)行大量代碼,以將已標(biāo)記的或者數(shù)據(jù)結(jié)構(gòu)化的消息記號發(fā)現(xiàn)施加到消息中的多個任何位置,即,和這些位置被這些高度靈活的消息的語法所批準(zhǔn)的次數(shù)一樣多。此外,不能用這樣的語法分析來覆蓋所有的新情況。該方案的另一個缺點將是用于維護(hù)目的的對應(yīng)碼的低水平質(zhì)量。
要注意的是,為了用新分析程序來豐富當(dāng)前的消息代理,到現(xiàn)在為止,可以使用由大多數(shù)消息代理所提供的分析程序插件API。WMQI提供了C語言API來添加分析程序,使得只要能得到合適的分析程序,就能處理任何給定消息類型或者格式。任何插入到消息代理中的新分析程序應(yīng)該也適配為提供與存儲器中的邏輯消息表述兼容的輸出格式,這是消息代理的其它功能(路由發(fā)送、格式化)所期望的。
發(fā)明內(nèi)容
本發(fā)明的目的是添加能夠處理諸如電子郵件消息的高度靈活的語法消息的消息代理分析程序。
通過使用如權(quán)利要求1至6所要求保護(hù)的方法來達(dá)到這些目的,該方法用于用針對電子郵件之類類型的消息的分析程序增強(qiáng)在數(shù)據(jù)處理系統(tǒng)中運行的消息代理。該方法包括起始步驟,通過給上下文無關(guān)編程語言生成器提供與所述電子郵件之類類型的消息的語法對應(yīng)的LL(k)文法(grammar)的規(guī)則,用所述上下文無關(guān)編程語言生成器來生成編譯程序的源代碼;然后,用所述編譯程序源代碼產(chǎn)生可執(zhí)行代碼;并在消息代理中安裝并生成作為針對所述電子郵件之類類型的消息的新分析程序的可執(zhí)行代碼;當(dāng)消息代理接收到消息并識別該消息為所述電子郵件之類類型的時候,用該可執(zhí)行代碼將所述消息作為上下文無關(guān)編程語言來分析;通常,由翻譯程序(translator)和鏈接編輯程序使用由編譯程序在存儲器中建立的消息的邏輯表達(dá),以從消息生成可執(zhí)行代碼。在本發(fā)明的情況下,由消息代理的接下來的處理步驟來使用作為執(zhí)行前述步驟的輸出的消息的邏輯表達(dá)。
用包括適配為執(zhí)行根據(jù)權(quán)利要求1至6中任何一項的方法的裝置的計算系統(tǒng)也實現(xiàn)這些目的。
因為以一組本領(lǐng)域技術(shù)人員可以方便地定義的LL(k)文法規(guī)則為基礎(chǔ),可以分析這些消息的語法,所以基于上下文無關(guān)語言的消息可以以LL(k)文法為基礎(chǔ)。到目前為止對高級編程語言編譯公知的LL(k)文法被特別適配為對基于上下文無關(guān)語言的消息的語法分析。
通過使用LL(k)文法,記號(token)發(fā)現(xiàn)過程被適應(yīng)于基于上下文無關(guān)語言的消息,從而避免了已標(biāo)記地或數(shù)據(jù)結(jié)構(gòu)化地使用的重復(fù)記號發(fā)現(xiàn)過程為基礎(chǔ)的算法的弱點。一個結(jié)果是執(zhí)行語法分析的對應(yīng)代碼的良好品質(zhì),以及對該代碼的維護(hù)的簡化。
本發(fā)明的一個優(yōu)點是可能重新使用基于現(xiàn)有LL(k)文法的編程語言編譯程序生成器,開發(fā)者通常使用該編程語言編譯程序生成器來產(chǎn)生與其生成的新高級編程語言對應(yīng)的新編譯程序。
通過本發(fā)明的解決方案,購買消息代理以建立EAI環(huán)境的顧客可以使用插入到消息代理的接口的分析程序,來添加電子郵件之類類型的消息分析程序。消息代理程序廠商可以通過將這樣的分析程序添加到消息代理程序來豐富程序。使用本發(fā)明的解決方案,消息代理程序廠商也可以包括作為程序部分的編譯程序生成器以及其對應(yīng)樹適應(yīng)部分,并使用戶自己把分析程序插入到消息代理中,以處理用戶期望的任何類型的電子郵件類型消息。
圖1圖解允許一組不同應(yīng)用一起通信的EAI環(huán)境;
圖2示出根據(jù)優(yōu)選實施例的消息代理的邏輯塊,其實施為在計算機(jī)系統(tǒng)中執(zhí)行的程序;
圖3示出根據(jù)優(yōu)選實施例的消息代理的方法的總體流程圖4示出根據(jù)優(yōu)選實施例的生成在用于代理消息的方法中使用的分析程序的方法的流程圖5示出了根據(jù)優(yōu)選實施例的用于分析電子郵件之類類型的消息的方法的流程圖。
具體實施例方式
圖1圖解了消息代理(105)在用于典型的商業(yè)環(huán)境的企業(yè)應(yīng)用集成程序中的使用。一組應(yīng)用(140)可以在通過公用或私用的局域(150)或廣域網(wǎng)(130)通信的不同計算機(jī)上運行。EAI程序優(yōu)選地安裝并運行在連接到應(yīng)用計算機(jī)的分離計算機(jī)上。任何應(yīng)用都可以從其它應(yīng)用接收消息,并送還回答或通過EAI計算機(jī)向其它應(yīng)用發(fā)送新請求。通過公用網(wǎng)絡(luò)連接到SMTP服務(wù)器(140)的孤立用戶(110、120)也可以通過EAI程序與應(yīng)用通信。通過EAI程序通信的應(yīng)用根據(jù)其開發(fā)時間可能使用不同的編程語言,其也可以在計算機(jī)上使用不同的硬件和操作系統(tǒng)。MOM軟件(115)使用諸如HTTP或者TCP/IP的公共傳輸協(xié)議,來執(zhí)行與應(yīng)用間的異步通信。將MOM接收的消息發(fā)送到消息代理,該消息代理瀏覽消息的內(nèi)容,并將消息路由發(fā)送到針對目標(biāo)應(yīng)用的MOM隊列。消息代理軟件層已經(jīng)適合于應(yīng)用環(huán)境,其知道消息格式、處理規(guī)則,并支持不同類型的消息。根據(jù)本發(fā)明的優(yōu)選實施例,消息代理能夠接收電子郵件之類類型的消息。
圖2描述了根據(jù)優(yōu)選實施例的消息代理(200)的程序邏輯塊。虛線描述電子郵件之類類型的消息在消息代理邏輯塊中所使用的路徑。消息代理通過輸入/輸出接口邏輯塊(250)從應(yīng)用接收消息。該輸入/輸出接口可以是不同的類型消息代理可以具有與應(yīng)用(241、215)間的直接API接口,或者可以具有對MOM的接口,該MOM為所有應(yīng)用(例如HTTP)處理(235、245、265)公共傳輸層。該接口邏輯塊的輸出是包含需要由消息代理處理并傳輸?shù)侥繕?biāo)應(yīng)用的信息的字節(jié)流。由消息代理經(jīng)由MOM接收電子郵件之類類型的消息(245)。消息類型識別塊(255)把消息字節(jié)流切換到分析程序邏輯塊(260、265、270)之一。分析程序執(zhí)行對消息的語法分析,并且提供下述內(nèi)容作為輸出如果消息包含語法錯誤就提供例外錯誤,或者存儲器中消息代理用來建立目標(biāo)應(yīng)用所期望的精確格式的消息的邏輯表達(dá)。在圖2中表示了多于一個分析程序,每個分析程序?qū)?yīng)于特定的消息類型。一些分析程序可以由消息代理提供,而另一些分析程序可以使用在大多數(shù)消息代理中可得到的分析程序插件API來添加。將電子郵件之類類型的消息發(fā)送到特定的分析程序(270),該分析程序是根據(jù)優(yōu)選實施例產(chǎn)生的基于上下文無關(guān)文法的編程語言編譯程序,后面將參考相同的附圖來描述該優(yōu)選實施例。由分析程序?qū)ο⒆止?jié)流執(zhí)行的語法分析的結(jié)果是存儲在存儲器中的消息的邏輯表達(dá)。需要注意的是,大多數(shù)消息代理具有對消息的基于樹的表達(dá)。根據(jù)用作電子郵件類型消息分析程序的編譯程序的類型,由分析程序產(chǎn)生的消息的邏輯表達(dá)可以不需要適合于消息代理(280)的接下來的邏輯塊使用的存儲器中的邏輯表達(dá)。因此,新邏輯塊(275)說明將消息的基于樹的表達(dá)重新格式化為在處理邏輯塊之后的消息代理所期望的新的基于樹的表達(dá)的適應(yīng)。然后在消息內(nèi)容處理邏輯塊(280)中使用該樹來產(chǎn)生目標(biāo)應(yīng)用所期望的消息內(nèi)容。根據(jù)EAI環(huán)境管理員所定義的處理規(guī)則(290)來執(zhí)行該處理。處理規(guī)則用于分析特定的消息語義內(nèi)容(例如,更新銀行帳戶的消息格式),并執(zhí)行邏輯路由發(fā)送。根據(jù)特定的處理規(guī)則,在處理中也可以豐富規(guī)則,以使消息內(nèi)容處理邏輯塊(280)也可以計算目標(biāo)應(yīng)用所期望的新領(lǐng)域。然后通過輸入/輸出接口邏輯塊(250),將消息內(nèi)容發(fā)送到一個或多個目標(biāo)應(yīng)用或者M(jìn)OM中的一個或多個特定消息對列。將消息格式(295)施加到輸出接口(250),以產(chǎn)生目標(biāo)應(yīng)用所期望的物理字節(jié)流。
根據(jù)優(yōu)選實施例,消息代理包括一個新邏輯塊,即針對基于LL(k)文法的編程語言(242)的編譯程序生成器。其可以是現(xiàn)有技術(shù)的編譯程序生成器,例如,對于Java代碼,可以是縮寫為JAVACC的JAVA編譯程序的編譯程序(JAVA Compiler Compiler)(`JAVA Compiler Compiler`是Sun Microsystems的商標(biāo)),或者對于Java代碼或者C++代碼,可以是可從ANTLR網(wǎng)站http//www.antlr.org/.免費下載的ANTLR分析程序生成器。編譯程序生成器為程序員(230)提供了錄入(enter)文法規(guī)則的接口。在輸出端,編譯程序生成器提供了某一語言下的源代碼,作為任何源代碼,其必須能被編譯并被轉(zhuǎn)換成機(jī)器可讀(可執(zhí)行)代碼。作為結(jié)果的可執(zhí)行代碼是基于在生成器中定義的LL(k)文法的編譯程序。其用作新分析程序,以對消息代理接收的新的電子郵件之類類型的消息進(jìn)行語法分析。事實上,就像輸入字節(jié)流是編程語言源代碼一樣,由基于LL(k)文法的編譯程序邏輯塊分析作為電子郵件之類類型的消息內(nèi)容的輸入字節(jié)流。塊(270)的輸出是計算機(jī)的存儲器中存儲的電子郵件之類類型的消息的邏輯表達(dá)。還添加讀取存儲器中的消息的邏輯表達(dá)的新邏輯塊(275),并使該新邏輯塊適應(yīng)于消息代理(280)的下一個激活的邏輯塊所期望的消息的邏輯(通?;跇?表達(dá),所述消息代理(280)處理并格式化用于目標(biāo)應(yīng)用的消息。要注意的是,LL(k)文法編譯程序的輸出中提供的消息內(nèi)容的邏輯表達(dá)也是基于樹的。樹適應(yīng)邏輯塊存在于存儲器中的樹的重新排列中。
通常,發(fā)明新編程語言的程序員使用基于LL(k)文法的編譯程序生成器,來為他們的新語言產(chǎn)生編譯程序。編譯程序生成器為程序員提供描述語法規(guī)則的接口?,F(xiàn)有技術(shù)的編譯程序提供了錄入LL(k)文法規(guī)則的編程語言。也可以用圖形用戶界面來錄入文法規(guī)則。一旦錄入了文法規(guī)則,程序員就激活新編譯程序的源代碼的輸出中提供的生成器。程序員編譯新編譯程序的源代碼,并獲得用于編譯將使用新編程語言生成的源代碼的可執(zhí)行程序。新編譯程序讀取新編程語言源代碼文件,并執(zhí)行對該代碼的語法分析。程序員首先使用新編譯程序來識別代碼中的所有錯誤。在開發(fā)用新編程語言寫的程序的期間,用語法錯誤檢測來`調(diào)試′源代碼。編譯程序的一個常用性能標(biāo)準(zhǔn)首先是其檢測編程語言錯誤的能力。當(dāng)沒有錯誤地執(zhí)行編譯程序時,該編譯程序停止,并在存儲器中存儲所分析的源代碼的邏輯表達(dá)。翻譯程序和鏈接編輯程序使用該輸出來產(chǎn)生可執(zhí)行代碼。由編譯程序的開發(fā)者產(chǎn)生這個后面的程序。這個后面的程序是這樣的程序其讀取已經(jīng)由編譯程序存儲到存儲器中的已分析的源代碼的邏輯表達(dá),并產(chǎn)生可以由計算機(jī)執(zhí)行的可執(zhí)行代碼。
當(dāng)在優(yōu)選實施例中使用基于LL(k)文法的編譯程序,以分析電子郵件之類類型的消息的時候,如果沒有語法錯誤,則存儲器中電子郵件之類消息的邏輯表達(dá)用于消息代理的接下來的操作。一個適應(yīng)程序?qū)⑿薷南⒋碓谟嬎銠C(jī)的存儲器中的表達(dá)。
因為可以通過LL(k)文法的規(guī)則良好地定義每一個電子郵件之類類型的消息語法,所以使上述內(nèi)容變得可能。電子郵件之類類型的消息的一個類型對應(yīng)于特定的LL(k)文法。將參考在本文檔中后面提供的電子郵件消息分析的例子來說明這一點。
通過定義與這種電子郵件之類類型的消息對應(yīng)的LL(k)文法、產(chǎn)生LL(k)文法編譯程序的邏輯塊(在優(yōu)選實施例中由編譯程序生成器產(chǎn)生)、并產(chǎn)生與該編譯程序?qū)?yīng)(或者在優(yōu)選實施例中與編譯程序生成器產(chǎn)生的所有編譯程序?qū)?yīng))的適應(yīng)邏輯塊,可以將電子郵件之類類型的消息分析程序添加到消息代理,該邏輯塊能夠?qū)⒕幾g程序分析的消息在存儲器中的邏輯表達(dá)讀取成在消息代理中使用的表達(dá)。
因為電子郵件消息類型的語法接近于高級編程語言,并通過文法規(guī)則進(jìn)行了良好的定義,所以有可能使用基于LL(k)文法的編譯程序來分析電子郵件的消息類型。典型的LL文法(k是作為在找到終端之前發(fā)現(xiàn)并檢查規(guī)則的記號的最大數(shù)量的預(yù)期最大數(shù)量),其中,第一個L代表對輸入信息從左到右的掃描,而第二個L代表產(chǎn)生最左端導(dǎo)出式(也稱為自上而下的分析)。分析程序首先找到根之子(children of root)等等。其還產(chǎn)生能夠映射到大多數(shù)消息代理的語法樹的語法樹。LL文法編譯程序能夠分析任何種類的輸入,包括不可打印的二進(jìn)制輸入,這使其甚至更適合于EAI類型的消息分析。
圖3示出了根據(jù)優(yōu)選實施例的消息代理的方法的總體流程圖。根據(jù)優(yōu)選實施例,在運行支持電子郵件之類類型的消息的消息代理之前,EAI管理員必須產(chǎn)生對應(yīng)的分析程序。為了實現(xiàn)這一點,管理員執(zhí)行可以并行進(jìn)行的兩個初始步驟。一個初始步驟是生成基于LL(k)文法的編程語言編譯程序可執(zhí)行程序。另一個初始步驟是產(chǎn)生能夠讀取由編譯程序編譯的源代碼文件在存儲器中的邏輯表達(dá)、并以與消息代理兼容的方式產(chǎn)生源代碼的等價邏輯表達(dá)的程序。在生成器存儲器表達(dá)與消息代理兼容的情況下,第二步驟是可選的。如果使用與消息代理的廠商不同的廠商的現(xiàn)有編譯程序生成器,則不得不執(zhí)行適應(yīng)程序。如果為了消息代理的目的來開發(fā)編譯程序生成器,則該表達(dá)將直接是消息代理的表達(dá)。這個適應(yīng)程序是為了用生成器產(chǎn)生第一電子郵件之類類型的消息分析程序而產(chǎn)生的。一旦產(chǎn)生,適應(yīng)程序?qū)⒂糜谒杏孟嗤善魃傻姆治龀绦?。要注意的是,基于LL(k)文法的編程語言的編譯程序在存儲器中使用已編譯代碼的基于樹的表達(dá)。大多數(shù)消息代理也使用它們處理的消息的基于樹的邏輯表達(dá)。
當(dāng)生成電子郵件之類類型的分析程序時,其在消息代理中生成以便消息類型識別辯認(rèn)這種類型的消息并將其發(fā)送給新分析程序。用于在消息代理中生成并安裝新分析程序的工具是消息代理基本功能的一部分。新的電子郵件之類類型的消息一旦被安裝,就由消息代理用來與使用這類消息的應(yīng)用對接。假設(shè)消息代理從EAI接口接收字節(jié)流,則第一步驟是識別消息的類型。在消息類型識別邏輯塊中使用消息報頭中的一些信息或者在它自己的屬性中指定的一些信息,來確定如何分析消息體
-如果消息具有可辯認(rèn)的路由發(fā)送報頭,在報頭中識別的域用于決定調(diào)用那個消息分析程序。
-如果消息不具有可辯認(rèn)的報頭,或者報頭不識別域,但是在消息類型識別邏輯塊中的屬性指示了消息的域,則調(diào)用該屬性所指定的分析程序。指定的分析程序可以是插件分析程序如電子郵件之類類型的消息分析程序。
-如果不能識別消息域,則將消息作為二進(jìn)制對象處理。
一旦識別了消息類型,且如果是電子郵件之類類型的消息,則將字節(jié)流發(fā)送到用一個或兩個步驟初始化進(jìn)程產(chǎn)生的對應(yīng)的電子郵件之類類型的分析程序。在接下來的步驟中,由基于LL(k)文法的編譯程序?qū)ψ止?jié)流進(jìn)行語法分析,如同字節(jié)流是編程語言源代碼一樣。因為消息是不可辯認(rèn)的,所以分析的結(jié)果可能是語法錯誤。當(dāng)電子郵件之類類型的語法正確時,該結(jié)果是位于計算機(jī)的存儲器中的輸入消息的(通?;跇涞?邏輯表達(dá)。在下一個步驟中適應(yīng)這個表達(dá)。如前所述,根據(jù)如何產(chǎn)生分析程序,上一個步驟是可選的。下一個步驟是處理該消息的內(nèi)容,如同該消息的內(nèi)容是XML或者Cobol類型的消息一樣。上一個步驟是把這個電子郵件之類類型的消息路由發(fā)送到目標(biāo)應(yīng)用,就像在消息代理中對任何類型的消息所進(jìn)行的一樣。在消息代理中上兩個步驟沒有改變。
圖4描述了在消息代理中能夠支持電子郵件之類類型的消息的分析程序的初始化步驟。通常由EAI程序管理員執(zhí)行初始化,管理員需要與支持這類消息的新應(yīng)用對接。第一步驟是激活為這個目的而開發(fā)的、或者可以是JAVACC或ANTLR的LL(k)文法編譯程序生成器。在本文檔的后面接下來的說明性例子中,使用了ANTLR。管理員錄入文法規(guī)則,該文法規(guī)則定義了新應(yīng)用所支持的電子郵件之類類型的消息的語法。在本文檔后面的說明性例子中,消息是RFC2822所定義的電子郵件消息。生成器產(chǎn)生分析程序源代碼,管理員用該代碼生成可執(zhí)行代碼。必要時,如果編譯程序在存儲器中產(chǎn)生的樹結(jié)構(gòu)與在消息代理中定義的樹結(jié)構(gòu)不兼容,則生成消息邏輯表達(dá)適應(yīng)程序,以把編譯程序在存儲器中產(chǎn)生的樹結(jié)構(gòu)映射到在消息代理中定義的樹結(jié)構(gòu)。當(dāng)管理員想添加第二個電子郵件之類類型的分析程序時,我們簡直是(only not)重復(fù)邏輯表達(dá)適應(yīng)的上一步驟。上一步驟是包括編譯程序,且可能的話,包括例如使用分析程序插件API的消息代理中的適應(yīng)程序。
圖5示出根據(jù)優(yōu)選實施例的在消息代理中執(zhí)行的電子郵件之類類型的分析操作的流程圖。第一步驟是讀取與消息代理傳輸?shù)膶⒁治龅南?yīng)的字節(jié)流。在優(yōu)選實施例中,第二步驟是激活編譯程序,該編譯程序通過發(fā)現(xiàn)所使用的語法并與在編譯程序生成階段存儲的文法規(guī)則進(jìn)行比較來執(zhí)行分析。與分析同時地,編譯程序在存儲器內(nèi)建立消息的邏輯表達(dá)。如果編譯程序找到語法錯誤,編譯程序就停止,并且將例外消息發(fā)送到消息代理,該消息代理本身將錯誤消息發(fā)送到源應(yīng)用。如果編譯程序完成語法分析而沒有錯誤,則該編譯程序?qū)⒃诖鎯ζ髦械南⒌倪壿嫳磉_(dá)的索引(reference)返回給消息代理。如果需要適應(yīng),則將該索引給予邏輯表達(dá)適應(yīng)程序,所述邏輯表達(dá)適應(yīng)程序自動啟動并將被索引的消息邏輯表達(dá)映射到適應(yīng)于消息代理的表達(dá)。適應(yīng)消息把消息的適應(yīng)邏輯表達(dá)的索引返回給消息代理。
作為例子,EAI管理員可以根據(jù)優(yōu)選實施例決定產(chǎn)生并在消息代理中包括針對RFC2822定義的電子郵件消息的分析程序。管理員可以使用ANTLR,即一種能夠從ANTLR網(wǎng)站http//www.antlr.org/.免費下載的用于Java代碼或C++代碼的編譯程序生成器。ANTLR提供文本輸入以描述文法。RFC2822用于使用如下的代碼來錄入文法規(guī)則
class eMailParser extends Parser; options{buildAST=true;}/*Build a syntax tree*/ message(fields)*; fields(from |to |sender |reply_to |subject |return_path |date |received |message id<!-- SIPO <DP n="9"> --><dp n="d9"/> )(CRLF|body); bodyBody{#body=#([BODY,″Body text″],#body);};/*{#body=..}creates a<br/>dummy tree root named″Body text″*/ from″From^{parseAddress(##);};/*the″^″makes″From″the root of the<br/>AST*/ /*parseAddress(##)sWitches to the eMail address parser*/ sender″Sender″^{parseAddress(##);}; reply_to″Reply-To″^{parseAddress(##);}; to″To″^{parseAddress(##);} subject″Subject″^utext; message_id″Message-ID″^utext; retum_path″Retum-Path″^{parseAddress(##);}; received″Received″^(FWS|WS)*Atom utext; date″Date″^utext; utext(Atom|FWS|NO_WS_CTL|WS |Comma|Dot|At|Colon|Semicolon |Lt|Gt|Escape|KEYWORD |Other_Ascii )*; class eMailLexer extends Lexer;/*Extract of the lexical analysis see full lexer<br/>in te provided source*/ ……………………………………………… protected Atext(ALPHA|DIGIT|//Any character except controls, ″!″|″#″|//Space,and specials. ″$″|″%″|//Used for atoms ″&″|″″|″*″|″+″|″-″|″/″|″=″|″?″| ″^″|″_″|″`″|″{″|″|″|″}″|″~″); Atom(Atext)+(′′{$setType(KEYWORD);})?; …………………………………………………………………
用ANTLR編譯程序生成器可以錄入多于一個文法這符合如RFC2822中描述的可以用兩種文法描述的電子郵件消息語法的特征,一種針對消息本身,一種針對電子郵件地址。并非所有的編譯程序生成器都接受多于一個文法的錄入。然而,在生成器不接受多于一個文法的錄入的情況下,本領(lǐng)域的技術(shù)人員知道如何用一種文法描述電子郵件的語法。
一旦錄入描述文法的文本,就執(zhí)行ANTLR并產(chǎn)生例如C++語言的輸出源代碼文件,該輸出源代碼文件是能夠分析電子郵件消息的編譯程序的源代碼。生成對應(yīng)于編譯程序源代碼的可執(zhí)行代碼,這將是電子郵件分析程序的主要部分。如果管理員第一次使用這個ANTLR生成器,且如果所生成的編譯程序的樹表達(dá)與消息代理不兼容,則管理員必須生成第二可執(zhí)行代碼,以讀取存儲器中的用ANTLR生成的編譯程序自己所生成的樹表達(dá),并生成另一個由將要包括電子郵件分析程序的消息代理所使用的邏輯表達(dá)。以ANTLR文獻(xiàn)來描述這個樹結(jié)構(gòu)。
提供下述電子郵件作為到電子郵件分析程序的字節(jié)流
Receivedfrom x.y.test by example.net via TCP with ESMTP id ABC12345
For<mary@example.net>;21 Nov 1997 10∶05∶43-0600
Receivedfrom machine.example by x.y.test;21 Nov 1997 10∶01∶22-0600FromJohn Doe<jdoe@machine.example>
ToMary Smith<mary@example.net>,from@domain,″sysmail″@
Some-Group.Some-Org,Guess.(I am greatest)Who@(the)Vegas.WBA
Reply-Toreply@domain
Sendersender@domain
SubjectSaying Hello.test of a subject with@special\(characters)(inside
of the#~subject
DateFri,21 Nov 1997 09∶55∶06-0600
Message-ID<1234@local.machine.example>
This is message just to say hello.
So,“hello”.
一旦根據(jù)所描述的方法分析,就得到下面的樹
Message---+--->Receivedfrom x.etc……
+--->Receivedfrom machine.etc……
+--->From-----+--->Angle address+--->display-nameJohn Doe
| +--->local-addressjdoe
| +--->domainmachine.example
|
+--->To------+--->Angle address+--->display-nameMary Smith
| | +--->local addressmary
| | +--->domainexample.net
| |
| +--->Classic address+--->local-addressfrom
| | +--->domaindomain
| |
| +--->Quoted address+--->local-addresssysmail
| | +--->domainSome-Group.Some-Org
| |
| +--->Classic address+--->local-addressGuess.Who
| +--->domainVegas.WBA
|
+--->Reply-To+--->Classic address+--->local-addressreply
| +--->domain domain
|
+--->Sender+--->Classic address+--->local-address;sender
| +--->domaindomain
|
+--->SubjectSaying Hello.test of a subject…………
+--->DateFri,21 Nov 1997………
+--->Message-ID<1234@local.machine…………
+--->Body ofmessage This is a message…………
然后,寫電子郵件分析程序的主程序。該主程序包括用于讀取消息代理提供的電子郵件消息字節(jié)流、并激活用ANTLR產(chǎn)生的編譯程序部分的指令。該主程序還包括讀取編譯程序執(zhí)行的輸出的指令,由于其包括語法錯誤消息和由編譯程序建立的電子郵件消息的基于樹的表達(dá)的索引,所以是雙重的。如果有錯誤消息,則程序結(jié)束,并且可以在存儲器中讀取錯誤消息。如果沒有錯誤消息,則將該索引給予為了樹適應(yīng)而產(chǎn)生的第二可執(zhí)行代碼,在樹適應(yīng)之后,主程序接收消息代理可以使用的電子郵件消息的邏輯表達(dá)的索引。需要注意的是,由于用兩種文法生成編譯程序,所以編譯程序?qū)⒃诖鎯ζ髦薪煞N樹,并且將給出兩個索引作為編譯程序的輸出。對兩個樹執(zhí)行樹適應(yīng),且電子郵件分析程序的主程序結(jié)果包括消息代理可以使用的電子郵件消息的邏輯表達(dá)的兩個索引。
在該例子中,剛產(chǎn)生的電子郵件分析程序可以包括在使用C語言分析程序API的WMQI中。如果電子郵件有正確語法,則消息代理就用輸入的電子郵件字節(jié)流呼叫電子郵件分析程序,并接收錯誤消息或者電子郵件消息樹的索引。消息代理將錯誤消息傳輸?shù)揭l(fā)錯誤消息的源應(yīng)用。如果沒有錯誤,則消息代理使用分析程序給出的兩個樹索引來處理消息內(nèi)容(280),如參考圖2所述。
權(quán)利要求
1.一種用針對電子郵件之類類型的消息的分析程序來增強(qiáng)在數(shù)據(jù)處理系統(tǒng)中運行的消息代理的方法,所述方法包括以下步驟
-通過給上下文無關(guān)編程語言生成器提供與所述電子郵件之類類型的消息的語法對應(yīng)的LL(k)文法的規(guī)則,用所述上下文無關(guān)編程語言生成器生成編譯程序的源代碼;
-用所述編譯程序源代碼產(chǎn)生可執(zhí)行代碼;
-在消息代理中安裝并生成作為針對所述電子郵件之類類型的消息的新分析程序的可執(zhí)行代碼;
-當(dāng)消息代理接收到消息并識別該消息為所述電子郵件之類類型的時候,用該可執(zhí)行代碼將所述消息作為上下文無關(guān)編程語言來處理;
-在前面步驟執(zhí)行的輸出中讀取在存儲器中建立的消息的邏輯表達(dá),并在消息代理的接下來的處理步驟中使用該邏輯表達(dá)。
2.如權(quán)利要求1所述的方法,其特征在于,讀取消息的邏輯表達(dá)的步驟還包括修改該邏輯表達(dá)以使其適應(yīng)于消息代理的接下來的處理步驟所接受的格式的步驟。
3.如權(quán)利要求1或2中的任何一項所述的方法,其特征在于,因為LL(k)文法規(guī)則在所述的消息中不匹配,所以不通過在存儲器中建立消息的邏輯表達(dá)來完成用可執(zhí)行代碼處理所述消息的步驟,而是通過將消息的語法中的例外錯誤發(fā)回消息代理來完成用可執(zhí)行代碼處理所述消息的步驟。
4.如權(quán)利要求1至3中的任何一項所述的方法,其特征在于,在生成步驟中,通過編程語言將LL(k)文法規(guī)則提供給編譯程序生成器。
5.如權(quán)利要求1至3中的任何一項所述的方法,其特征在于,在生成步驟中,通過圖形用戶界面將LL(k)文法規(guī)則提供給編譯程序生成器。
6.如權(quán)利要求1至5中的任何一項所述的方法,其特征在于,通過用可執(zhí)行代碼對所述消息的處理而在存儲器中建立的消息的邏輯表達(dá)是基于樹的表達(dá)。
7.一種計算系統(tǒng),包括適配為執(zhí)行根據(jù)權(quán)利要求1至6中的任何一項的方法的裝置。
全文摘要
公開了一種用針對電子郵件之類類型的消息的分析程序來增強(qiáng)在數(shù)據(jù)處理系統(tǒng)中運行的消息代理的方法。該方法包括起始步驟,通過給上下文無關(guān)編程語言生成器提供與所述電子郵件之類類型的消息的語法對應(yīng)的LL(k)文法的規(guī)則,用所述生成器生成編譯程序的源代碼;然后,用所述編譯程序源代碼產(chǎn)生可執(zhí)行代碼;并在消息代理中安裝并生成作為針對所述電子郵件之類類型的消息的新分析程序的可執(zhí)行代碼;當(dāng)消息代理接收到消息并識別該消息為所述電子郵件之類類型的時候,用該可執(zhí)行代碼將所述消息作為上下文無關(guān)編程語言來分析;通常,由翻譯程序和鏈接編輯程序使用由編譯程序在存儲器中建立的消息的邏輯表達(dá),以從消息生成可執(zhí)行代碼。在本發(fā)明的情況下,由消息代理的接下來的處理步驟來使用作為執(zhí)行前述步驟的輸出的消息的邏輯表達(dá)。
文檔編號G06F9/44GK1735863SQ20038010842
公開日2006年2月15日 申請日期2003年11月14日 優(yōu)先權(quán)日2003年1月7日
發(fā)明者馬克·法曼特 申請人:國際商業(yè)機(jī)器公司