在 Lotus Notes 8 中開發複合應用

genusBIT發表於2009-04-13

複合應用的基本定義與 Property Broker 程式設計模式

那麼什麼是複合應用(Composite Application)?一個標準的定義如下:複合應用是 為了滿足特定的業務目的而被放在一起的一套元件。如果覺得這個定義太抽象,那麼下面這個例子可以給大家一個感性認識。


圖 1. 複合應用範例
圖 1. 複合應用範例

這是一個用 Notes 8 開啟的應用(ComAppTest.NSF),你一眼能看出它和過去你所見到 Notes 的幀結構、檢視、表單等等這些元素全不相同但又似曾相識。在這個應用中,你看到了左上方展示新聞列表的 Notes 檢視,看到了右下方展示每篇新聞內容的 Notes 表單。此外,你還會看到左下方的圖片縮略表,和右上方的圖片大圖展示,但它們都不是 Notes 元素,而是兩個 Eclipse 外掛。所有這些東西(當然,它們有個正式的名稱——元件),為了一個業務目的(展現新聞內容和圖片)而組裝在一起,這就構成了一個複合應用

不只是組裝,元件之間還可以傳遞訊息。還是看上面這個例子,當我們點選左上方新聞列表中的某篇新聞時,會把該新聞的新聞編號傳遞給其他元件,這樣右下方的 Notes 表單元件會根據該編號顯示新聞的詳細資訊,右上方的 Eclipse 元件會根據該編號顯示新聞的圖片內容。這裡我們把所傳遞這個資訊叫做“屬性”(Property),把各個元件根據外來屬性所做的動作稱為“操作”(ActionOperation)。通過 Notes 8 環境中提供的 Property Broker 機制,複合應用可以在不同的元件之間傳遞屬性,執行操作。這種程式設計模式,我們也稱之為 Property Broker 的程式設計模式。


圖 2. Property Broker 程式設計模型
圖 2. Property Broker 程式設計模型

Property Broker 程式設計模式的基本設計理念總結如下:

  • 屬性是型別化的可交換資料
  • 操作是消費屬性的行為
  • 元件定義自身的屬性和操作
  • 連線(Wire)將屬性和操作相關聯

在這種程式設計模式下,程式的開發很大程度上就是元件的開發。而開發元件首先要定義元件的屬性和操作,並把這種定義通過 WSDL 描述出來。然後實現元件屬性的釋出,以及其他元件如何接收屬性並執行對應的操作。開發好元件之後,使用者可以把這些元件加入到一個複合應用中去,並通過連線(wire)將型別匹配的屬性操作相關聯。這樣在複合應用執行時,以上圖為例,當新聞列表發出了一篇新聞的 News ID 作為屬性時,property broker 將通過連線查詢到與之相關的元件和操作,並把該 News ID 值傳遞給相應元件(上例中為縮圖展現元件),由該元件執行縮圖展現操作。

熟悉 IBM WebSphere Portal 開發的人會意識到,這和 Portal 中的點選即動Click To Action 以下簡稱 C2A)的功能非常類似。事實上,不只是形似,Notes 8 中的複合應用在實現上與 Portal 的 C2A 也有非常緊密的關係。舉個例子,為了描述每個元件的屬性和操作,需要有一個 WSDL 描述檔案,而 Notes 8 中這個檔案的格式幾乎完全照搬了 C2A。

如果探循的再深一些你會發現,整個複合應用的概念最早正是來自於 IBM WebSphere Portal。所以我們強調一點:複合應用並不是繫結到 Notes 8 的一種應用模式。複合應用有很多種實現載體(Portal,Lotus Expeditor 等等),Notes 8 上的複合應用只是其中一種。

但無論那種模式,複合應用體現了使用者前端元件化,標準化的趨勢。誰說 SOA 只做企業系統後端的整合?複合應用是對 SOA 前端的一次非常好的詮釋。

複合應用的建立

用 Notes 8 可以開啟兩種形式的複合應用,基於 Portal 的和基於 NSF 的,二者的差別主要在於存放應用檔案(XML 格式)的方式不同。這裡主要介紹基於 NSF 的複合應用。在 Notes 8 中建立一個複合應用是非常簡單的一件事情,因為基於 NSF 的複合應用就是一個 NSF 資料庫,在建立時,和一個傳統的 NSF 資料庫沒有什麼區別。所不同的是選擇模板時必須選擇空白組合應用程式模板。


圖 3. 在 Notes 8 中建立複合應用
圖 3. 在 Notes 8 中建立複合應用

建立之後,你將得到一個空白的複合應用頁面。接下來點選 操作 中的 編輯複合應用,Notes 8 會啟動 CAE(Composite Application Editor)。通過這個工具,你可以把 NSF 元件或者 Eclipse 元件拖拽到這個複合應用的頁面上。此外,通過這個工具,你也可以建立多頁面的複合應用。


圖 4. 複合應用編輯器
圖 4. 複合應用編輯器

建立空白複合應用 NSF,然後填充元件,這就是建立一個複合應用的過程。這個過程本身並不複雜。不過隨之而來一個非常關鍵的問題:這些 NSF 元件和 Eclipse 元件是如何開發的?


Eclipse 元件的開發

當然很多情況下,只依靠 NSF 元件構建 Notes 8 複合應用是不夠的。在做報表展現,圖形處理,以及一些其他業務應用的時候,傳統 Notes 開發會遇到一些瓶頸。在 Notes 8 中,我們可以通過 Eclipse 元件來彌補 NSF 元件功能上的不足。

開發複合應用的 Eclipse 元件需要具有 Eclipse 的外掛(plug in)開發技能。關於 Eclipse 外掛開發細則以及 Eclipse 元件開發環境的配置,請參考 http://www.eclipse.org 上的相關文件,此處不再贅述。

與 NSF 元件一樣,Eclipse 元件的開發同樣遵循著 定義屬性和操作,屬性的釋出,操作的實現 三個步驟。

定義屬性和操作

ImageView 元件為例,該元件接收 NewsIDChanged 屬性(該屬性值為新聞號),執行 ShowImage 操作:顯示該新聞號對應的新聞的圖片。要在 Eclipse 元件中定義該屬性和操作,需要執行下列步驟。


圖 13. Eclipse 元件——ImageView
圖 13. Eclipse 元件——ImageView

首先,建立 WSDL。Eclipse 元件中同樣使用 WSDL 來描述元件的屬性和操作,並且其格式與 NSF 元件的完全一致。這意味著我們同樣可以用前面提到的 Property Broker Editor 這個視覺化工具來編寫 Eclipse 元件的 WSDL(當你已經熟悉了 Eclipse 中複合應用元件的開發之後,你會更願意使用文字編輯工具來編輯)。呼叫 Property Broker Editor 的方法是 \framework\rcp\rcplauncher.exe -config wsdledit


圖 14. 利用 Property Broker Editor 定義 Eclipse 元件的屬性
圖 14. 利用 Property Broker Editor 定義 Eclipse 元件的屬性

利用上圖的 Property Broker Editor 工具我們得到了一個描述檔案 actions.wsdl。接下來,需要把得到的 action.wsdl 匯入到 Eclipse 元件中。在 Eclipse 的專案中,新建一個名為 wsdl(該名稱不做限定)的資料夾,把 WSDL 檔案匯入到該資料夾中。下面這步非常關鍵:在該 Eclipse 外掛的擴充套件中加入 com.ibm.rcp.propertybroker.PropertyBrokerDefinitions,並在該擴充套件下新建一個 handler。


圖 15. 擴充套件 PropertyBrokerDefinitions
圖 15. 擴充套件 PropertyBrokerDefinitions

在這裡,此擴充套件將會把描述檔案 WSDL 與具體實現類相結合。如下圖所示。File 屬性指定為我們剛剛生成的 actions.WSDL 檔案,Type 處選擇 SWT_ACTION,Class 屬性則選定將會具體實現 Eclipse 元件的操作的類 com.ibm.xna.actions.ImageViewAction


圖 16. 擴充套件詳細資訊
圖 16. 擴充套件詳細資訊

儲存後在 Eclipse 外掛的 plugin.xml 中會多出如下程式碼:


清單 5. Eclipse 元件的 Plug.xml 片斷
                
 
…… 
 
…… 
 			
			

至此,我們就完成了 Eclipse 元件屬性和操作的定義工作。需要強調的是,對某些之前沒有接觸過 Eclipse 外掛開發的 Notes 開發者而言,上述內容也許比較陌生,因為要掌握 Eclipse 中的擴充套件,擴充套件點等概念通常需要一些時間。但從長遠來看,考慮到這門技術在未來給他們帶來的價值,這種技術上的投入毫無疑問是值得的。

屬性的釋出

在 Eclipse 元件中,屬性的釋出同樣也非常簡單。這裡我們以另一個 Eclipse 元件 SnapshotView 為例,該元件用於展示若干篇新聞的圖片縮圖。一方面,它可以接受 ImageNewsList 傳遞給它的屬性,執行縮圖展現的操作;另一方面,當使用者點選某篇新聞的縮圖時,它會把該新聞的 NewsID 作為屬性發布出去。在這裡我們只介紹 SnapshotView 元件中屬性發布的實現。


圖 17. 擴充套件詳細資訊
圖 17. 擴充套件詳細資訊

在雙擊某張縮圖時,我們會執行如下的程式碼:

PropertyBrokerUtil.publishProperty("com.ibm.xna",viewID, "NewsIDChanged", id);

其中 PropertyBrokerUtil.publishProperty 方法是我們自定義的一個函式,通過該函式,SnapshortView(檢視號為viewID)將傳送名稱空間為 com.ibm.xna,名稱為 NewsIDChanged 的屬性,值為某篇新聞的編號 id

該方法的實現程式碼如下:


清單 6. 釋出屬性的 Eclipse 程式碼
                
public void publishProperty(String namespace,String viewID, 
    String property, String value) { 
    PropertyBroker pb = PropertyBrokerFactory. getBroker ();
    // 獲取 PropertyBroker 例項 
    PropertyValue[] values = new PropertyValue[1]; 
    try { 
        Property prop = pb.getProperty(namespace, property);
        // 根據名稱空間和屬性名獲取屬性 
        if (prop != null ) { 
            values[0] = PropertyFactory. createPropertyValue (prop, value);
            // 生成屬性值 
            pb.changedProperties(values, viewID);// 釋出屬性 
        } 
    } catch (PropertyBrokerException e) { 
        e.printStackTrace(); 
    } 
}
			

在上面這個函式中,我們首先獲取一個 Property Broker 的例項,再通過名稱空間和屬性名獲取 Property 例項。實際用來發布屬性的方法是 PropertyBrokerchangedProperties 函式,此函式有兩個引數,一個是 PropertyValue 陣列,用於存放多個要釋出的屬性值對;另一個是字串,用於標誌屬性變化時的上下文,應該與連線(Wiring)源元件的 EntityID 匹配。本例中,該 viewID 是通過 snapShotView.getViewSite().getId() + ":" + snapShotView.getViewSite().getSecondaryId() 拼接而成的。

如果覺得拼接這個 viewID 麻煩,還有一種做法更加簡單。可以使用 SWTHelper (com.ibm.rcp.propertybroker.swt.api.SWTHelper) 類的 changedProperties 函式釋出屬性。該函式的函式頭為:SWTHelper.changedProperties(PropertyValue[] arg0, IViewPart arg1),與 PropertyBroker 的同名函式的不同之處在於,該函式的第二個引數是指向 ViewPart 的指標。如果是在 ViewPart 類內部呼叫該方法的話,那麼很多情況下你只需要簡單寫一個 this 即可。

操作的實現

回到本節一開始介紹的 ImageView 元件,該元件接收 NewsIDChanged 屬性(該屬性值為新聞號),執行 ShowImage 操作:顯示該新聞號對應的新聞的圖片。以它為例,接下來我們看看 Eclipse 元件中操作是如何實現的。

前文提到,在定義 ImageView 的屬性和操作時,我們在 Plugin.xml 中指定了 WSDL 操作的實現類 com.ibm.xna.actions.ImageViewAction。該類繼承自 org.eclipse.core.commands.AbstractHandler,實現了該類的 excute()方法。

該方法的程式碼如下:


清單 7. 接收屬性並操作的 Eclipse 程式碼
                
public Object execute(ExecutionEvent ee) throwsExecutionException {
    Object event = ee.getTrigger();
    if (event instanceof PropertyChangeEvent) {
        // 判斷是否是屬性更改事件
        PropertyChangeEvent e = (PropertyChangeEvent)event;
        PropertyValue propValue = e.getPropertyValue();
        // 獲取屬性值
        finalString Val = propValue.getValue().toString();
        Wire wire = e.getWireDefinition();
        String targetName = wire.getTargetName();
        // 獲取目標操作名
        if (targetName.equalsIgnoreCase("ShowImage")) {
            // 判斷操作名是否匹配
            ……
            IViewPart part = SWTHelper.locateView (SAMPLE_VIEW); ImageView view = 
			    ( ImageView ) part; view.setVal(Val );
            // 把屬性值傳遞給對應的新聞展示檢視,展示圖片。
            ……
        }
    }
returnevent;
}

從上面的程式碼可以看到,通過處理 PropertyChangeEvent 類的例項,我們可以得到 ShowImage 操作所接收到的屬性值,並對該屬性值進行相應的處理。

簡而言之,只要我們對複合應用的 Property Broker 程式設計模式有了一個比較清晰的認識,那麼實現 Eclipse 元件中的操作將會是非常輕鬆的一件事。

總的來說,開發 Eclipse 元件對傳統的 Notes 開發者是一個全新的挑戰,不過作為 Notes 開發者,他們已經習慣於接收種種新鮮事物。舉個例子,現在 Notes 開發中常用的 HTML,javascript,Java,Servlet 等技術,在一開始也是和 eclipse 一樣,作為一種新技術加入到 Lotus 開發中來的。所以對 Lotus 自身和 Lotus 開發者而言,ND 8 會給他們帶來一片新的天地。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14751907/viewspace-588824/,如需轉載,請註明出處,否則將追究法律責任。

相關文章