搜索文章:

首页  |  Java技术  |  Asp.net  |  Asp编程  |  VC/C++  |  Delphi  |  VB编程

集成WebLogic Platform 8.1与Stellent Web ContentManagement系统

  把打包应用程序与J2EE应用程序集成是开发人员每天都要面对的挑战。本文概述了如何把Stellent Web Content Management (WCM)和BEA的WebLogic Platform 8.1相集成。作者假定读者熟悉内容管理系统的基本知识,并具备开发J2EE应用程序的经验。

  本文概述了Stellent公开的集成层,讨论了不同的集成方法,并提供了这些可选方案的相对优缺点。虽然Stallent提供了很多类型的集成选项,但是将其作为BEA WebLogic Workshop 控件可得到另一种可选方案,这是一种更简单的集成方式。本文展示了如何开发基于外观模式的WebLogic Workshop 控件,对Stellent API的复杂性不予讨论。控件实现包括了一组封装了访问Stellent 服务(比如检查内容和执行搜索操作)所需的输入和输出参数的JavaBean 包装器对象。控件可以下载获得。 

集成架构概述

  Stellent的内容集成套件(Content Integration Suite ,CIS) 层是一个J2EE应用程序部署单元。CIS应用程序在对宿主域作适当的变化后可以部署在任何一个WebLogic域上(按照CIS安装指南)。套件包括了一个web应用程序,开发人员可以用它来查看和更新CIS的配置选项,也可查看和执行可用的服务如内容搜索。Stellent提供了一个综合性的API来调用这些服务,使程序可以对内容、工作流、元数据进行访问和操纵,并运行搜索来获得内容。

  Stellent命令层架构由一组命令对象组成,由EJB驱动,EJB把各不相同的“命令”封装到内容服务器里。这些命令包括通用功能如搜索、检验、工作流批准等。每条命令都依赖于一个或多个Stellent服务调用。命令层基于J2EE命令设计模式,它由三层组成:

  • Command Object,它使用 Command EJB
  • Command Facade/Invoker
  • 基于 EJB/JCA的Adapter

图1完整地描述了集成选项。

  Command Facade/Invoker通过名称来定位和实例化命令。它执行给定的命令对象并基于命令属性处理命令执行(同步或异步)。Command Facade/Invoker可以被本地调用或远程调用,所以您不必把Stellent CIS部署在与请求应用程序服务器相同的系统上。Adapter Layer处理与内容服务器的通信,封装套接字通信逻辑(打开、验证和通过套接字流线化数据位),并实现JCA CCI(Command Client Interface,命令客户接口)。

集成选项

  Stellent提供了灵活的和广泛的集成选项。每一个选项都有优点和缺点:

  • 命令层集成
    命令层集成基于使用Stellent CIS客户API来访问特定服务,如检查内容。但是,开发人员必须在传递参数和获得结果方面对Stellent API有所理解。

  命令层集成提供了灵活性和扩展性最好的集成选项。但是它需要在项目启动阶段做更多工作。使用上文提到的控件可减少采用这种方法所需的投入。

  • Content Portlet Suite ——兼容JSR 168
    Stellent Content Portlet Suite 解决方案建立在CIS层的基础上,它允许访问Stellent Content Server,使用户可以更新、搜索和查看内容。可以基于用户在企业中的角色和权限对他们启用不同的portlet,并且可以为特定的用户定制portlet。用户可以基于其权限进行浏览或搜索内容,插入新内容(要有适当的访问权限),以及在整个工作流中查看内容进度。

  Content Portlet Suite提供了一种容易的、开箱即用的集成解决方案方法。但是,这些portlet不像使用命令层集成那样能够定制。例如,构建能将元数据和文档内容结合起来的portlet就不容易。另外,这些portlet不支持高级功能(如预览内容)。

  • 内容管理服务提供者接口(Content Management SPI) 的实现
    WebLogic Portal提供了一个虚拟内容存储库(Virtual Content Repository,VCR) ,使用户能够插入多个异构的内容存储库。Stellent已经构建了一个集成方案,即Content Service Provider 实现——使Stellent WCM能够插入到VCR中。针对BEA的Stellent SPI集成建立在CIS层的基础上,并且只能跟BEA WebLogic Platform 8.1 Service Pack 2及以上版本兼容。

  通过使用BEA WebLogic Portal丰富的内容个性化JSP 标签,SPI实现可以交付个性化内容。但是,使用SPI不像使用命令层集成选项那样灵活和具有可扩展性。

  这些选项是集成的可行架构方法。但是,构建一个Stellent控件会提供重要的额外好处。WebLogic WorkShop Java控件提高了易用性。开发人员可以很容易地使用这个控件来构建由页面流和portlet组成的前端门户web应用程序,以及由Web services和进程组成的后端集成应用程序。此外,该控件与WebLogic Workshop和其他控件集成得很好,并提供了该Java控件的所有好处。因此提供了一个非常灵活的集成选项。

  作者已经构建了一个WebLogic Workshop控件来访问最常用的内容管理功能。这个控件提供了一个Stellent CIS API的外观,并使用了JavaBean包装器对象,这些包装器对象封装了调用各种Stellent服务所返回的结果。

Stellent控件概述

  这个控件设计用于提供一个易用的包装器,它忽略了Stellent CIS API的复杂性。通常,执行一次Stellent搜索需要编写下面的代码:
//Exception handling code not shown
//Get the command client
ICommandClient commandClient = new CommandClient();
commandClient.connect();
//Get the command facade
ICommandFacade commandFacade =
(ICommandFacade)commandClient.getBean(""CommandFacade"");
//Get the search command API object
ISCSSearchCommandAPI searchAPI = (ISCSSearchCommandAPI)
(commandFacade).getCommandAPI ("search");
//Create Stellent ISCS context
ISCSContext context = commandFacade.createSCSContext();
//Set context properties - user, adapter, contextPath, locale, device
context.setUser("testUser");
LWDataBinder binder = searchAPI.search (context, "queryString", 25);
//Get the search resultset from binder
LWResultSet resultSet = binder.getResultSet("SearchResults");
//Iterate over data and do some operation
if (resultSet != null && !resultSet.isEmpty())
{
resultSet.first();
for (int i = 0; i < resultSet.getNumRows(); i++)
{
int metadataCount = resultSet.getNumFields();
for(int j = 0; j < metadataCount; j++){
//Print the metadata name-value pair
System.out.println(resultSet.getFieldName(j) + "="
+ resultSet.getStringValue(j));
}
resultSet.next();
}
}

  正如您在上面的程序清单中所看到的,访问和使用API很直接,但有些冗长。通过把这些操作作为控件方法进行封装,就更容易与CIS进行交互了,而且您可以构建结构更复杂的代码。遵循这个例子,这个控件使用下面的控件方法公开了相同的代码:

StellentSearchResultSet search(StellentQueryBean queryBean)

  这里StellentQueryBean和StellentSearchResultSet是JavaBean包装器对象,它们分别封装了方法所期待的输入参数(用户上下文、查询字符串等等)以及调用搜索服务所返回的结果。类似地,JavaBean对象已经被用来封装调用其他Stellent服务时所需的输入和输出参数,从而降低复杂性,并为开发人员提供更简单的接口。

  这个控件建立在Stellent CIS层的基础上,并由两个组件组成:

  • 搜索控件:下述方法是用来检索元数据和内容的:
      byte[] getFile(StellentUserContext userContext, String aDocId, 
    String aContent, String rendition)
    byte[] getDynamicContent(StellentUserContext userContext, String aDocId,
    String aContent, String rendition, boolean rewriteForDisplay)
    StellentContentItem getDocInfoById(StellentUserContext userContext, String aDocId)
    StellentContentItem getDocInfoByName(StellentUserContext userContext, String aDocName)
    StellentSearchResultSet search(search.StellentQueryBean queryBean)
  • 管理控件:下面的方法是用来管理内容生命周期和工作流的:
    StellentWIPResultSet searchUnpublishedContent(StellentUserContext aUserContext)
        void deleteContentByID(StellentUserContext aUserContext, String aDocId)
        void newCheckIn(StellentUserContext aUserContext, String aContentId,
        String aContentType, String aTitle, String aSecurityGroup,
        String aSecurityAccount, Map aMetadataMap, InputStream aInpStream,
        String aFileName, long aFileSize)
        void revisionCheckIn(StellentUserContext aUserContext, String aDocId,
        String aContentId, String aContentType, String aTitle, String aSecurityGroup,
        String aSecurityAccount, String aRevisionLabel, Map aMetadataMap,
        InputStream aInpStream, String aFileName, long aFileSize)
        void checkout(StellentUserContext aUserContext, String aDocId, String aTitle)
        void undoCheckout(StellentUserContext aUserContext, String aDocId)
        void updateDocument(StellentUserContext aUserContext, String aDocId, String aContentID,
        String aRevisionLabel, String aSecurityGroup, String aSecurityAccount, Map aFieldMap)
        void approveWorkflow(StellentUserContext aUserContext, String aDocId)
        void rejectWorkflow(StellentUserContext aUserContext, String aDocId, String aMessage)
        boolean isValidStellentUser(StellentUserContext aUserContext)
        StellentWorkQueueResultSet getWorkflowQueueForUser(StellentUserContext aUserContext)
        StellentDocInfoResultSet getDocInfoByID(StellentUserContext aUserContext, String aDocId)
        

使用Stellent控件

  Stellent控件封装了Stellent API,并公开了一个纯Java接口来访问上面提到的不同内容管理接口。下面的示例代码阐明了如何使用已提供的Stellent控件来从用户的未决工作流中检索条目:

//Create new user context with the default adapter
StellentUserContext context =
new StellentUserContext("testUser");
try{
StellentWorkQueueResultSet queueRS =
stellentAdmin.getWorkflowQueueForUser(context);
//do something with the retrieved results
List list = queueRS.getResultBeans();
for(int i=0;i<list.size();i++){
StellentWorkQueueItem anItem =
(StellentWorkQueueItem)list.get(i);
System.out.println(anItem.getTitle());
}
}catch (StellentException se){
//Exception handling code here
}

  Stellent控件隐藏了与Stellent连接的复杂性,并可在任何WebLogic Workshop应用程序中使用,从web应用程序和Web services到WebLogic Portal和 WebLogic Integration应用程序。它大大提高了生产力,并可在多个项目和开发团队之间使用。

经验之谈

  在编写JavaBean包装器的过程中作者面临的最大挑战是,解释调用Stellent服务所返回的databinder类中的数据。调用任何一个Stellent服务都会返回一个LWDataBinder对象,这个LWDataBinder对象是由一组名值对和一个或多个LWResultSet对象的集合所组成。开发的JavaBean包装器对象StellentWIPResultSet、StellentWorkQueueResultSet、StellentDocInfoResultSet、StellentSearchResultSet和StellentContentItem封装了这种复杂性,并以一种简单得多的、易于使用的方式呈现返回的结果,因而提高了开发人员的生产率。 

结束语

  Stellent为集成Stellent WCM系统和WebLogic Platform 8.1提供了很多的选项。基于J2EE 的Stellent CIS层是所有这些选项的核心所在。JSR 168 portlet和内容管理SPI实现提供了易于使用的集成方法,只需花费很少的开发工作量。命令层集成展示了最具灵活性和可扩展性的集成选项。

  我们已经发现,将Stellent集成选项作为WebLogic Workshop控件可以提高灵活性和易用性。已提供的Stellent控件应该能减少采用命令层集成方法所需的投入。使用它,您可以快速构建丰富的门户和集成Stellent WCM的web应用程序。 

下载

  • 下载Stellent Workshop控件:stellentControl.jar (40KB)
  • Stellent控件的完整源代码:StellentControlApp.zip (1.6MB)
  • 获得安装说明书

  注意,Stellent控件已经用Stellent Content Server 7.5版本和Stellent CIS 7.2版本测试通过。 

相关文章:
© 2006   www.java-asp.net