簡介
CAS Software AG是來自德國Karlsruhe的一家軟件公司,創建於1986年。該 公司專注於CRM(客戶關系管理)領域,尤其是在SME(中小企業)方面。近年來 CAS Software的軟件產品在CRM領域獲得了非常好的聲譽,包括他們在特定領域 諸如面向教育、自動代理權和基於會員的組織或者協會等的CRM產品。
近來CAS Software正在開發被稱為CAS PIA(個人信息助理)的一個產品,這 個產品會以SaaS(軟件即服務)的方式發布,這也是他們首個以這種方式發布的 產品。該產品使用了許多技術,我們會在以後作詳細介紹。這篇案例研究的重點 將會放在Eclipse RAP(富Ajax平台)以及它是如何應用到CAS PIA架構中的,同 時也會涉及到RAP的一些有趣的應用、CAS在使用它的過程中的一些個經驗教訓以 及未來他們的產品的發展方向。
范圍
CAS Software AG為自由職業者以及中小企業開發CRM(客戶關系管理)軟件 。對CAS來說,他們把軟件的受眾定位在那些不使用特定CRM應用、而是更傾向於 用工具和應用的組合來跟蹤他們的客戶、市場等的用戶。CAS認為對那些可集中 而易於訪問的客戶信息管理軟件,市場將會有很大的需求。在特定行業內,已經 有基於桌面的應用,然而這些應用僅僅提供局限於CRM專有的功能。通過使用諸 如Eclipse RAP和Eclipse Equinox之類的技術,CAS PIA可以開發出不僅提供“ 標准”的CRM功能,而且還可以有管理市場戰略、電子郵件整合以及個性化信件 等功能的應用,而所有這些都被放入一個干淨而模塊化的軟件包之內。
通過在用戶界面開發中使用Eclipse RAP,CAS PIA提供了一個使用戶感覺非 常友好的桌面風格的界面體驗。用戶界面根據人類工程學(ergonomics)來開發 ,使用了人們熟悉的窗體部件和行為,比如拖放等等用戶對web應用程序所期望 的很多東西。另外,在線功能使所有同一公司內的同事可以通過該應用來管理委 派、任務和文檔,也可以進行其他的重要工作流程比如地址轉換和路徑計劃。在 下一章中,我們將深入到CAS PIA的開發架構中來看看開源軟件在當中如何起到 至關重要的作用。
解決方案概述
CRM解決方案已經出現好幾年了,桌面的和在線的都有,在最近一段時間裡功 能變得非常強大。用戶在使用它們時的期望遠遠超出了基本功能,諸如報表、安 全、親和的外觀和體驗以及反應迅速的用戶界面。基於許多用戶對CRM應用的期 望和需求,CAS選用開源軟件作為他們整個解決方案的基礎。
從設計角度來講,CAS PIA是一款易於擴展的web應用程序,它可以利用多個 服務進程,而這些服務進程可以分擔訪問壓力和提供冗余。每一個服務進程都運 行在作為應用程序服務器的Apache Tomcat之上,包含了基於RAP的應用層和一個 服務核心。應用層負責展示用戶界面和處理用戶請求,而服務核心則提供商業邏 輯和數據庫訪問。
CAS選用基於web的應用程序,從而使得用戶可以不必擔心安裝、硬件成本和 配置以及數據的安全。而且,基於web的應用可以使用戶在任何地點來訪問 CAS PIA,而不必在每台計算機上安裝重客戶端。作為web應用前端的表示層使用了 Eclipse RAP來開發。RAP項目主頁把它描述稱為一個為開發人員提供了下述功能 的框架:
通過使用Eclipse開發模型、基於Eclipse工作台擴展點的插件以及用SWT API (以及JFace)開發的組件工具箱來構建基於Ajax技術的富web應用 .... RAP非 常像Eclipse RCP,但是它不是在桌面計算機上啟動,而是運行在一台服務器上 ,可以被標准浏覽器訪問。這主要是因為它提供了一套特殊實現的SWT(一個SWT API的子集)。(http://www.eclipse.org/rap/about.php)
下面是Eclipse RCP和Eclipse RAP的一個簡單架構對比圖。
CAS PIA用Elipse RAP在表示層中構建用戶界面有以下原因:
用戶感觀 - Elipse RAP可以構建出非常符合人體工程學而且可切換主題的富 用戶界面,已經非常類似於胖客戶端的感受。
開發效率 - AJAX和JavaScript被包裝成對開發者透明的組件, 從而使得程序 員可以用他們熟悉的Java類庫和IDE來開發。
易於擴展 - 盡管RAP使程序員可以不直接使用JavaScript、HTML和CSS來開發 ,但是它也提供了足夠的可擴展性,使定制的組件和風格可以毫無問題的加入到 應用當中。
工程質量 - Elipse和它的產品族擁有最好的軟件設計和體驗,RAP也不例外 。
單一代碼庫 - RAP能夠被編譯為AJAX或者RCP應用程序。
表示層也包含了OSGi運行時環境,這為它在別的CAS產品中的使用提供了良好 的模塊性和復用性。CAS選擇Eclipse Equinox項目作為他們實現OSGi的工具,定 義如下:
...一個OSGi R4核心框架規范的實現,即一組實現了若干可選的OSGi服務和 其它架構的軟件包,可以運行在基於OSGi的系統上。
總的來說, Equinox 項目的目標是成為一流的OSGi社區和使Eclipse成為界 面組件視覺化的開發工具。
通過利用Equinox提供的分離機制,CAS已實現了自己的核心模塊,這些模塊 包含了許多軟件包,這些包可以作為通用組件應用到不同的應用程序中。每個模 塊都提供了一些擴展點,通過這些點,根據所開發的不同應用的需求,可以實現 不同的特定的行為。例如,用戶管理組件可以用在許多應用程序當中,而聯系人 管理模塊就比較特殊,只會被用到CRM相關的應用中。OSGi提供的這種擴展性使 模塊很容易被擴展,比如在構建和部署階段。
CAS PIA的另一部分是商業邏輯和典型的服務器端相關功能,即服務核心或者 EIM(企業信息管理)。設計和開發EIM是把它作為CAS整個產品線的核心。服務 核心提供了通過Sun JAX-WS、RMI和REST服務來遠程訪問的功能,核心同樣也利 用Spring框架設計成組件化的風格,都是可以被擴展的。
持久層用了MySQL數據庫,同時也包含了CAS特別開發的定制組件。定制組件 包含了一個可擴展的數據模型、一套定制的查詢語言(CAS-SQL)和一個權限管 理組件。該權限管理組件利用ACEGI框架來進行用戶鑒權,也對數據庫層的每個 對象都提供了ACL(訪問控制列表)。這套權限管理系統和 Oracle的OLS比較類 似,而該系統還支持MySQL之外的其它數據庫,從而使CAS可以在別的產品上使用 它。
RAP Eclipse RAP的單元測試
單元測試在任何軟件開發中都是非常重要的一個環節,即使是在軟件的客戶 端也不例外。很多時候,應用程序的界面開發人員發現很難對代碼做單元測試。 通常,這是因為表示層和應用邏輯緊密耦合從而使得單元測試代碼的開發非常復 雜和難於維護。CAS的程序員們設法把盡量多的邏輯都放在服務器端,從而使單 元測試(代碼)非常健壯。然而,不是所有的東西都可以放到服務器端,而這也 是為什麼好的UI設計成為一個很重要因素的原因。
通過用通用設計模式比如MVC、表示層模型(Presentation Model)、模型視 圖代理(Model View Presenter)等等來實現用戶界面,將視圖從邏輯當中解耦 出來,從而使單元測試變得相對容易。即便進行了良好的設計,也還是有很多的 問題需要面對,尤其是RAP用戶界面的測試。首先,RAP UI組件包含了一個Java 層和一個JavaScript層,這意味著有兩個部分的代碼需要測試。Qooxdoo,即RAP 使用的Ajax應用程序框架,提供了類似於JUnit和JSUnit的單元測試工具。CAS利 用這些工具來對組件的JavaScript層進行測試,用JUnit來測試Java層。下面是 CAS提供的一個單元測試代碼,展示了對定制組件JavaScript層的測試。
/**
* Memory leak test.
* * Creates and disposes an objects, and checks if there are some leaking instances.
*
* @type member
* @return {void}
*/
testMemoryLeak : function() {
var ms1 = de.tests.MemoryLeakUtil.getMemorySnapshot();
// create
var dc = new de.cas.qx.ui.widget.calendar.datechooser.DateChooser();
qx.ui.core.Widget.flushGlobalQueues();
// dispose
dc.dispose();
var ms2 = de.tests.MemoryLeakUtil.getMemorySnapshot();
var msg = de.tests.MemoryLeakUtil.checkMemoryLeak(ms1, ms2);
this.assertEquals("", msg, "There are some leaking objects!");
},
這個特定測試試圖找到由DateChooser組件引起的潛在的內存洩露 (DateChoose是CAS開發的定制組件中的一個)。 MemoryLeakUtil類是一個CAS 創建的定制工具類,它使用了Qooxdoo提供的一些功能,比如列出內存中的所有 對象。通過Qooxoo提供的功能,他們可以輕易的對內存洩露問題來做測試,而這 類問題是在JavaScript組件開發中很常見的。在測試RAP用戶界面時需要面對的 另外一個問題是處理UI的異步和動態的狀態。有一些工具可以用來記錄用戶界面 並且可以把這個過程存儲起來,從而可以反復運行。這種類型的測試有助於檢查 UI的行為和交互,仿佛是有用戶在真正使用它,但是它們也有局限性。在CAS對 web應用程序測試工具做的大致評估中,他們還沒有發現一款工具可以處理異步 和非基於頁面的用戶界面,如遇到基於Ajax的應用程序,它的內容是動態裝載的 的而非改變整個頁面。
單元測試中有時也會遇到的一個問題是對服務器和/或數據層進行測試。通常 單元測試代碼直接與服務器、數據庫等直接通信來完成它們的測試。這種類型的 測試有其缺陷,CAS的開發者們也遇到過,單元測試由於需要和其他層的通信而 變得很慢。一個通常的的解決辦法是用假對象,在測試中用假對象來代替“真對 象”。在 java中有很多假對象的框架,包括Mockito、EasyMock和JMock,它們 用來簡化假對象的創建過程。對JavaScript來說,也有這樣的假對象框架比如 JSMock和Mock4JS。
之前您看到了用於測試JavaScript層的單元測試代碼,之後您將會看到一段 測試Java層的例子。對Eclipse 1.1來說,這個框架框架基本上包含了相當於 JUnit的測試的功能,不同的是它可以使需要OSGi環境的測試正常運行。如果您 需要執行期間更新UI的單元測試,您可以非常簡單地從 org.eclipse.rap.junit.RAPTestCase擴展。但是,如果對單元測試來說不需要 更新用戶界面,那麼相應地,你可以擴展JUnit的org.junit.TestCase類。下面 是一個關於包含了用戶界面交互的RAP的測試用例:
public class RapJUnitTest extends RAPTestCase {
public void testOpenView() {
try {
IWorkbenchPage page = getPage();
page.showView ( "org.eclipse.rap.demo.DemoTreeViewPartI" );
} catch( PartInitException e ) {
e.printStackTrace();
}
assertEquals( 1, getPage().getViewReferences().length );
getPage().hideView( getPage().getViewReferences()[ 0 ] );
assertEquals( 0, getPage().getViewReferences().length );
}
private IWorkbenchPage getPage() {
IWorkbench workbench = PlatformUI.getWorkbench();
IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
return window.getActivePage();
}
}
這個例子展示了如何測試一個實際的UI組件來驗證可視視圖的數量。而這也 正展示了如何正確地測試基於RAP應用程序測試的一個步驟,然而,它並沒有提 供自動化用戶驅動交互。通過模擬一個用戶點擊按鈕或者在輸入框中鍵入值這樣 的測試UI的能力將會是CAS在未來所研究的目標。
定制用戶界面組件
除此而外,RAP還提供了還提供了用SWT構建的一個超大的組件子集,稱為RAP 控件工具箱,或者稱為RWT,這套工具箱可以滿足許多應用程序的需要。然而, 當有“標准”以外的需求時,Eclipse RAP也支持開發和使用定制組件。開發定 制組件的第一步是確定這是一種什麼類型的控件,在RAP中,有兩種控件, izhong是“復合”式 ("compound")另外一種是“自構建”式("owner drawn")。 復合控件是把已有的RAP組件組合到一起來提供一種新的UI功能。而自構建式組 件則源於JavaScript,通常需要許多重型開發,有時則需要第三方庫。RAP開發 向導提供了一個一步步教你如何創建“自構建”定制控件的教程,教程中用截屏 和例子代碼闡述了整個過程。對於定制組件的開發流程,教程中列出了四個主要 的步驟:
為組件創建一個運行在服務器上的Java實現
為組件創建一個運行在浏覽器上的JavaScript實現
用Java創建一個適配器,這個適配器把JavaScript組件和Java組件連接起來
通過在org.eclipse.rap.ui.resources擴展點上增加插件的方式注冊該 JavaScript文件
CAS的開發人員必須開發一些自定義控件包括一個日歷、日期選框、工具條和 可折疊的導航控件,看起來像Microsoft Outook。這個日歷和工具條就是用 JavaScript加上CSS和HTML開發的“自構建”組件的例子,轉化而成為CAS PIA所 用的RAP組件。Qooxdoo提供了很多功能來開發控件,這些功能可以大大的降低開 發的難度。下圖是展示了一組“自構建”組件的截屏,特別是一個日歷和一個工 具條。
可以看到日歷組件提供了很多功能比如左上角的一個迷你日歷,中間 的一個比較詳細的日歷,可以加入任務,而且可以定制視圖來顯示(例如, “所有的任務”)。這個特殊部件由大約20000行代碼構成,實現它 需要大量時間和精力。上圖中所示的另一個“自構建”組件是一個工 具條,它提供的功能類似於很多應用例如 Microsoft Office和Microsoft Outlook的工具條。組合組件的例子是一個時間選擇器,我們可以在CAS PIA中看 到它,如下圖所示。
這個復合組件由一組控件包括一個對話框,若干按鈕以及可選框構成 , 他們一同構建了這個時間選擇器。在CAS PIA的拷屏圖中另外值得注意的一點 是應用的整體樣式或者說主題。RAP通過使用層疊式樣式表(CSS)提供了主題功 能,同時使應用可以接受加在org.eclipse.rap.ui.themes擴展點和plugin.xml file擴展點上的擴展。
開發定制的RAP組件時,在設計和開發階段必須對下面幾點加以考慮。首先, 開發人員必須熟悉HTML、JavaScript、CSS和 Qoodoo。我提到這個是因為RAP的 一個優越之處就是開發人員可以用Java來編程而可以避開JavaScript,但是在開 發定制組件時卻不是這樣。其次,開發人員必須設法使控件具有跨浏覽器特性。 寫過RAP核心組件的開發人員竭盡全力來確保控件的浏覽器兼容性,而在未來版 本的Qooxdoo中有望在這方面得以增強從而使開發人員可以免於考慮浏覽器兼容 性問題。最後,另外一個需要注意的問題是在RAP中的Qooxdoo和你從網站上下載 的不是同一個版本。極端情況下,對RAP的開發人員來說,這意味著一些特定功 能和類可能不能使用,盡管它們出現在Qooxdoo的API中。
開發中遇到的問題
對開發人員來說任何新技術都一定要有一個學習曲線,發展過程中也會有很 多問題。在CAS PIA的開發過程中開發團隊陷入了一些與性能和部署相關的問題 當中。
他們馬上遇到的第一個問題就是客戶端和服務器端都出現較低的性能和高的 資源開銷。CAS利用可以復用GUI控件而不是反復創建它們的對象池和緩存來提升 一些性能。盡管CAS所做的努力有所幫助,但是對於完全解決他們在Internet Explorer上的性能問題還遠遠不夠,這也使得CAS PIA不能支持IE。然而CAS對短 期內Qooxdoo框架的性能提升和Internet Explorer8的即將發布對CAS PIA表現出 可接受的性能和對IE的支持相當有信心。另一方面,在別的浏覽器上特別是 Firefox,都已經在近期取得性能和資源開銷問題方面的提升。
另外一個令人頭痛的問題是用一種連續累計的構建過程開發和部署整個應用 程序的RAP組件。由於CAS選擇將Eclipse Equinox部署到Tomcat中而不是將web服 務器嵌入到Equinox,所以這是唯一的問題。CAS使用了Eclipse中的Releng- Tools,這個工具可以支持夜間自動構造,然而它們在使用Ant的過程中發現文檔 太少而且有很多奇怪的問題(比如,動態生成構建腳本)。最終確保夜間構建的 正常運行花費了大量的監控和測試。
與此同時CAS不得不解決將Equinox部署到Tomcat中的問題。對這個配置問題 提出的解決方案是,生成一個單獨的WAR文件,這個文件中包含了所有的商業組 件、運行時環境、Equinox和RAP。但是,CAS PIA也需要EIM這麼一個非OSGi組件 和RAP部分一起集成到應用程序當中,從而使得兩個部件之間可以不通過web服務 和RMI直接通信。解決這個問題需要分兩步,首先必須把EIM服務器組件放到WAR 文件的"lib"目錄中。第二步涉及到對web.xml中servlet bridge的特殊配置。 CAS用到了servlet橋中的“extendedFrameworkExports”參數,這個參數能使 EIM和RAP組件根據需要集成在一起。
經驗教訓
CAS Software積極致力於開發和部署Eclipse RAP應用程序,即便在開始的時 候碰到很多問題,他們仍然非常樂於使用Eclipse RAP來開發產品。他們發現用 Eclipse RAP後開發人員的效率得到顯著提高,這主要是因為Java程序員已經習 慣於Eclipse的集成開發環境、調試工具和組件模型。
一旦CAS克服了以上提到過的問題而走過了陡峭的學習曲線,每個人都會樂於 使用RAP來做開發。CAS希望RAP在未來產品中增加的唯一功能是從服務器端來觸 發客戶端動作的能力。目前CAS PIA使用自主開發的一套方案,其實實際上稱不 上真正的解決方案,但CAS對RAP的未來充滿信心。
未來發展方向
CAS Software AG目前在中小企業CRM市場上居於領導地位,他們計劃到2010 年時把這種領導地位拓展到整個歐洲。CAS PIA在2009年第一季度將會面試並且 推廣。最終目標是成為SaaS CRM產品歐洲地區供應商的前20位。
CAS會繼續在使用和支持Eclipse RAP上發揮他們重要的作用,他們還將於 2009年2月在匈牙利的賽格德大學開辦有關RAP的課程。