CAS Software AG是來自德國Karlsruhe的一家軟件公司,創(chuàng)建于1986年。該公司專注于CRM(客戶關系管理)領域,尤其是在SME(中小企業(yè))方面。近年來 CAS Software的軟件產(chǎn)品在CRM領域獲得了非常好的聲譽,包括他們在特定領域諸如面向教育、自動代理權和基于會員的組織或者協(xié)會等的CRM產(chǎn)品。
近來CAS Software正在開發(fā)被稱為CAS PIA(個人信息助理)的一個產(chǎn)品,這個產(chǎn)品會以SaaS(軟件即服務)的方式發(fā)布,這也是他們首個以這種方式發(fā)布的產(chǎn)品。該產(chǎn)品使用了許多技術,我們會 在以后作詳細介紹。這篇案例研究的重點將會放在Eclipse RAP(富Ajax平臺)以及它是如何應用到CAS PIA架構(gòu)中的,同時也會涉及到RAP的一些有趣的應用、CAS在使用它的過程中的一些個經(jīng)驗教訓以及未來他們的產(chǎn)品的發(fā)展方向。
范圍CAS Software AG為自由職業(yè)者以及中小企業(yè)開發(fā)CRM(客戶關系管理)軟件。對CAS來說,他們把軟件的受眾定位在那些不使用特定CRM應用、而是更傾向于用工具和應 用的組合來跟蹤他們的客戶、市場等的用戶。CAS認為對那些可集中而易于訪問的客戶信息管理軟件,市場將會有很大的需求。在特定行業(yè)內(nèi),已經(jīng)有基于桌面的 應用,然而這些應用僅僅提供局限于CRM專有的功能。通過使用諸如Eclipse RAP和Eclipse Equinox之類的技術,CAS PIA可以開發(fā)出不僅提供“標準”的CRM功能,而且還可以有管理市場戰(zhàn)略、電子郵件整合以及個性化信件等功能的應用,而所有這些都被放入一個干凈而模塊 化的軟件包之內(nèi)。
通過在用戶界面開發(fā)中使用Eclipse RAP,CAS PIA提供了一個使用戶感覺非常友好的桌面風格的界面體驗。用戶界面根據(jù)人類工程學(ergonomics)來開發(fā),使用了人們熟悉的窗體部件和行為,比 如拖放等等用戶對web應用程序所期望的很多東西。另外,在線功能使所有同一公司內(nèi)的同事可以通過該應用來管理委派、任務和文檔,也可以進行其他的重要工 作流程比如地址轉(zhuǎn)換和路徑計劃。在下一章中,我們將深入到CAS PIA的開發(fā)架構(gòu)中來看看開源軟件在當中如何起到至關重要的作用。
解決方案概述CRM解決方案已經(jīng)出現(xiàn)好幾年了,桌面的和在線的都有,在最近一段時間里功能變得非常強大。用戶在使用它們時的期望遠遠超出了基本功能,諸如報表、 安全、親和的外觀和體驗以及反應迅速的用戶界面。基于許多用戶對CRM應用的期望和需求,CAS選用開源軟件作為他們整個解決方案的基礎。
從設計角度來講,CAS PIA是一款易于擴展的web應用程序,它可以利用多個服務進程,而這些服務進程可以分擔訪問壓力和提供冗余。每一個服務進程都運行在作為應用程序服務器 的Apache Tomcat之上,包含了基于RAP的應用層和一個服務核心。應用層負責展示用戶界面和處理用戶請求,而服務核心則提供商業(yè)邏輯和數(shù)據(jù)庫訪問。
CAS選用基于web的應用程序,從而使得用戶可以不必擔心安裝、硬件成本和配置以及數(shù)據(jù)的安全。而且,基于web的應用可以使用戶在任何地點來訪 問 CAS PIA,而不必在每臺計算機上安裝重客戶端。作為web應用前端的表示層使用了Eclipse RAP來開發(fā)。RAP項目主頁把它描述稱為一個為開發(fā)人員提供了下述功能的框架:
通過使用Eclipse開發(fā)模型、基于Eclipse工作臺擴展點的插件以及用SWT API(以及JFace)開發(fā)的組件工具箱來構(gòu)建基于Ajax技術的富web應用 .... RAP非常像Eclipse RCP,但是它不是在桌面計算機上啟動,而是運行在一臺服務器上,可以被標準瀏覽器訪問。這主要是因為它提供了一套特殊實現(xiàn)的SWT(一個SWT API的子集)。( http://www.eclipse.org/rap/about.php )
下面是Eclipse RCP和Eclipse RAP的一個簡單架構(gòu)對比圖。
CAS PIA用Elipse RAP在表示層中構(gòu)建用戶界面有以下原因:
- 用戶感觀 - Elipse RAP可以構(gòu)建出非常符合人體工程學而且可切換主題的富用戶界面,已經(jīng)非常類似于胖客戶端的感受。
- 開發(fā)效率 - AJAX和JavaScript被包裝成對開發(fā)者透明的組件, 從而使得程序員可以用他們熟悉的Java類庫和IDE來開發(fā)。
- 易于擴展 - 盡管RAP使程序員可以不直接使用JavaScript、HTML和CSS來開發(fā),但是它也提供了足夠的可擴展性,使定制的組件和風格可以毫無問題的加入到應用當中。
- 工程質(zhì)量 - Elipse和它的產(chǎn)品族擁有最好的軟件設計和體驗,RAP也不例外。
- 單一代碼庫 - RAP能夠被編譯為AJAX或者RCP應用程序。
表示層也包含了OSGi運行時環(huán)境,這為它在別的CAS產(chǎn)品中的使用提供了良好的模塊性和復用性。CAS選擇 Eclipse Equinox 項目作為他們實現(xiàn)OSGi的工具,定義如下:
...一個 OSGi R4核心框架規(guī)范 的實現(xiàn),即一組實現(xiàn)了若干可選的OSGi服務和其它架構(gòu)的軟件包,可以運行在基于OSGi的系統(tǒng)上。
總的來說, Equinox 項目的目標是成為一流的OSGi社區(qū)和使Eclipse成為界面組件視覺化的開發(fā)工具。
通過利用Equinox提供的分離機制,CAS已實現(xiàn)了自己的核心模塊,這些模塊包含了許多軟件包,這些包可以作為通用組件應用到不同的應用程序 中。每個模塊都提供了一些擴展點,通過這些點,根據(jù)所開發(fā)的不同應用的需求,可以實現(xiàn)不同的特定的行為。例如,用戶管理組件可以用在許多應用程序當中,而 聯(lián)系人管理模塊就比較特殊,只會被用到CRM相關的應用中。OSGi提供的這種擴展性使模塊很容易被擴展,比如在構(gòu)建和部署階段。
CAS PIA的另一部分是商業(yè)邏輯和典型的服務器端相關功能,即服務核心或者EIM(企業(yè)信息管理)。設計和開發(fā)EIM是把它作為CAS整個產(chǎn)品線的核心。服務 核心提供了通過Sun JAX-WS、RMI和REST服務來遠程訪問的功能,核心同樣也利用Spring框架設計成組件化的風格,都是可以被擴展的。
持久層用了MySQL數(shù)據(jù)庫,同時也包含了CAS特別開發(fā)的定制組件。定制組件包含了一個可擴展的數(shù)據(jù)模型、一套定制的查詢語言(CAS-SQL) 和一個權限管理組件。該權限管理組件利用ACEGI框架來進行用戶鑒權,也對數(shù)據(jù)庫層的每個對象都提供了ACL(訪問控制列表)。這套權限管理系統(tǒng)和 Oracle的OLS比較類似,而該系統(tǒng)還支持MySQL之外的其它數(shù)據(jù)庫,從而使CAS可以在別的產(chǎn)品上使用它。
RAP Eclipse RAP的單元測試單元測試在任何軟件開發(fā)中都是非常重要的一個環(huán)節(jié),即使是在軟件的客戶端也不例外。很多時候,應用程序的界面開發(fā)人員發(fā)現(xiàn)很難對代碼做單元測試。通 常,這是因為表示層和應用邏輯緊密耦合從而使得單元測試代碼的開發(fā)非常復雜和難于維護。CAS的程序員們設法把盡量多的邏輯都放在服務器端,從而使單元測 試(代碼)非常健壯。然而,不是所有的東西都可以放到服務器端,而這也是為什么好的UI設計成為一個很重要因素的原因。
通過用通用設計模式比如MVC、表示層模型(Presentation Model)、模型視圖代理(Model View Presenter)等等來實現(xiàn)用戶界面,將視圖從邏輯當中解耦出來,從而使單元測試變得相對容易。即便進行了良好的設計,也還是有很多的問題需要面對, 尤其是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組件引起的潛在的內(nèi)存泄露(DateChoose是CAS開發(fā)的定制組件中的一個)。 MemoryLeakUtil類是一個CAS創(chuàng)建的定制工具類,它使用了Qooxdoo提供的一些功能,比如列出內(nèi)存中的所有對象。通過Qooxoo提供 的功能,他們可以輕易的對內(nèi)存泄露問題來做測試,而這類問題是在JavaScript組件開發(fā)中很常見的。在測試RAP用戶界面時需要面對的另外一個問題 是處理UI的異步和動態(tài)的狀態(tài)。有一些工具可以用來記錄用戶界面并且可以把這個過程存儲起來,從而可以反復運行。這種類型的測試有助于檢查UI的行為和交 互,仿佛是有用戶在真正使用它,但是它們也有局限性。在CAS對web應用程序測試工具做的大致評估中,他們還沒有發(fā)現(xiàn)一款工具可以處理異步和非基于頁面 的用戶界面,如遇到基于Ajax的應用程序,它的內(nèi)容是動態(tài)裝載的的而非改變整個頁面。
單元測試中有時也會遇到的一個問題是對服務器和/或數(shù)據(jù)層進行測試。通常單元測試代碼直接與服務器、數(shù)據(jù)庫等直接通信來完成它們的測試。這種類型的 測試有其缺陷,CAS的開發(fā)者們也遇到過,單元測試由于需要和其他層的通信而變得很慢。一個通常的的解決辦法是用假對象,在測試中用假對象來代替“真對 象”。在 java中有很多假對象的框架,包括 Mockito 、 EasyMock 和 JMock ,它們用來簡化假對象的創(chuàng)建過程。對JavaScript來說,也有這樣的假對象框架比如 JSMock 和 Mock4JS 。
之前您看到了用于測試JavaScript層的單元測試代碼,之后您將會看到一段測試Java層的例子。對Eclipse 1.1來說,這個框架框架基本上包含了相當于JUnit的測試的功能,不同的是它可以使需要OSGi環(huán)境的測試正常運行。如果您需要執(zhí)行期間更新UI的單 元測試,您可以非常簡單地從
org.eclipse.rap.junit.RAPTestCase
擴展。但是,如果對單元測試來說不需要更新用戶界面,那么相應地,你可以擴展JUnit的
org.junit.TestCase
類。下面是一個關于包含了用戶界面交互的RAP的測試用例:
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組件來驗證可視視圖的數(shù)量。而這也正展示了如何正確地測試基于RAP應用程序測試的一個步驟,然而,它并沒有 提供自動化用戶驅(qū)動交互。通過模擬一個用戶點擊按鈕或者在輸入框中鍵入值這樣的測試UI的能力將會是CAS在未來所研究的目標。
定制用戶界面組件除此而外,RAP還提供了還提供了用SWT構(gòu)建的一個超大的組件子集,稱為RAP控件工具箱,或者稱為RWT,這套工具箱可以滿足許多應用程序的需 要。然而,當有“標準”以外的需求時,Eclipse RAP也支持開發(fā)和使用定制組件。開發(fā)定制組件的第一步是確定這是一種什么類型的控件,在RAP中,有兩種控件,izhong是“復合”式 ("compound")另外一種是“自構(gòu)建”式("owner drawn")。復合控件是把已有的RAP組件組合到一起來提供一種新的UI功能。而自構(gòu)建式組件則源于JavaScript,通常需要許多重型開發(fā),有 時則需要第三方庫。RAP開發(fā)向?qū)峁┝艘粋€一步步教你如何創(chuàng)建“自構(gòu)建”定制控件的教程,教程中用截屏和例子代碼闡述了整個過程。對于定制組件的開發(fā)流 程,教程中列出了四個主要的步驟:
- 為組件創(chuàng)建一個運行在服務器上的Java實現(xiàn)
- 為組件創(chuàng)建一個運行在瀏覽器上的JavaScript實現(xiàn)
- 用Java創(chuàng)建一個適配器,這個適配器把JavaScript組件和Java組件連接起來
-
通過在
org.eclipse.rap.ui.resources
擴展點上增加插件的方式注冊該JavaScript文件
CAS的開發(fā)人員必須開發(fā)一些自定義控件包括一個日歷、日期選框、工具條和可折疊的導航控件,看起來像Microsoft Outook。這個日歷和工具條就是用JavaScript加上CSS和HTML開發(fā)的“自構(gòu)建”組件的例子,轉(zhuǎn)化而成為CAS PIA所用的RAP組件。Qooxdoo提供了很多功能來開發(fā)控件,這些功能可以大大的降低開發(fā)的難度。下圖是展示了一組“自構(gòu)建”組件的截屏,特別是一 個日歷和一個工具條。
可以看到日歷組件提供了很多功能比如左上角的一個迷你日歷,中間的一個比較詳細的日歷,可以加入任務,而且可以定制視圖來顯示(例如,“所有的任 務”)。這個特殊部件由大約20000行代碼構(gòu)成,實現(xiàn)它需要大量時間和精力。上圖中所示的另一個“自構(gòu)建”組件是一個工具條,它提供的功能類似于很多應 用例如 Microsoft Office和Microsoft Outlook的工具條。組合組件的例子是一個時間選擇器,我們可以在CAS PIA中看到它,如下圖所示。
這個復合組件由一組控件包括一個
對話框
,若干
按鈕
以及
可選框構(gòu)成
, 他們一同構(gòu)建了這個時間選擇器。在CAS PIA的拷屏圖中另外值得注意的一點是應用的整體樣式或者說主題。RAP通過使用層疊式樣式表(CSS)提供了主題功能,同時使應用可以接受加在
org.eclipse.rap.ui.themes
擴展點和
plugin.xml file
擴展點上的擴展。
開發(fā)定制的RAP組件時,在設計和開發(fā)階段必須對下面幾點加以考慮。首先,開發(fā)人員必須熟悉HTML、JavaScript、CSS和 Qoodoo。我提到這個是因為RAP的一個優(yōu)越之處就是開發(fā)人員可以用Java來編程而可以避開JavaScript,但是在開發(fā)定制組件時卻不是這 樣。其次,開發(fā)人員必須設法使控件具有跨瀏覽器特性。寫過RAP核心組件的開發(fā)人員竭盡全力來確保控件的瀏覽器兼容性,而在未來版本的Qooxdoo中有 望在這方面得以增強從而使開發(fā)人員可以免于考慮瀏覽器兼容性問題。最后,另外一個需要注意的問題是在RAP中的Qooxdoo和你從網(wǎng)站上下載的不是同一 個版本。極端情況下,對RAP的開發(fā)人員來說,這意味著一些特定功能和類可能不能使用,盡管它們出現(xiàn)在Qooxdoo的API中。
開發(fā)中遇到的問題對開發(fā)人員來說任何新技術都一定要有一個學習曲線,發(fā)展過程中也會有很多問題。在CAS PIA的開發(fā)過程中開發(fā)團隊陷入了一些與性能和部署相關的問題當中。
他們馬上遇到的第一個問題就是客戶端和服務器端都出現(xiàn)較低的性能和高的資源開銷。CAS利用可以復用GUI控件而不是反復創(chuàng)建它們的對象池和緩存來 提升一些性能。盡管CAS所做的努力有所幫助,但是對于完全解決他們在Internet Explorer上的性能問題還遠遠不夠,這也使得CAS PIA不能支持IE。然而CAS對短期內(nèi)Qooxdoo框架的性能提升和Internet Explorer8的即將發(fā)布對CAS PIA表現(xiàn)出可接受的性能和對IE的支持相當有信心。另一方面,在別的瀏覽器上特別是Firefox,都已經(jīng)在近期取得性能和資源開銷問題方面的提升。
另外一個令人頭痛的問題是用一種連續(xù)累計的構(gòu)建過程開發(fā)和部署整個應用程序的RAP組件。由于CAS選擇將Eclipse Equinox部署到Tomcat中而不是將web服務器嵌入到Equinox,所以這是唯一的問題。CAS使用了Eclipse中的Releng- Tools,這個工具可以支持夜間自動構(gòu)造,然而它們在使用Ant的過程中發(fā)現(xiàn)文檔太少而且有很多奇怪的問題(比如,動態(tài)生成構(gòu)建腳本)。最終確保夜間構(gòu) 建的正常運行花費了大量的監(jiān)控和測試。
與此同時CAS不得不解決將Equinox部署到Tomcat中的問題。對這個配置問題提出的解決方案是,生成一個單獨的WAR文件,這個文件中包 含了所有的商業(yè)組件、運行時環(huán)境、Equinox和RAP。但是,CAS PIA也需要EIM這么一個非OSGi組件和RAP部分一起集成到應用程序當中,從而使得兩個部件之間可以不通過web服務和RMI直接通信。解決這個問 題需要分兩步,首先必須把EIM服務器組件放到WAR文件的"lib"目錄中。第二步涉及到對web.xml中 servlet bridge 的特殊配置。CAS用到了servlet橋中的“ extendedFrameworkExports ”參數(shù),這個參數(shù)能使EIM和RAP組件根據(jù)需要集成在一起。
經(jīng)驗教訓CAS Software積極致力于開發(fā)和部署Eclipse RAP應用程序,即便在開始的時候碰到很多問題,他們?nèi)匀环浅酚谑褂肊clipse RAP來開發(fā)產(chǎn)品。他們發(fā)現(xiàn)用Eclipse RAP后開發(fā)人員的效率得到顯著提高,這主要是因為Java程序員已經(jīng)習慣于Eclipse的集成開發(fā)環(huán)境、調(diào)試工具和組件模型。
一旦CAS克服了以上提到過的問題而走過了陡峭的學習曲線,每個人都會樂于使用RAP來做開發(fā)。CAS希望RAP在未來產(chǎn)品中增加的唯一功能是從服 務器端來觸發(fā)客戶端動作的能力。目前CAS PIA使用自主開發(fā)的一套方案,其實實際上稱不上真正的解決方案,但CAS對RAP的未來充滿信心。
未來發(fā)展方向CAS Software AG目前在中小企業(yè)CRM市場上居于領導地位,他們計劃到2010年時把這種領導地位拓展到整個歐洲。CAS PIA在2009年第一季度將會面試并且推廣。最終目標是成為SaaS CRM產(chǎn)品歐洲地區(qū)供應商的前20位。
CAS會繼續(xù)在使用和支持Eclipse RAP上發(fā)揮他們重要的作用,他們還將于2009年2月在匈牙利的賽格德大學開辦有關RAP的課程。
參考鏈接- CAS PIA
- Eclipse RAP Book (2008年12月)
- http://rapblog.innoopract.com/2007/12/rap-deployment-part-2-deploying-your.html
- http://www.eclipse.org/equinox/server/http_in_container.php
- GUI測試工具
閱讀英文原文 : Case study: Eclipse Rich Ajax Platform Use at CAS Software AG 。
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
