專利名稱:用于打包軟件的方法與系統(tǒng)的制作方法
技術領域:
本發(fā)明涉及計算機系統(tǒng)領域。更具體而言,本發(fā)明涉及計算機軟件插件模塊及其安裝。
背景技術:
在計算機網(wǎng)絡應用中,運行在特定計算機上的應用程序與位于相同計算機或通過網(wǎng)絡連接與其通信的不同計算機上的應用程序交互或使用其是很平常的。計算機領域中的技術在現(xiàn)行的基礎上進行改變,在硬件和軟件技術中都是這樣。因此,網(wǎng)絡環(huán)境中的計算機應用程序常常面臨網(wǎng)絡環(huán)境中的改變,不管它們是程序所使用的軟件應用程序中的改變還是硬件中的改變,如改變用于在網(wǎng)絡環(huán)境中運行服務的機器或連接。適應新技術的挑戰(zhàn)不僅在于終端用戶或客戶端側,而且在于網(wǎng)絡服務提供者。
基本模塊是使客戶端機器和服務器能運行的基本軟件和/或硬件。插件模塊以增值服務擴展基本模塊的功能性,其中增值服務可以是遵循標準的服務或專有服務。插件(plug-in)是用于實現(xiàn)特征或一組特征的最小可識別編譯代碼。在一種實施方式中,插件模塊可以提供基本模塊不支持的新設備類型所需的附加服務。在基本模塊軟件產(chǎn)品產(chǎn)生并運行在客戶端機器上后需要修改或擴展的計算機軟件產(chǎn)品通常利用與軟件產(chǎn)品駐留在其上的客戶端系統(tǒng)接口的插件模塊擴展??蛻舳藱C器必須識別并安裝適當?shù)牟寮酝瓿绍浖U展,并且必須與插件模塊和軟件產(chǎn)品接口。對如何驗證特定插件模塊使用的適當性的所有知識的職責在于期望使用該插件的主計算機系統(tǒng)及所有相關模塊。
隨著軟件產(chǎn)品的生命周期插件模塊添加并發(fā)展,信息的基數(shù)按指數(shù)增長。對現(xiàn)有模塊的升級可能在每次定義新的獨立插件時都需要。例如,在傳統(tǒng)的客戶端-服務器系統(tǒng)中,對系統(tǒng)分布式狀態(tài)信息的管理需要每個客戶端狀態(tài)信息在服務器端的存儲,因此服務會依賴關于客戶端狀態(tài)的特定事實。類似地,服務器存儲關于客戶端可用的特定程序與版本的開銷信息,以便允許服務器與客戶端之間的適當交互。在一種實施方式中,擴展用于在插件模塊擴展時維持兼容性信息。每個新的軟件擴展或插件模塊都產(chǎn)生必須在期望使用新創(chuàng)建插件的所有模塊中維護的新模塊相互依賴性集合。在實際加載插件并向軟件系統(tǒng)提供其服務之前,控制系統(tǒng)必須包含關于插件管理的所有信息。實現(xiàn)插件模塊一般需要用戶的干涉。
服務器與存儲管理體系結構直接導致需要支持多種服務器類型、設備類型、結構類型、服務等,其中結構是用于存儲區(qū)域網(wǎng)絡的另一術語。隨著與體系結構關聯(lián)的管理應用的發(fā)展,需要添加對可能已經(jīng)添加到該體系結構的附加設備、結構類型及服務的支持。所添加的服務可能依賴于基本服務。新服務可能需要與一個或多個依賴的服務版本向后兼容。此外,當客戶的需要增長時,體系結構需要支持應用程序打包和部署模型以便增長收入,而同時減少客戶部署過程中所經(jīng)歷的困難。
一種現(xiàn)有技術解決方案在授予Crow等人的美國專利號6,871,345中示出。這個專利描述了使用具有確定它們需要什么資源的某種自我測量(introspection)能力的插件的插件管理器。插件管理器允許插件的部署。但是,沒有打包插件模塊從而以分層方式分類服務的教義或支持。
因此,需要提供對插件模塊和插件模塊包的內(nèi)部標識符。包標識符應當以分層方式指定,以便支持指定包之間的兼容性確定。
發(fā)明內(nèi)容
本發(fā)明包括用于管理插件包及相關聯(lián)插件模塊的安裝的方法與系統(tǒng)。
在本發(fā)明的一方面,提供了打包軟件的方法。第一標識符指定給一個或多個插件模塊的第一包,該第一包包括具有內(nèi)部命名空間的安裝的插件模塊。第一標識符與內(nèi)部命名空間中的識別數(shù)據(jù)關聯(lián)。此外,一個或多個非安裝插件模塊編譯成第二插件模塊包。第二標識符指定給第二插件模塊包。第二標識符是以與第一包標識符的分層關系指定的,并且其與非安裝插件模塊的內(nèi)部命名空間中的識別數(shù)據(jù)關聯(lián)。其后,第二插件模塊包的第二標識符與第一插件模塊包的第一標識符進行比較,以確定第二包與第一包的兼容性。
在本發(fā)明的另一方面中,提供了包括具有至少一個插件模塊及相關聯(lián)第一標識符的第一包的計算機系統(tǒng)。所安裝的插件模塊具有內(nèi)部命名空間。該第一標識符與所安裝模塊的內(nèi)部命名空間中的識別數(shù)據(jù)關聯(lián)。此外,提供了具有至少一個非安裝插件模塊的第二包。以與第一包的分層方式為第二包指定標識符。此外,第二包標識符與非安裝包的內(nèi)部命名空間中的識別數(shù)據(jù)關聯(lián)。系統(tǒng)中提供了管理器來比較第二標識符與第一標識符,以確定插件模塊包的兼容性。
在本發(fā)明的另一方面,提供了具有計算機可讀介質的物品。介質中的指令被提供用于將第一標識符指定給一個或多個插件模塊的第一包,該第一包包括具有內(nèi)部命名空間的安裝的插件模塊。第一標識符與內(nèi)部命名空間中的識別數(shù)據(jù)關聯(lián)。介質中的指令還被提供用于將一個或多個非安裝插件模塊編譯成第二插件模塊包。第二標識符通過介質中的指令指定給第二插件模塊包。第二標識符是以與第一包標識符的分層關系指定的,并且與非安裝插件模塊的內(nèi)部命名空間中的識別數(shù)據(jù)關聯(lián)。介質中的指令還被提供用于比較第二插件模塊包的第二標識符與第一插件模塊包的第一標識符,并通過所述標識符的比較確定第二插件模塊包與第一插件模塊包的兼容性。
本發(fā)明的其它特征與優(yōu)點將從以下本發(fā)明目前優(yōu)選實施方式的具體描述并聯(lián)系附圖變得顯而易見。
圖1是插件模塊的樣本包的框圖。
圖2是說明插件模塊的兩個樣本包的框圖。
圖3是說明插件模塊的三個樣本包的框圖,每個包具有多個插件模塊且每個包具有不同的版本識別號。
圖4是說明根據(jù)本發(fā)明優(yōu)選實施方式的插件模塊包安裝的流程圖,并建議打印在所發(fā)布專利的第一頁上。
圖5是說明客戶端-服務器環(huán)境中管理器的框圖。
具體實施例方式
概述為插件模塊與插件模塊包的每一個基于與其相關聯(lián)的特性指定唯一的識別數(shù)據(jù)。在每個插件模塊中創(chuàng)建放置識別數(shù)據(jù)的命名空間。在插件模塊的安裝過程中,為安裝指定的插件模塊與先前安裝的插件模塊的兼容性是基于存儲在所安裝插件模塊和先前安裝的插件模塊中的命名空間中的識別數(shù)據(jù)確定的。插件模塊的兼容性僅基于內(nèi)部比較。因此,插件模塊的兼容性消除了在安裝過程中或之前使用外部數(shù)據(jù)或資源的需求。
技術細節(jié)這種方案中的最小軟件單位,即編譯代碼,可以是基本模塊或插件模塊的形式。在一種實施方式中,基本模塊或插件模塊可以是共享庫或Java罐子(jar)文件的形式?;灸K支持存儲設備、結構或服務器的基本配置所需的基本服務。例如,在存儲設備的環(huán)境下,一種基本模塊可以支持一種或多種盤類型,而第二種基本模塊可以支持服務器、磁帶和結構類型。插件模塊與基本模塊的區(qū)別在于它提供基本模塊不支持的新設備類型所需的附加特征。每個插件模塊都是自描述的并且可以包括以下屬性的一個或多個插件名稱、與插件關聯(lián)的版本標識符、插件的性能、依賴性列表和校驗和。插件的屬性可以編譯成代碼并總是在存儲器中。在一種實施方式中,存儲插件屬性的存儲器是易失存儲器。插件的名稱用于開發(fā)、測試和現(xiàn)場支持并且是客戶不可見的。在一種實施方式中,名稱可以是串的形式。類似地,版本標識符也用于開發(fā)、測試和現(xiàn)場支持并且是客戶不可見的。在一種實施方式中,版本標識符是整數(shù)。性能向量可以是指示插件能夠支持的設備的數(shù)據(jù)編譯。在一種實施方式中,性能向量可以是位編譯。依賴性列表可以是傳遞基本或插件模塊與其它模塊與模塊包的兼容性的數(shù)據(jù)編譯。在一種實施方式中,依賴性列表可以是兼容性向量的形式。依賴性的捕捉給出了在基本模塊與插件模塊間分解依賴性問題并使客戶購買包中遺漏的插件的方法。插件字節(jié)碼的校驗和是確保插件的屬性不被破壞的安全特征。在此所描述的屬性,即名稱、版本、性能向量、依賴性列表和校驗和,不應當看做是限制。這個屬性列表可以根據(jù)需要減少或擴充。每個插件都是根據(jù)其包括上述屬性的屬性自描述的。
來自插件的下一級更大的軟件單位是包括零個或一個基本模塊和至少一個插件模塊的包。在一種實施方式中,包可以是插件庫或Java罐子文件的聚合。包是服務器或客戶端機器上的可安裝實體。每個包可以定義成兼容的并指定成對特定的存儲設備、服務器或結構類型起作用。包中的每個插件模塊與同一包中的其它插件模塊是兼容的。在一種實施方式中,包的一個或多個插件可以對位于其它包中的其它插件模塊具有依賴性。圖1是說明插件模塊的樣本包(110)的框圖(100)。如所示出的,包(110)包括多個插件模塊(112)、(114)、(116)、...(120)。在此所示插件模塊的數(shù)量是為了說明,包可以包括比在此所示的更多或更少的插件。圖2是說明插件模塊的兩個樣本包(包1(160)和包2(180))的框圖(150)。第一插件包(160)包括四個插件模塊(162)、(164)、(166)和(168)。第二插件包(180)包括三個插件模塊(182)、(184)和(186)。第一個包(160)的第三個插件模塊(166)示為依賴于第二個包(180)的三個插件模塊(182)、(184)和(186)。
每個插件模塊包都包括版本標識符。在一種實施方式中,包版本標識符是在插件模塊包發(fā)行時生成的。包標識符可以利用來自構成插件模塊包的每個插件模塊的標識符生成。在一種實施方式中,包版本串是在包的管理應用程序發(fā)行之前由打包腳本或java程序生成的。包版本標識符在每次包中的插件模塊版本變化時遞增,以提供分層的打包模型。不管包中插件的版本如何,根據(jù)定義的層次,測試包中具有定義版本的插件模塊是否與包中具有指定的先前版本標識符的插件模塊向后兼容。例如,測試包中具有版本N+1的插件模塊是否與先前包中具有版本N的插件模塊兼容。每個版本的包都具有與插件模塊包層次中最新近改變的插件模塊或添加的插件模塊的相關性,以確保向后兼容性。此外,每個包都可以支持一種或多種服務。服務可以通過確定哪個包(即插件模塊分組(grouping))支持期望的服務來部署。因此,每個插件模塊包將保證相鄰的前一版本的支持,但不保證其它更早版本的支持。
圖3是顯示三個插件包的框圖(200),每個包具有多個插件模塊且每個包具有不同的版本標識號。第一個包,即包1(210),有四個插件,即插件1(212)、插件2(214)、插件3(216)和插件4(218)。此外,第一個包(210)具有版本標識符N(220)。第二個包,即包2(230),是具有兩個附加插件的第一個包(即包1(210))的升級。第二個包,即包2(230),總共有六個插件,即插件1(232)、插件2(234)、插件3(236)、插件4(238)、插件5(240)和插件6(242),及版本標識符(N+10)(244)。插件5(240)和插件6(242)是對包1(210)的添加,而包1中版本N的插件1(212)、插件2(214)、插件3(216)和插件4(218)與包2中版本N+10的插件1(232)、插件2(234)、插件3(236)、插件4(238)是完全一樣的。如所示出的,第二個包(230)的插件5(240)依賴于作為第三個插件包(即包3(250))的一部分的三個其它插件。第三個包,即包3(250),總共有三個插件,即插件10(252)、插件11(254)和插件12(256)。此外,第三個包(250)有版本標識符(N+3)(258)。因此,如所示出的,有三個包括包之間插件相互依賴性的插件包。
在管理應用程序發(fā)行時,創(chuàng)建返回包括包、設備名稱、服務器和/或結構類型及插件名稱的圖的包識別插件。在一種實施方式中,包識別插件可以通過打包腳本或java應用生成。這種圖是利用用于包中每個插件的插件識別類生成的。這個類還捕捉在管理應用發(fā)行之前生成的包版本串。在一種實施方式中,包版本串是通過打包腳本或java程序生成的。這種打包技術在插件模塊和插件包的命名空間中封裝服務器、設備和/或結構類型及服務信息。如此,插件模塊和相關聯(lián)的包是自描述的。用于插件和相關聯(lián)包的版本信息是內(nèi)部維護的。由于所有所需的數(shù)據(jù)都是在插件和/或相關聯(lián)的插件包內(nèi)部維護的,因此在升級安裝過程中不需要查詢在插件和/或相關聯(lián)插件包外部的資源。
圖4是說明用于利用每個插件中保留的自描述信息安裝作為如圖3所示先前安裝包的升級的插件包的處理例子的流程圖(400)。客戶有具有屬性版本(即版本N)的第一個包,即包1。如圖3所示,第一個包包括幾個插件和相關聯(lián)的版本標識符??蛻粝雽姹綨的第一個包升級為版本N+10的第二個包。第二個包中存在的四個插件與版本N的包1中的插件完全相同。但是,不存在于第一個包中的第二個包中的一個插件,即插件5,依賴于不存在于版本N的包1中或版本N+10的包2中的三個插件,即插件10、插件11和插件12。用于將第一插件包升級到第二插件包的處理是利用第二個包中的每個插件檢查其版本依賴性列表啟動的(302),其中版本依賴性列表是存儲在存儲器中的插件的自描述屬性之一。在一種實施方式中,依賴性列表在命名空間中維護。在步驟(302)的發(fā)現(xiàn)處理之后,確定是否有第二個包中的任何插件已經(jīng)發(fā)現(xiàn)了依賴性沖突(304)。在一種實施方式中,依賴性沖突可以是一個升級插件對不存在于所安裝包中或正處于安裝處理的包中的另一個插件的依賴性的形式。例如,如圖3所示,插件11是第三個插件包(即版本N+3的包3)的一部分。步驟(304)的否定響應將導致第二個包的安裝(306)。但是,步驟(304)的肯定響應將導致隨后確定第二個包的安裝是否將與第三個包的安裝一起進行(308)。在這個例子中,步驟(308)的否定響應將停止升級處理(310)。但是,步驟(308)的肯定響應將導致在安裝放置依賴插件的第二個包之前安裝第三個插件包,即版本N+3的包3(312)。在步驟(312)安裝第三個包之后,安裝處理繼續(xù)安裝第二個包,即版本N+10的包2(314)。當相互依賴的包(即第二個包)安裝完成以后,安裝完成。在圖4所示的安裝處理過程中,完成包與相關聯(lián)插件升級所需的所有指令和邏輯都包含在為安裝所指定的包中。用于安裝的所有信息和邏輯都在版本N的包1、版本N+10的包2和版本N+3的包3中維護。因此,在一個或多個插件模塊或插件包的升級過程中,包中的每個插件都查詢其自己的內(nèi)部資源來確定兼容性。
本發(fā)明可以采用硬件實施方式、軟件實施方式或既包含硬件又包含軟件元素的實施方式的形式。在一種實施方式中,本發(fā)明以軟件實現(xiàn),該軟件包含但不限于固件、駐留軟件、微代碼等。
此外,本發(fā)明可以采取可以從計算機可用或計算機可讀介質訪問的計算機程序產(chǎn)品的形式,其中計算機可用或計算機可讀介質提供由計算機或任何指令執(zhí)行系統(tǒng)使用或與其結合使用的程序代碼。為了這種描述,計算機可用或計算機可讀介質可以是能夠包含、存儲、傳送、傳播或傳輸由指令執(zhí)行系統(tǒng)、裝置或設備使用或與其結合使用的程序的任何裝置。
介質可以是電、磁、光、電磁、紅外線或半導體系統(tǒng)(或裝置或設備)或傳播介質。計算機可讀介質的例子包括半導體或固態(tài)存儲器、磁帶、可拆卸計算機盤、隨機存取存儲器(RAM)、只讀存儲器(ROM)、硬磁盤和光盤。目前光盤的例子包括光盤-只讀存儲器(CD-ROM)、讀/寫光盤(CD-R/W)和DVD。
適于存儲和/或執(zhí)行程序代碼的數(shù)據(jù)處理系統(tǒng)將包括至少一個直接或通過系統(tǒng)總線間接耦合到存儲器元件的處理器。存儲器元件可以包括在程序代碼的實際執(zhí)行過程中采用的本地存儲器、大容量存儲設備和提供至少一些程序代碼的臨時存儲以便減少執(zhí)行過程中必須從大容量外存儲設備檢索代碼的次數(shù)的高速緩沖存儲器。
在一種實施方式中,提供管理器來方便包的升級。圖5是說明軟件形式的、客戶端-服務器環(huán)境中的管理器的框圖(500),其中軟件包括但不限于固件、駐留軟件、微代碼等。軟件實現(xiàn)可以采取可以從提供由計算機或任何指令執(zhí)行系統(tǒng)使用或與其結合使用的程序代碼的計算機可用或計算機可讀介質訪問的計算機程序產(chǎn)品的形式。為了說明,圖中只示出了一個服務器(520)和一個客戶端機器(530)。但是,系統(tǒng)可以擴充成包括跨網(wǎng)絡通信的多個客戶端機器和服務器。如所示出的,服務器(520)和客戶端機器(530)每個都分別包括存儲器(524)和(534)。服務器存儲器(524)包括嵌入在其中的管理器(526),而客戶端存儲器(534)包括嵌入在其中的管理器(536)。插件模塊或插件模塊包可以獨立于服務器直接安裝在每個客戶端機器上,或者在有些情況下,通過從服務器管理器接收的指令安裝在每個客戶端機器上。在客戶端機器(530)從服務器(520)接收升級指令的情況下,指令通過各自的管理器(526)和(536)傳送。客戶端管理器(536)跨網(wǎng)絡(540)與服務器管理器(526)通信,以向服務器管理器(526)查詢與指定要在升級過程中安裝的插件模塊或插件模塊包關聯(lián)的標識符。如上面所指出的,插件與包標識符是自描述標識符。管理器解析在所接收的與插件或插件包關聯(lián)的標識符中提供的數(shù)據(jù),以確定與任何先前安裝的模塊或模塊包的兼容性,并方便在圖4中具體示出的包升級的完成。
為了這種描述,計算機可用或計算機可讀介質可以是能夠包含、存儲、傳送、傳播或傳輸由指令執(zhí)行系統(tǒng)、裝置或設備使用或與其結合使用的程序的任何裝置。
相對于現(xiàn)有技術的優(yōu)點每個插件模塊和模塊包都是包括命名空間的自描述實體。每個自描述實體的命名空間中的信息封裝了插件模塊和插件包的服務器、設備和/或結構類型與服務信息。將一個或多個插件模塊放置到包中包括將標識符指定給包。標識符在包的命名空間中維護。在插件模塊包的安裝過程中,查詢包的命名空間來比較包標識符,以確定與先前安裝的插件模塊包的兼容性。標識符是以分層方式指定的,且每個插件模塊包只與相鄰的前一插件模塊包兼容。在比較并證明插件包的兼容性之后,查詢指定給包的單獨插件模塊的命名空間中的依賴性列表,來確定是否需要任何其它的插件模塊包或單獨的插件模塊來支持安裝。命名空間中的數(shù)據(jù)消除了查詢用于安裝的外部源以確定當前安裝與現(xiàn)有基本模塊或先前安裝的插件模塊的兼容性的需求。
可選實施方式應當理解,盡管本發(fā)明的特定實施方式已經(jīng)在此為了說明而進行了描述,但在不背離本發(fā)明主旨與范圍的情況下可以進行各種修改。特別地,可以使用捕捉插件識別類和包識別插件中信息的屬性文件。因此,本發(fā)明的保護范圍只能由以下權利要求及其等價物來限定。
權利要求
1.一種用于打包軟件的方法,包括向一個或多個插件模塊的第一包指定第一標識符,該第一包包括具有內(nèi)部命名空間的安裝的插件模塊,其中所述第一標識符與所述內(nèi)部命名空間中的識別數(shù)據(jù)關聯(lián);將一個或多個非安裝插件模塊編譯成第二插件模塊包;將第二標識符指定給所述第二插件模塊包,其中所述第二標識符是以與所述第一包標識符的分層關系指定的,并與非安裝插件模塊的內(nèi)部命名空間中的識別數(shù)據(jù)關聯(lián);比較所述第二插件模塊包的所述第二標識符與所述第一插件模塊包的所述第一標識符;及通過所述標識符的所述比較,確定所述第二插件模塊包與所述第一插件模塊包的兼容性。
2.如權利要求1所述的方法,還包括比較所述安裝的插件模塊的所述內(nèi)部命名空間識別數(shù)據(jù)與適于安裝的所述第二包的所述插件模塊的所述內(nèi)部命名空間識別數(shù)據(jù)。
3.如權利要求2所述的方法,其中所述包標識符的分層指定支持相鄰指定的包標識符的向后兼容性。
4.如權利要求2所述的方法,其中所述包的所述版本標識符與最新近安裝到所述包的插件模塊相互關聯(lián)。
5.如權利要求1所述的方法,其中所述命名空間封裝選自以下的插件模塊的數(shù)據(jù)服務器、設備、結構類型、所述插件模塊的服務信息及其組合。
6.如權利要求2所述的方法,還包括當所述第二包的所述插件模塊之一依賴于第三插件包中的插件模塊時,在所述第二插件包的安裝過程中安裝所述第三插件包。
7.一種計算機系統(tǒng),包括安裝的插件模塊;至少一個插件模塊的第一包,包括具有內(nèi)部命名空間的安裝的模塊,為該第一包指定了第一標識符,其中所述第一標識符與所述內(nèi)部命名空間中的識別數(shù)據(jù)關聯(lián);至少一個非安裝插件模塊的第二包,其被指定以第二標識符,該第二標識符是以與所述第一包的分層方式的并且與所述非安裝包的內(nèi)部命名空間中的識別數(shù)據(jù)關聯(lián);管理器,適于比較所述第二標識符與所述第一標識符,以確定所述第二包與所述第一包的兼容性。
8.如權利要求7所述的系統(tǒng),還包括所述管理器比較所述安裝的插件模塊的所述內(nèi)部命名空間識別數(shù)據(jù)與適于安裝的所述第二包的所述插件模塊的所述內(nèi)部命名空間識別數(shù)據(jù)。
9.如權利要求8所述的系統(tǒng),其中所述包標識符的分層指定支持相鄰指定的包標識符的向后兼容性。
10.如權利要求8所述的系統(tǒng),其中所述包的所述版本標識符與最新近安裝到所述包的插件模塊相互關聯(lián)。
11.如權利要求7所述的系統(tǒng),其中所述命名空間封裝選自以下的插件模塊的數(shù)據(jù)服務器、設備、結構類型、所述插件模塊的服務信息及其組合。
12.如權利要求8所述的系統(tǒng),還包括第三插件模塊包,其適于當所述第二包的所述插件模塊之一依賴于第三插件模塊包中的插件模塊時,在所述第二插件模塊包的安裝過程中安裝。
全文摘要
自描述插件模塊與插件模塊包的分層打包模型。標識符以分層關系指定給每個插件模塊包,因此相鄰識別出的包是向后兼容的。包標識符是在包內(nèi)部維護的。類似地,插件模塊的識別數(shù)據(jù)是在各自模塊的命名空間中內(nèi)部維護的。插件模塊的相互依賴性是通過在每個模塊的命名空間中維護的數(shù)據(jù)的比較確定的。
文檔編號G06F9/445GK101030144SQ200710004449
公開日2007年9月5日 申請日期2007年1月23日 優(yōu)先權日2006年2月28日
發(fā)明者蘇迪赫·G.·勞, 尤伊迪普·布拉高海恩, 邁克爾·A.·加斯塔德, 姆素·A.·姆夏赫 申請人:國際商業(yè)機器公司