本系列的文章,從Documentum業(yè)務(wù)對(duì)象框架(Documentum Business Object Framework,BOF)開始,介紹了用于BEA WebLogic Workshop的Documentum 業(yè)務(wù)對(duì)象控件(Documentum Business Objects Control,DBOC)。
本文是第2部分,介紹了一些實(shí)現(xiàn)上的底層支持技術(shù),討論與Documentum安全性的集成,并研究一些示例代碼。這篇文章是在第一篇文章(可從Ness的Web站點(diǎn)上得到)所介紹的概念基礎(chǔ)上形成的。
作為Documentum和BEA的合作伙伴,Ness科技受邀在 BEA的Workshop和Documentum基于服務(wù)的業(yè)務(wù)對(duì)象之間建立集成。這一集成包括控件、示例應(yīng)用程序和集成的幫助,所有這些都可以在第一次使用控件時(shí)下載并安裝到Workshop中。
DBOC是怎樣集成到Workshop中的?
WebLogic Workshop引入了Java控件,把它作為一種封裝業(yè)務(wù)邏輯、方便地訪問企業(yè)資源的方法。為Workshop集成開發(fā)環(huán)境(IDE)提供的內(nèi)置平臺(tái)控件,可以連接數(shù)據(jù)庫、EJB、消息隊(duì)列等。
因?yàn)锽EA致力于推廣控件,所以他們使應(yīng)用程序開發(fā)人員可以容易地建立自己的自定義控件,代表應(yīng)用程序的具體邏輯,并為開發(fā)團(tuán)隊(duì)提供一套一致的工具。
為了進(jìn)一步推動(dòng)Java控件的創(chuàng)新,Workshop的8.12版本引入了一個(gè)擴(kuò)展開發(fā)工具包,支持第三方控件和用戶界面組件無縫地集成入WLW環(huán)境。DBOC就是這一新的擴(kuò)展性框架的第一個(gè)實(shí)現(xiàn)。
我們會(huì)稍花一點(diǎn)時(shí)間來討論這是如何辦到的,因?yàn)榇蠹铱赡芟胱鲱愃频募晒ぷ鳎炎约旱淖远x控件集成進(jìn)IDE,其中可以包含利用DBOC的控件,但是當(dāng)然不僅限于此。
在第一次安裝WebLogic Platform 8.12版本時(shí),在BEAHOME\ext_components文件夾里會(huì)放入一個(gè) DocumentumBusinessObjectsControlStub.zip文件。
這個(gè)小小的壓縮包里包含有關(guān)控件的足夠信息(文本、圖標(biāo)、下載URL),所以它可以在Workshop的增加控件菜單里顯示。
在準(zhǔn)備第一次使用DBOC時(shí), Workshop 會(huì)提示它還沒有安裝,然后會(huì)下載完整的控件檔案壓縮包DocumentumBusinessObjectsControl.zip,取代原來的存根文件。
然后,系統(tǒng)就會(huì)把BEADocumentumControlProj.jar文件插入當(dāng)前項(xiàng)目的庫文件夾,這樣項(xiàng)目就可以使用其中的功能了(請(qǐng)看下圖)。
Workshop還會(huì)把示例應(yīng)用程序安裝到BEAHOME\weblogic81\samples\partners\Documentum文件夾。最后,再把DBOC的幫助文件安裝入Workshop的幫助系統(tǒng),編排文件索引,使得可以在幫助的內(nèi)容列表的擴(kuò)展區(qū)域里使用DBOC的幫助。
有關(guān)擴(kuò)展開發(fā)工具包的更多詳細(xì)信息,可以在Workshop的幫助系統(tǒng)中找到,也可以在dev2dev.bea.com站點(diǎn)在線得到。
穿戴整齊,卻無處可去
完成這一步驟后,像大多數(shù)控件一樣,會(huì)彈出了一個(gè)向?qū)В屇_始填寫信息。
但是, Documentum 環(huán)境要求我們要特別注意幾個(gè)項(xiàng)目。和許多其他實(shí)用控件(報(bào)表生成器之類的)不同,DBOC控件不是自包含的實(shí)體,它實(shí)際是一個(gè)達(dá)到更大型的運(yùn)行系統(tǒng)的橋梁。可以把它當(dāng)作到數(shù)據(jù)庫系統(tǒng)的連接。您不該試圖把整個(gè)數(shù)據(jù)庫系統(tǒng)拷貝到每個(gè)J2EE應(yīng)用程序項(xiàng)目。相反,您應(yīng)當(dāng)指定共享的數(shù)據(jù)庫服務(wù)器的位置,然后訪問這些資源。在使用DBOC的情況下,我們需要指定Documentum基本類庫(DFC)資源在開發(fā)人員機(jī)器上的位置。DFC只安裝一份非常重要,這樣DFC才不會(huì)重復(fù),特別是要考慮到實(shí)際只需要Documentum業(yè)務(wù)對(duì)象注冊(cè)表(DBOR)的一個(gè)實(shí)例,這樣所有的業(yè)務(wù)對(duì)象都會(huì)包含在一個(gè)位置(否則會(huì)帶來維護(hù)上的麻煩)。
關(guān)于DFC資源,需要了解兩個(gè)WebLogic環(huán)境。
- 需要更新Weblogic服務(wù)器域的SetDomainEnv.cmd 文件,以便在服務(wù)器的Classpath中可以找到DFC的jar文件。
- 需要設(shè)置Workshop IDE 的應(yīng)用程序?qū)傩裕员鉏DE識(shí)別DFC和BOF資源。這樣, Workshop 可以做一些有用的工作,例如語法檢測(cè)、自動(dòng)完成等。
探索DBOC
DBOC使得訪問Documentum基于服務(wù)的對(duì)象非常簡(jiǎn)單。沒有必要聲明(或者根本不需要了解或考慮)home 和remote接口,只需要在向?qū)е谢卮鹨恍﹩栴},就萬事俱備了。
向?qū)У念^兩步是所有Java控件都需要的公共步驟:
- 第一步是給控件代表的變量命名。
- 在第二步,確定是利用現(xiàn)有控件的.jcx文件或者讓向?qū)槟⒁粋€(gè)新的.jcx文件。在上面的屏幕中,我們正在建立一個(gè)名為inbox.jcx的新控件。
在第三步,要提供針對(duì)于DBOC的信息。 - 所有的業(yè)務(wù)對(duì)象都在DBOR中注冊(cè)。控件向?qū)ёx取DBOR,并在下拉列表中列出所找到的全部SBO。
上圖只顯示了默認(rèn)的Documentum安裝所提供的SBO。而在實(shí)際情況下,列表中會(huì)顯示出所有從Documentum開發(fā)人員網(wǎng)站下載或者自行開發(fā)的SBO。
- 最后,為DFCSessionManager(SessionManager)對(duì)象提供訪問SBO所必需的憑證信息。我們會(huì)在本文后面詳細(xì)介紹這方面內(nèi)容。
點(diǎn)擊Create按鈕后,向?qū)Ь蜁?huì)建立一個(gè)指向新的(或現(xiàn)有的)控件文件的變量。在上面的示例中,向?qū)Ы⒘薸nbox.jcx文件,并把它放在當(dāng)前項(xiàng)目中。
控件文件里有什么?
DBOC不僅僅是SBO外面的簡(jiǎn)單包裝器,它還加入了一些所有SBO都需要的實(shí)用特性。您的代碼與代表SBO的控件進(jìn)行交互。
在.jcx文件中的代碼非常簡(jiǎn)單:
需要注意的關(guān)鍵一點(diǎn)是,控件文件本身只是擴(kuò)展了SBO提供的Java接口以及DBOC自身提供的實(shí)用代碼。向?qū)?duì)DBOR進(jìn)行查詢,然后建立新的接口,并把您提供的其他信息作為標(biāo)簽屬性(docbase、 安全類型、用戶名、口令) 保存在.jcx文件里。當(dāng)在設(shè)計(jì)視圖里查看控件實(shí)例時(shí),控件的標(biāo)簽屬性可以在屬性編輯器中使用,可以在其中做任何必要的修改。
當(dāng)WLW IDE 以圖形方式顯示控件時(shí),它會(huì)枚舉控件的所有可用方法,包括來自SBO的方法和來自控件的實(shí)用工具方法。
凡是以getSBO… 和setSBO… 前綴開始的方法,都是DBOC自己提供的實(shí)用工具方法。可以用這些方法取得和設(shè)置控件的屬性。
需要記住,用這些前綴開始的方法不與SBO對(duì)話,它們只是引用控件的屬性。提供這些方法是為了在運(yùn)行的時(shí)候可以使用控件自身的信息。有人可能會(huì)說,前綴應(yīng)當(dāng)是getSBOControl…和setSBOControl…,但是開發(fā)人員一般喜歡簡(jiǎn)潔,所以更短的名字保留了下來。所有剩下的方法則都是SBO自身提供的功能。
SessionManager對(duì)象
SessionManager對(duì)象在DFC 5.1中引入,SessionManager對(duì)象是Documentum Business Object服務(wù)使用的所有會(huì)話所必需的接口。它負(fù)責(zé)集中實(shí)體、會(huì)話和事務(wù)。
DBOC設(shè)計(jì)用于減少需要手工編寫的代碼數(shù)量。所以,如果還不存在SessionManager對(duì)象,DBOC能夠?yàn)槟⒁粋€(gè),這是合情合理的。
SessionManager對(duì)象負(fù)責(zé)表示試圖訪問SBO的Documentum用戶的標(biāo)識(shí)。即使SBO可能是不進(jìn)行Docbase事務(wù)的Java代碼,也是一樣。
DBOC的安全類型屬性接受三個(gè)值,分別代表處理用戶憑證的三個(gè)不同方法:
- Registered Identity
這個(gè)值來自控件向?qū)е羞x擇“Use control generated Session Manager with the following identity”(使用控件生成的具有以下標(biāo)識(shí)的Session Manager)。它提供了最簡(jiǎn)單的認(rèn)證方法。SessionManager由控件本身(不是由客戶端代碼)生成。客戶端只需把用戶ID、口令和Docbase設(shè)置成控件的屬性。SessionManager會(huì)由控件在運(yùn)行時(shí)生成,根據(jù)控制中設(shè)置的憑證進(jìn)行連接。 - Principal Identity
這個(gè)值來自控件向?qū)е羞x擇“Use control generated SessionManager for principal identity”(使用控件生成的代表主體標(biāo)識(shí)的SessionManager)。這個(gè)選項(xiàng)便于使用Documentum的Principal Security。與Registered Identities一樣,SessionManager也是由控件本身自動(dòng)生成的。
但是,必須使用控件客戶端來創(chuàng)建并注冊(cè)超級(jí)用戶的憑證,并注冊(cè)IdfPrincipalSupport對(duì)象。然后客戶端只需把Principle User帳戶設(shè)置為控件的屬性。
所以,您要提供能讓SessionManager訪問SBO的超級(jí)用戶帳戶名稱和口令,還要提供沒有口令的用戶帳戶名稱(主體帳戶)。SessionManager作用的時(shí)候,就好像主用戶提供了正確的憑證一樣。所有應(yīng)用在用戶帳戶上的訪問控制列表也都適用。
對(duì)于超級(jí)用戶執(zhí)行管理性任務(wù)來說,這項(xiàng)技術(shù)特別有用,因?yàn)檫@些任務(wù)需要通過在運(yùn)行時(shí)模擬用戶來訪問用戶數(shù)據(jù)。
- Assign SessionManager at Run-Time
當(dāng)在控制向?qū)е羞x擇“Assign SessionManager at Run-Time”(在運(yùn)行時(shí)分配SessionManager)時(shí)設(shè)置這個(gè)值。與前二個(gè)選項(xiàng)不同,這個(gè)選項(xiàng)要求控件客戶端建立SessionManager對(duì)象,并把該對(duì)象作為控件的屬性傳入。它給控件客戶端提供了最大的靈活性(當(dāng)然在客戶端代碼需要的設(shè)置代碼也最多)。在代碼的其他地方已有SessionManager對(duì)象在使用時(shí),這個(gè)選項(xiàng)最有用,有可能是在應(yīng)用程序開始時(shí)設(shè)置一次SessionManager,而不用在控件初始化時(shí)設(shè)置。
頁面流示例的示例代碼演示了用于以上全部三種場(chǎng)景的技術(shù),可以用作建立自己代碼的指導(dǎo)。
查看一些示例代碼
下圖顯示了來自Web服務(wù)示例的代碼片斷。這個(gè)示例是個(gè)簡(jiǎn)單的演示,用DBOC訪問用戶的收件箱。它在收件箱項(xiàng)目之間循環(huán),累計(jì)計(jì)數(shù)器,然后把收件箱中項(xiàng)目的數(shù)量返回給Web服務(wù)。
雖然這很基礎(chǔ),但是確實(shí)可以作為頁面流示例的基礎(chǔ),可以采用這個(gè)技術(shù),并在其上進(jìn)行擴(kuò)展,查詢每個(gè)收件箱項(xiàng)目,然后把數(shù)據(jù)在Web頁面上表示出來。
在寫這篇文章的時(shí)候,關(guān)于收件箱SBO,幾乎還沒有公開的文檔,所以這個(gè)代碼恰好可以給您一個(gè)起步的地方。
為了讓代碼能夠識(shí)別DFC API,需要在代碼頂部加入import語句(一定記得服務(wù)器的Classpath已經(jīng)更新,其中包含這些jar文件)。如果要訪問另外的SBO,就必須更新Classpath,以便把它們也包含進(jìn)來。
可以看到,下圖是一段混合代碼,既處理控件本身,也處理DFC。
在示例代碼中,變量inbox是擴(kuò)展SBO并具有DBOC實(shí)用工具方法的控件。
例如,第33行顯示了一條語句如何能夠根據(jù)控件的屬性對(duì)SBO進(jìn)行設(shè)置:inbox.setDocbase(inbox.getSBODocbase());
這條語句告訴系統(tǒng)把SBO的Docbase屬性設(shè)置成控件的docbase屬性中所包含的值(在設(shè)計(jì)時(shí)設(shè)置的)。
下面,我們開始處理DFC的IInboxCollection和IInboxItem接口。
在第39行,代碼通過getItem方法,請(qǐng)求控件把所有收件箱項(xiàng)目返回到一個(gè)集合。
要想查看inbox控件其他可以使用的方法,只要輸入inbox和一個(gè)句點(diǎn),然后讓W(xué)orkshop彈出方法列表(下圖是部分列表)即可。
代碼剩下的部分就非常簡(jiǎn)單了;它對(duì)集合里的每個(gè)項(xiàng)目執(zhí)行循環(huán),增量計(jì)數(shù)器。循環(huán)完所有項(xiàng)目之后,方法就返回計(jì)數(shù)值。當(dāng)然,這全都封閉在Try/Catch塊里,以便捕獲可能發(fā)生的任何錯(cuò)誤。運(yùn)行這個(gè)Web服務(wù)示例的結(jié)果就是一個(gè)簡(jiǎn)單的服務(wù)響應(yīng),在這個(gè)例子中,有三個(gè)收件箱項(xiàng)目被計(jì)數(shù)。
一旦您知道了如何與收件箱SBO建立基本的連接,您就可以使用其他收件箱方法了。
例如,如果您想修改頁面流示例,讓它按照發(fā)件人和日期對(duì)結(jié)果排序,您可以在用getItems方法填充集合之前,添加一個(gè)對(duì)setSortBy方法的調(diào)用。下面的代碼根據(jù)發(fā)件人降序排列收件箱,在每個(gè)發(fā)件人里,則按發(fā)送日期升序排列。
inbox.setSortBy("sent_by DESC, date_sent ASC", true );
IInboxCollection iInboxCollection = inbox.getItems();
setSortby方法接受二個(gè)參數(shù):
- 第一個(gè)參數(shù)是一個(gè)字符串,定義OrderBy子句,可以簡(jiǎn)單到就是一個(gè)字段名,也可以復(fù)雜到包含多個(gè)字段和方向。
- 第二個(gè)參數(shù)是一個(gè)布爾值,指明是否為更新的OrderBy子句(在這個(gè)例子里,必須為true)。
我們還要去哪里?
本文對(duì)于Documentum業(yè)務(wù)對(duì)象控件做了更進(jìn)一步的考察。
Business Object Framework是Documentum的戰(zhàn)略組成部分,DBOC是BOF與J2EE框架集成的第一個(gè)實(shí)現(xiàn)。就在我們完成的時(shí)候,其他使用WebLogic Workshop框架的開發(fā)人員可以利用新的擴(kuò)展開發(fā)工作包把他們自己的控件、服務(wù)和幫助提供并集成到Workshop IDE中。
我們已經(jīng)指出了一些DBOC提供的實(shí)用工具方法和安全性選項(xiàng),利用它們可以在運(yùn)行時(shí)使用SBO,從而實(shí)現(xiàn)更大的靈活性。最后,我們還顯示了代碼既需要處理控件本身,也需要處理SBO提供的方法。
DBOC允許您方便地把Documentum SBO集成到WebLogic Workshop環(huán)境。學(xué)習(xí)了這個(gè)集成,只需下載并安裝WebLogic Platform,插入DBOC,修改一些WebLogic服務(wù)器的配置,并按照示例教程的指導(dǎo)即可。
作者注:特別感謝Documentum的Kevin O'Connor,感謝他創(chuàng)建DBOC項(xiàng)目,支持Java控件工作,以及對(duì)本系列文章所做的貢獻(xiàn)。
如果對(duì)本文有疑問,,請(qǐng)聯(lián)系作者: Alan Zenreich ,電話:201-488-7222 轉(zhuǎn)160.
原文出處:
http://dev2dev.bea.com/products/wlworkshop81/articles/DCMT2.jsp