Lotus Expeditor 6.2 中 Generic Container 框架簡介

genusBIT發表於2009-07-06

轉自developerworks

作者:張 春燕 (cyzhdl@cn.ibm.com), 軟體工程師, IBM
林 雲志 (linyunz@cn.ibm.com), 軟體工程師, IBM

隨著市場競爭的加劇,企業越來越需要對不斷變化的需求做出快速響應。複合應用通過將一系列已有的鬆耦合元件利用 Expeditor 所提供的 Wire 機制組合為一個新的應用,從而快速地建立應對新需求的應用程式,縮短了開發週期,對已有的資源實現了重複利用。因此,複合應用作為一個有效地提高元件重用性和企業靈活性的解決方案,受到越來越多地關注。

但是,由於許多已有的元件過於簡單,它們或者不能接收來自其它元件的屬性,或者不能對外發布屬性,這在一定程度上限制了元件的可重用性。如何最大限度地重用元件,並利用它們構建複雜的應用程式,是複合應用開發中所面臨的問題,這也正是 Generic Container 所要達到的目標。

Generic Container 的體系結構和相關概念

Generic Container 是 Expeditor 6.2 中新引入的特性。它是一種新型的檢視形式,是對一個包含在檢視中應用程式的擴充套件的集合。它不僅能顯示一個單頁的應用程式,而且對於多頁或者具有多種狀態的應用程式也能顯示。同時,Generic Container 為 Notes 8.5 和 Expeditor 6.2 中的複合應用編輯器 (Composite Application Editor, CAE) 提供了所見即所得的介面介面,並通過 Landmark 來控制複合應用程式的狀態,對外發布屬性或接收屬性,從而實現元件之間的互動。

Generic Container 的體系結構

Lotus Expeditor 基於 Eclipse 平臺,並對其進行了大量的擴充套件,因此它不僅能作為一個 Rich Client 應用程式的基礎平臺,同時還能夠作為 JavaEE 應用程式的基礎平臺。當前,IBM 眾多產品都基於此基礎平臺進行開發和擴充套件,比如 Lotus Notes、Lotus Sametime 以及 Symphony 等。

Lotus Expeditor 內部提供了一個具有良好可擴充套件性的 Container 核心框架,並實現了一個廣泛使用的 Browser Container 。同時,其他基於 Expeditor 產品也可基於此核心框架實現滿足特定業務需求的 Container,比如 Lotus Notes 實現的 Notes View/PIM Container,Symphony 實現的 Symphony Container 。當然,核心框架的可擴充套件性使得您能方便地實現一個自定義的 Container 。


圖 1. Expeditor 6.2 Generic Container 的架構圖
圖 1. Expeditor 6.2 Generic Container 的架構圖

Landmark 的概念

Landmark 是 Container 中的一個重要概念。在一個 Container 內部,通過擴充套件 Generic Container 中的 LandmarkIdentifier 來定義此 Container 所支援的 Landmark 識別符號型別,比如 Web 瀏覽器容器(Browser Container)能夠支援兩種型別的 Landmark 識別符號:URL 和 title 。

對於同一個 Container,可以定義不同的 Landmark 來表示應用程式的狀態。在 Landmark 下,通過增加不同的事件型別來響應各種事件。在 Generic Container 中,預設支援四種事件型別:檢視初始化事件、檢視關閉事件、資料改變事件和內容完成事件,當然,您可根據業務需求定義自定義的事件型別,比如選擇事件。當選擇事件後,通過在不同的事件中加入不同的操作,從而使應用程式在當前 Landmark 的狀態下能對外發布屬性或接收屬性。

ContainmentConfiguration 和 LandmarkConfiguration 擴充套件點的使用

Generic Container 框架中提供了 com.ibm.rcp.composite.container.core.containmentConfigu ration 和 com.ibm.rcp.composite.container.core.landmarkConfiguration 兩個有用的擴充套件點。其中 containmentConfiguration 用於為一個給定的複合應用提供應用程式 Container。每個 Container 都是 Generic Container 的一個例項。通過擴充套件 Generic Container 中所提供的 AppContainer 來實現一個自定義的 Container。landmarkConfiguration 用於為一個特定的 containmentConfiguration 提供 landmark 的配置資訊,定義可用的屬性和操作。

Container 與元件的區別與聯絡

嚴格來說,我們可以將 Container 看成是一種特殊的元件,它們都是通過 Expeditor/Notes 所提供的 Wire 機制來與其他元件進行互動。而 Container 與元件的最大區別就在於 Landmark 的概念。元件中並沒有 Landmark 的概念,因此,對於元件而言,我們就不能定義它的狀態,也不能針對不同的狀態來定義不同的事件,然後通過定義不同的操作來發布或接收屬性。因此,Container 提供了更大程度地可重用性。

Expeditor 6.2 / Notes 8.5 中支援的 Container

當前,Expeditor 6.2/Notes 8.5 中僅支援 Browser Container 。 Browser Container 不僅能對外發布屬性,同時也能接收屬性。同時,作為一個 Container,您能利用它所提供的兩種 Landmark 形式(URL 和頁面標題)來處理頁面在不同狀態的事件觸發。

使用 CAE 組裝複合應用

本節將會演示如何在 CAE 中新建一個複合應用,以及如何藉助 CAE 來使用 Browser Container,其中主要包括它對外發布屬性和接收屬性功能的演示,並利用一個場景來說明它的使用。

場景描述

百度和 Google 是大家常用的兩大搜尋引擎,由於它們的搜尋實現機制的不同,使用兩個搜尋引擎出來的結果往往會有很大的區別。很多時候,我們不得不在兩個搜尋引擎的主頁中輸入相同的關鍵字來搜尋出更加全面的結果。即使我們可以藉助瀏覽器的一些工具欄,比如 Firefox 的搜尋欄來免去輸入相同的關鍵字,但是您也不得不在搜尋引擎列表中進行搜尋引擎的不斷切換,並且當搜尋完畢,我們還需要在不同的搜尋頁面間進行切換來檢視不同的搜尋結果。那麼我們能否在一個頁面中輸入一次關鍵字,即可同時完成對多個不同搜尋引擎的搜尋,並在一個頁面中檢視到所有的搜尋結果?當然,藉助 Notes 8.5 中的 Browser Container,設計一個複合應用,即可完成上述的需求。

建立複合應用:Browser Container Demo

Browser Container 在 Expeditor 6.2/Notes 8.5 中均可用,為了便於使用 Notes 8.5 中已有的一些可用的元件,本文將選用 Notes 8.5 作為實驗平臺。在開始實驗之前,您需要保證您本地已經安裝 Notes 8.5 。另外,在 Notes 8.5 中提供了一個建立和編輯複合應用的編輯器 (Composite Application Editor, CAE) 。為了使用它,您必須首先確保您在安裝 Notes 8.5 時,已經選擇安裝了 CAE 元件。

首先,您需要在 Notes 中新建一個空的複合應用。通過點選 File-Application-New 選單,將會彈出一個新建 Application 的對話方塊,在 Template 欄 , 您需要選擇 Blank Composite Application 來建立一個空的複合應用。


圖 2. 建立一個新的複合應用
圖 2. 建立一個新的複合應用

圖 3. 選擇 Blank Composite Application 作為模板
圖 3. 選擇 Blank Composite Application 作為模板

當您點選 OK 後,Notes 將會開啟這個新建的空白複合應用 Browser Container Demo,同時將此複合應用放置於 Workspace 中。然後,我們通過選擇選單 Actions 下的 Edit Application 來開啟 Notes 的 CAE 編輯器,編輯此複合應用。這時,您將看到 CAE 編輯器右側的 Component 庫中包含一個 Containers 的分類,它下面就包含了我們將會使用的 Browser Container 。當然,此時的複合應用還未包含任何內容。

配置 Browser Container

針對上述的場景,我們需要兩個 Browser Container 。我們從右側 Component 庫中拖拽兩個 Browser Container 分別放置於 Browser Container Demo 複合應用的上方和下方中。當然,您可根據您的需求拖拽 Browser Container 進行佈局的調整。此時,點選上方 Browser Container 右上角的 Component Preferences(如下圖所示),您將會看到一些上下文選單項,選擇其中的 Edit Component Properties 來配置 Browser Container 。


圖 4. Component Preferences 的選單項
圖 4. Component Preferences 的選單項

在 Edit Component Properties 頁面中,選擇其中的 Component Settings 將上方的 Browser Container 設定為 Google Container 。


圖 5. Edit Component Properties-Component Settings
圖 5. Edit Component Properties-Component Settings

在 Browser Container 中,初始的 URL 設定為 www.ibm.com,為了顯示 Google 的主頁,我們進入 Advanced 子頁面,將屬性 initialURL 的值修改為 www.google.com, 並加入兩個可以 Wireable 的屬性 searchValue 和 searchValue2 來分別表示主頁的搜尋域和搜尋頁面的搜尋域,這樣,在 Landmarks 域中我們可以配置多個 landmark 來使用不同的屬性來對外發布屬性值。


圖 6. Edit Component Properties-Advanced
圖 6. Edit Component Properties-Advanced

Landmark 頁面是特定於 Container 存在的,對於一般的 Component 它並不可見。 Browser Container 支援兩種型別的 Landmark 識別符號,URL 和頁面的 title 。這裡,我們選用 URL 作為 Landmark 識別符號型別。點選右邊的 Add Landmark 按鈕,您將增加一個新的 Landmark 。既然 Landmark 識別符號是 URL,我們輸入 http://www.google.cn/ 作為第一個 landmark 。同時,landmark 支援萬用字元,比如我們增加的第二個 landmark //www.google.cn/search*,它表示任意的搜尋頁面。配置完 Landmark 之後,您可以通過 Add Event 來加入事件。當前,Browser Container 支援四種事件型別,我們選用 Data Change,即當 Google 搜尋域的內容發生改變時,就會觸發此事件。基於此事件,我們通過右側的 Add Operation 按鈕加入可用的操作,此操作將會使用之前定義的 searchValue 屬性來發布當前 Google 搜尋域的內容。而對於頁面的 Google 搜尋域的表示,我們可以利用域的 ID 來標識,這種方式簡單直觀,比如一個輸入框的 id 為 kw,此時就可設定為 id:kw ;但很多時候,頁面中的元素沒有設定 id,此時我們可以使用 xpath 來表示。對於如何獲取頁面元素的 ID 和 xpath,您可以使用 Firefox 中的兩個外掛 Firebug 和 XPather 。

結合本場景,Google 搜尋域沒有設定 ID,而主頁的搜尋域和搜尋頁面的搜尋域,兩者的 xpath 值也不相同,因此,這正是本文定義兩個 Landmark 和兩個屬性的原因。在不同的 Landmark 下,我們使用不同的屬性來發布不同域的值。而百度的搜尋域設定了相同的 ID,因此,我們僅設定一個 Landmark(http://www.baidu.com/*)和一個屬性值 searchValue 來接收來自 Google 不同搜尋域的值,並將其與百度的搜尋域關聯起來。


圖 7. Google Landmark
圖 7. Google Landmark

圖 8. 百度的 Landmark
圖 8. 百度的 Landmark

Wire Browser Container

至此,每個單獨的 Browser Container 配置已經完成。為了使兩個 Browser Container 之間能夠釋出和接收屬性,我們還需要將兩者關聯起來。本場景需要將 Google 搜尋域的內容釋出出來,並自動設定到百度搜尋域中,因此我們在 CAE 左邊的導航器中右鍵選擇 Google Container 的 Wiring 選單,進入 Wiring 介面進行屬性的關聯。從下圖可見,我們將前面設定為可 wireable 的兩個屬性 searchValue 和 searchValue2 關聯至 Set searchValue,實現 Google-Browser Container 到 Baidu-Browser Container 的關聯。屬性關聯完畢,點選當前頁面右下角的 Apply 來應用當前的設定。


圖 9. Wire 兩個 Browser Container
圖 9. Wire 兩個 Browser Container

執行介面

退出 CAE 編輯介面,儲存當前的複合應用,它將在 Notes 中執行。下圖是它執行的初始介面。兩個 Browser 均顯示它的初始 URL 。


圖 10. 初始的執行結果
圖 10. 初始的執行結果

當我們在 Google 的搜尋域中輸入完“複合應用”,我們將會看到百度的搜尋域中自動加入“複合應用”作為關鍵詞。此時點選搜尋,我們將會在同一個頁面上同時看到兩大搜尋引擎的結果。因為我們已經在搜尋頁面中也設定了相應的 landmark 和屬性,所以同樣地,在 Google 搜尋頁面的搜尋域中輸入完關鍵詞後,百度主頁或者搜尋結果頁面中的搜尋域中均會被自動地賦予相同的值。


圖 11. 主頁的執行結果
圖 11. 主頁的執行結果

圖 12. 搜尋頁面的執行結果
圖 12. 搜尋頁面的執行結果

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

相關文章