| 本系列文章首先对Documentum Business Object Framework(BOF)进行概述,然后再介绍BEA WebLogic Workshop(WLW)的Documentum Business Objects Control (DBOC)。
第 2 部分介绍了一些实现的技术基础,讨论与Documentum安全的集成,并研究一些示例代码。
第 3 部分通过使用Service Based Objects(SBO)来建立在前面文章中所介绍的概念(可从Ness网站获得),SBO可从Documentum的Component Exchange网站下载。
注意:作为Documentum和BEA的合作伙伴,Ness Technologies应邀创建了BEA的Workshop与Documentum的基于服务的业务对象(service-based business objects)之间的集成。该集成包括控件、示例应用程序和集成的帮助,在第一次使用该控件时应将该集成全部下载并安装到Workshop中。
我们将演示:
- 访问Documentum Component Exchange
- 下载Documentum Business Object Registry Utility(DBORManager)
- 从Documentum Component Exchange下载一些SBO
- 构建使用多个SBO的Web服务
该Web服务将网页下载到Documentum文件夹中,然后生成一个包括该文件夹全部内容的zip文件,将该zip文件放在同一个文件夹中。该特定Web服务并非特别有用,但是它却演示了在Workshop中获取、安装、注册和使用SBO的基本技术。您可以使用这里介绍的技术来使用其他的SBO,这些SBO可以从Component Exchange网站获得,并且可以作为您自己编写的SBO的模型。
开始
本文假定您根据前两篇文章的步骤(或者根据DBOC的Workshop帮助文件的指导)已经安装了DBOC示例应用程序。这就保证了您已经安装DBOC并且它可以查看您的Documentum资源。
如果想要创建该演示例子,并在您自己的Documentum安装上运行它,在开始工作前您需要以下信息:
- 您访问的Documentum Docbase的名称
- Docbase的用户帐号和密码
- Docbase中文件夹的r_objectID,演示例子可以使用该Docbase来存储下载的文件。
注意:r_objectID是识别文件夹的数字指示器(例如,0b00cb9c80033d57)。如果您正在使用Documentum的WebTop界面,可以通过查看文件夹的属性屏幕来获取r_objectID。有各种编程方法来获取这个ID,但是这不在本文讨论的范围内。
Documentum的Component Exchange
Documentum开发人员站点是最佳的客户资源之一,从这里可以获得技术信息、示例代码和使用技巧。登录http://developer.documentum.com时,将被重定位到开发人员的页面。

需要注意的区域之一是Component Exchange,它包含可以下载和用在自己应用程序中的组件。这些组件被分成以下几个组:
- 业务对象框架(Business Objects Framework)
- 桌面开发工具包(Desktop Development Kit)
- 门户(Portals)
- 相关文章(Related Articles)
- 网络开发工具包(Web Development Kit)
下图显示了可以从业务对象框架(Business Objects Framework)区获得的部分文章、最佳实践和组件:

我们将下载Documentum Business Objects Registry Overview and Utility,以及一些SBO组件。
下载DBOR Manage程序
使用Documentum Business Object Registry(DBOR)注册新的SBO。尽管可以使用API调用来进行注册,但是使用“DBORManage”工具更加方便,因此我们首先将从component exchange下载它,然后将其解压到任意目录下。

下图显示zip文件中的文件,接下来我们将简要讨论其中一个文件(dborRegisterCustom.bat),这个批处理文件能够自动对该演示例子进行注册。

下载了SBO并且从SBO文档中获取其接口语法之后,我们将回到DBOR。
下载SBO
该演示例子项目直接使用两个SBO
- Web Content Downloader
- Zip Service Version 2
然而这两个SBO依赖于其他一些SBO,因此我们将下载所有所需的SBO。下图显示在Component Exchange站点上出现的SBO组件清单。一一下载它们到您的计算机的文件夹中。
相关SBO:
下载该zip文件之后,将各个SBO解压到其自己的文件夹中。在一些情况中,解压缩分为两个步骤,因为有些下载的zip文件包含PDF文档而另一些zip文件只有SBO。
每个文件夹包含一个SBO(如.jar文件),以及文档和示例文件。例如,webContentDownloaderService解压为:
安装SBO
SBO必须由 Java Classpath和Workshop IDE引用。尽管我们可以将SBO及其支持文件放在一起,但是我们为该演示例子所用的方法是:将5个.jar文件复制到Documentum为其自己的共享对象所用的文件夹中(在这里,已经有了dfc.jar、dfcbase.jar等)
从下载的SBO文件夹中获取以下文件,并将它们复制到以下文件夹中。
C:\Program Files\Documentum\Shared
- webContentDownloaderService.jar
- zipService.jar
- autonamingService.jar
- deepExportservice.jar
- deepImportService.jar
下图显示含有新SBO jar文件的部分目录清单,以及Documentum在其应用程序中共享的jar文件。
在实际应用程序中,您可以创建另一个文件夹,将其自己的SBO放在这里,然后参照下面介绍的步骤引用它们。
DBOR
Documentum Business Objects Registry(DBOR)包含每个系统可用业务对象的注册程序。每个SBO的实际注册信息(Java接口和版本号)包含在各个组件的文档中。
注意:现在,DBOR存储库一般包含在c:\documentum\config\dbor.properties文件中。然而,Documentum声明:该位置和存储机制将来可能会改变,因此仅仅编辑文本文件是明智的。DborManage工具根据当前的Documentum实施将业务对象注册到正确的位置。
典型的Documentum安装可能有一个如下所示的DBOR:

我们将通过创建调用DborManage工具的批处理文件来添加新的SBO到注册表中。
- 当用户解压缩DborManage工具时,已经有几个批处理文件了,其中之一(dborRegisterSBO.bat)用于注册单个SBO。关于调用语法的更多信息可从DborOverview.PDF文档中得到,该PDF文档包含在zip文件中。
我们需要将dfc.properties文件的路径(一般为C:\Documentum\Config)添加到dborRegisterSBO.bat文件中。加入如下一行
set CLASSPATH=%CLASSPATH%;C:\Documentum\Config
如下图所示:
注册SBO
对于本文,我们已经提供了一个示例自定义批处理文件(dborRegisterCustom.bat),以正确的语法多次调用注册批处理文件,每个SBO一次。
您可以复制并粘贴以下代码到称为dborRegisterCustom.bat的新文件中。
注意:
- 如果dfc.jar文件不在C:\Program Files\Documentum\Shared中,应相应地更改该批处理命令的第一行。
- 每次调用dborRegisterSBO.bat有三个参数,以空格隔开。
- SBO_Name
- Java_Implementation_Class
- 版本
- 每次调用dborRegisterSBO.bat必须在单独的一行中,不能分行。
- 该批处理文件可以在组件下载到用户的机器之前运行。该批处理文件无需知道SBO的位置,也无需做任何依赖性检查,它仅仅是将关于接口的用户注册信息传递给DBOR。
- 您可以复制并粘贴以下代码来创建其自己的批处理文件。
| @REM dborRegisterCustom.batset CLASSPATH="C:\Program Files\Documentum\Shared\dfc.jar"@rem register Deep Import SBOcall dborRegisterSBO.bat com.documentum.devprog.deepimport.IDpDeepImportService com.documentum.devprog.deepimport.DpDeepImportService 1.0@rem register Deep Export SBOcall dborRegisterSBO.bat com.documentum.devprog.deepexport.IDpDeepExportService com.documentum.devprog.deepexport.DpDeepExportService 1.0@rem register AutoNaming SBOcall dborRegisterSBO.bat com.documentum.devprog.autonaming.IDpAutoNamingService com.documentum.devprog.autonaming.DpAutoNamingService 1.0@rem register Zip SBOcall dborRegisterSBO.bat com.documentum.devprog.common.zip.IDpZipService com.documentum.devprog.common.zip.DpZipService 2.0@rem register Web Content Downloadercall dborRegisterSBO.bat com.documentum.devprog.web.IDpWebContentDownloaderService com.documentum.devprog.web.DpWebContentDownloaderService 1.0 |
当运行dborRegisterCustom.bat时,得到的dbor.properties文件如下图所示,既有原始注册信息也有新SBO的注册信息。
以上就完成了Documentum端的设置,接下来我们将开始配置访问SBO的Workshop。
设置Workshop环境
为方便起见,在第一次下载DBOC时,我们将给安装的示例应用程序添加新的Web服务。该安装步骤在帮助文件中,以及本系列的前两篇文章中。
注意:本文以下内容假定您已根据前两篇文章的步骤安装了示例应用程序。这就保证了您已经安装DBOC并且它可以查看您的Documentum资源。如果已经完成以上步骤,就可以继续了。
打开Weblogic Workshop,然后选择 File | Open 来装载DBO控件示例应用程序文件:
BEA_HOME\weblogic81\samples\partners\Documentum\DBOSampleApp\BEADocumentumControlSamplesApp.work
| BEA_HOME\weblogic81\samples\partners\Documentum\DBOSampleApp\BEADocumentumControlSamplesApp.work |
将Documentum jar文件添加到Weblogic Workshop IDE 的类路径。
a. 从菜单中选择 Tools | Application Properties。
b. 使用右边的滚动条拖动到底部。
c. 在Server Classpath Additions中,单击Add Jar命令按钮。
d. 添加我们将用在应用程序中的两个SBO jar文件。这些文件在我们较早前放在C:\Program Files\Documentum\Shared文件夹中的文件中。
- webContentDownloaderService.jar
- zipService.jar
可以通过在单击文件名的同时按住Ctrl键来一次选择这两个jar文件,然后单击Select Jar。注意:在Classpath Additions区应当只添加这两个直接用在应用程序中的SBO。其他SBO(deepImportService等)只是通过这两个SBO来引用,而无需在这里添加。
新的SBO引用将出现在server classpath additions区。
至此我们已经设置了应用程序属性,现在应更新启动环境。
a. 关闭Weblogic Workshop
b. 如果Weblogic server处于活动中,则停止它。
c. 给Weblogic Server classpath添加所有的SBO jar文件。
- 打开Windows资源管理器,定位到用户运行的服务器所在的目录。如果用户不知道在哪里,则从Weblogic Workshop菜单中选择 Tools | Applications,查找名字为Server Home Directory的项。示例应用程序域的缺省位置为C:\bea812\weblogic81\samples\domains\workshop
- 在记事本或任何编辑器中打开SetDomainEnv.cmd文件。
- 找到构造类路径的命令行(它应以SET CLASSPATH=%PRE_CLASSPATH%;%WEBLOGIC_CLASSPATH%....开头),然后按如下所示来添加路径信息。这段代码定义了SBO和dfc.properties文件的路径,并且将其添加到类路径的末尾。
- 退出并保存SetDomainEnv.cmd文件的更改。
注意:
- 可以并复制粘贴下面的代码。
- jar名称必须与文件名称确切相配,而且它们是区分大小写的。例如,deepExportservice.jar是正确的,但是deepExportService.jar与从component exchange下载的SBO文件名不符。
- 注意,您需要为将使用SBO(Workshop、Portal等)的每一个服务器域配置,制作类似如上所述的SetDomainEnv.cmd文件。
| @REM --- Add Demo SBO jar files to the classpathSET SBO_PATH=C:\Program Files\Documentum\SharedSET SBO_DEEPIMPORT=%SBO_PATH%\deepImportService.jarSET SBO_DEEPEXPORT=%SBO_PATH%\deepExportservice.jarSET SBO_AUTONAME=%SBO_PATH%\autoNamingService.jarSET SBO_ZIP2=%SBO_PATH%\zipService.jarSET SBO_URL_DOWNLOAD=%SBO_PATH%\webContentDownloaderService.jarSET SBO_PATHS=%SBO_DEEPIMPORT%;%SBO_DEEPEXPORT%;%SBO_AUTONAME%;%SBO_ZIP2%;%SBO_URL_DOWNLOAD%;@REM PATH TO dbor.propertiesSET DCTM_PROPS=C:\Documentum\Config@REM append to the classpathSET CLASSPATH=%CLASSPATH%;%DCTM_PROPS%;%SBO_PATHS%@REM --- Classpath additions complete |
创建Demo Web Service
打开Weblogic Workshop,并且如果必要的话,则选择File | Open来装载DBO控件示例应用程序文件:BEA_HOME\weblogic81\samples\partners\Documentum\DBOSampleApp\BEADocumentumControlSamplesApp.work,在示例应用程序中创建新项目:
a. 右击应用程序树状结构的根(BEADocumentumControlSample)
(如果该树状结构不可见,则选择View | Application first)
b. 选择New | Project
c. 选择Web服务项目并将其命名为DemoSbo
d. 单击Create

我们将创建的这个Web服务出现在项目文件夹中。我们还需要一个地方来存储我们将创建的控件文件(Weblogic要求它出现在项目的子文件夹中)。
a. 在应用程序树状结构中右击DemoSbo项目文件夹
b. 选择New | Folder
c. 输入控件然后单击OK
接下来,我们将创建使用两个DBOC实例的Web服务,每一个都指向不同的SBO。
a. 在应用程序树状结构中右击DemoSbo项目文件夹
b. 选择New | Web Service
c. 输入zipFolderDemo然后单击Create
d. 在设计窗口中右击Web服务
e. 选择Add Control
f. 选择Documentum Business Objects Control
g. 按如下步骤完成Insert Control Wizard:
1. 步骤1:命名控件变量为‘webContentCtl’(不含引号)
2. 步骤2:创建新的business object control来使用,并且命名它为‘webContent’(不含引号)
3. 步骤3:从有效的Service Based Objects下拉列表中选择DpWebContentDownloaderService
4. 选择“Use control generated SessionManager with the following identity”并输入Docbase的占位符的值、用户和密码(在此我们使用xxx、yyy和zzz)。稍后我们将解释使用这些占位符的原因。
h. 单击Create。
现在,我们给ZipService SBO添加控件,该SBO用来压缩Docbase文件夹的内容:
a. 在设计窗口中右击Web服务。
b. 选择Add Control。
c. 选择Documentum Business Objects Control。
d. 按如下步骤完成Insert Control Wizard:
1. 步骤1:命名控件为‘zipFolderCtl’(不含引号)
2. 步骤2:创建要使用的新业务对象控件,也命名为‘zipFolder’(不含引号)
3. 步骤3:从可用的Service Based Objects下拉列表中选择DpZipService。
4. 和前面一样,使用xxx、yyy、zzz占位符证书。
e. 单击Create。
接下来,我们将给Web服务添加单个方法
a. 在设计窗口中右击Web服务
b. 选择Add Method
c. 插入newMethod1,重命名该方法为downloadURLandZip
完成时,IDE应该看起来如下所示:

|
单击downloadURLandZip方法来进入Source View,用以下代码来取代该方法:
public void downloadURLandZip(String user, String password, String docBase, String urlAddress, String folderId, String zipFile) { try { webContentCtl.setSBODocbase(docBase); //Override design time settings. webContentCtl.setSBOUser(user); webContentCtl.setSBOPassword(password); URL url = new URL(urlAddress); //Create URL from address string webContentCtl.downloadWebContentIntoDocbase(url, new DfId(folderId), url.getHost(),null); zipFolderCtl.setSBODocbase(docBase); zipFolderCtl.setSBOUser(user); zipFolderCtl.setSBOPassword(password); zipFolderCtl.createZipInDocbase(new DfId(folderId), new DfId(folderId), zipFile); }u catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } }
|
此时Workshop应显示一些红色下划线(表示错误),因为它还不知道代码引用的哪两个对象。我们通过在源代码视图顶部的如下两行来修正这个错误。它们使得编译器可以识别Documentum文件夹对象和Java URL对象。
|
import com.documentum.fc.common.DfId;
import java.net.URL;
|
完成时,Workshop IDE IDE应该看起来如下图所示:
IDE显示如下信息:
运行演示例子
这个简单的Web服务将网页下载到Documentum文件夹中,然后生成一个包含该文件夹全部内容的zip文件,将该zip文件放到同一个文件夹中。下图显示Documentum WebTop屏幕,显示了演示例子文件夹的当前内容。
通过查看该文件夹的属性,我们确定这个特定文件夹的r_objectID为0b00cb9c80033d57,对于下载的Web文件以及zip文件的源文件和目标文件,我们使用该文件夹作为存储库。
接下来,我们切换回Workshop IDE并单击Start命令按钮(或者按Ctrl+F5键)
Workshop构造了一个测试浏览器,在这里您可以输入Web服务单个方法的参数。
注意,当前的webContentDownloader仅下载简单的网站源代码(它不会保存图片等)。记住:
- 如果源代码含图片的相对路径,在Docbase中浏览文件时图片将不会出现(在大多数浏览器中会出现图片占位符)
- 如果网页重定位到其他页面,可能会收到Web服务运行错误
当然,测试的时候,您将使用自己Docbase中的文件夹的证书和r_objectID。单击downloadURLandZip命令按钮运行该方法。
测试浏览器显示方法的调用栈,结束于Service Response,如下所示:
我们可以通过刷新Docbase文件夹(显示在WebTop中)的视图来检查结果,如下图所示。现在,该文件夹有两个原始文件、下载的网页(如简单的HTML文件)和含有其他三个文件的zip文件。
关于演示例子代码
如本文开头所提到的,该演示例子Web服务十分简单,但是示范了利用DBOC来使用多个SBO。
- 在生产系统中,用户可能有好多方法来下载和压缩,可以是一个或者两个的组合。
- 该演示例子代码使用控件的setSBOxxx方法来重写设计时作为占位符设置的证书。这并不常用,但是在这里用来演示这种技术。另一些演示例子,包括页面流示例,从头开始构建了一个Documentum SessionManager对象,并与使用setSBOSessionManager方法的SBO共享它。
- 从Web服务可以生成新的Java控件,并可把它用在其他项目中。对于控件的嵌套层次没有限制。
- 构造使用XML字符串的调用语法是合理的,如下所示:

该代码能解析XML,并且通过url列表进行迭代(优先考虑与XMLBeans一起使用XSD schema),一一下载,然后使用DFC调用来在压缩之前给文档的元数据加入描述。
经过Documentum工作流,可以发送zip文件给其他用户,或者将zip文件与其他Component Exchange SBO组合起来,作为邮件的附件发送给存储库对象。
发展趋势。DBOC本质上是一些功能的包装,这些功能已经通过Documentum Business Objects Registry注册。它的工作原理类似于Workshop EJB控件,用于包装单个Enterprise Java Bean。这些控件的多个实例可以指向不同资源,在本文中是Web内容下载器和压缩服务。
Business Object Framework是Documentum平台的战略部分,并且DBOC是第一个集成了J2EE框架的BOF实现。正像我们所做的那样,在WebLogic Workshop框架内工作的其他开发人员可以利用新的Extensions Development工具包的优点,以便构建界面和集成其自己的控件、服务和WLW IDE中的帮助系统。
DBOC使得用户可以很方便地将Documentum SBO集成到WebLogic Workshop环境中。开发这种集成只需要用户下载并安装WebLogic Platform、插入DBOC、完成两个WL服务器设置和遵循示例的指导。
在Weblogic环境中,将自己的SBO与来自Component Exchange的SBO集成起来是开发Documentum应用程序的最佳实践。
作者注:特别感谢Documentum的Kevin O'Connor,感谢他创建DBOC项目、支持Java控件工作和对本系列文章所作的贡献。
|