使用 IBM Lotus Web Content Management 6.1 API 实现常见扩展场景

IBM Lotus Web Content Management(此后简称为 “Web Content Management”)API 为 Web Content Management 的标准特性提供了扩展。本文将介绍此 API 的使用和解决方案,以及用户在使用它时执行的最常见实现的代码样例。您可以对本文的代码样例加以选择,并将其按照原样放入到您的系统中。

Bhargav Thakker, 软件工程师, IBM

Bhargav Thakker 是 WebSphere Web Content Management 团队的软件工程师,在印度的 Pune 市的 IBM 公司工作。在 20006 加入 IBM 之前,他对基于 Java/J2EE 的 Web 应用程序进行了大量研究。Bhargav 是一名通过认证的 Web Content Management 开发人员,拥有计算机工程专业的学位。



Soumitra Limaye, 软件工程师, IBM

Soumitra Limaye 是 WebSphere Web Content Management 团队的主管,在印度的 Pune 市的 IBM 公司工作。在 2006 年加入 IBM 之前,他对 UNIX(管理脚本)和其他 Portal 服务器(比如 BEA WebLogic)进行了大量研究。Soumitra 是一名通过认证的 Web Content Management 开发人员,拥有计算机工程专业的学位。



2010 年 1 月 19 日

1 简介

您可以使用 Web Content Management 产品的 API 和 JavaServer PagesTM (JSP) 文件扩展它的标准特性。Lotus Web Content Management API 主要关注以编程方式处理内容,它是访问 Web Content Management 站点的另一种方式。它允许完全使用 JavaTM 代码创建、编辑、删除和呈现内容和其他 Web Content Management 对象。

此外,您可以以一种全新的方式操作站点并将 Web Content Management 与其他应用程序集成在一起。

使用 Web Content Management API 可以实现许多功能;下面是其中的一些:

  • Web 内容库:
    • 在库内部移动或复制项。
    • 在库与库之间移动或复制项。
  • 项 ID 的搜索迭代器:
    • 按名称查找给定类型的项。
    • 查找具有给定类型的项。
    • 按名称查找库组件。
    • 按编写模板查找内容。
    • 按类别查找内容。
    • 按路径查找内容。
    • 按工作流阶段查找内容。
    • 查找在某个日期之后修改的内容。
    • 修改在两个日期之间修改的内容。
  • 内容搜索(类似于 Menu Component 搜索项,但是使用与 id 相同的项参数)。
  • 通过项 ID 检索。
  • 创建、删除和保存以下项的能力:
    • 内容
    • 站点
    • 站点区域
    • 文件资源组件
    • HTML 组件
    • 图像组件
    • 日期和时间组件
    • 链接组件
    • 数值组件
    • 富文本组件
    • 样式表组件
    • 短文本组件
    • 文本组件
    • 用户选择组件
    • 分类
    • 类别
  • 检索以下项的能力:
    • 内容
    • 站点
    • 站点区域
    • 分类和类别
    • 工作流
    • 组件
  • 从搜索中检索以下项的能力(但是不是以项的形式):
    • 编写模板 ID(编写模板)
    • 演示模板 ID(演示模板)
    • 工作流阶段 ID
  • 在工作流阶段中批准或拒绝内容项的能力。其他项类型不支持这种功能。

Javadocs 应当被视为一个使用 API 的完整的可用特性集。Javadoc HTML 文件位于 was profile root\instal ledApps\nodename\wcm .ear\ilwwcm .war\webinterface\ 文件夹下。

下面提供的所有样例都可以直接应用于或合并到您的代码,以根据环境中必须实现的各种场景来获得所需的结果。我们为大部分代码添加了注释(以斜体 显示),以方便理解代码和流程。

注意:有关更多信息,请参考 IBM Lotus Web Content Management API 信息中心主题,本小节中的内容就是从其中摘取而来。


2 假设和考虑

在开始之前,注意以下问题:

  • 用户必须访问以下代码样例中提到的所有对象。
  • 我们不会使用 try-catch 方式获取异常。
  • moveToLibrary 的 Javadoc 中这样陈述:“这种方法将非层次化的或项移动到另一个库”。
  • 站点和分类被认为是根项。
  • 参考本文档的第 4 小节“在所有示例中指定的名称的标准”,其中解释了代码样例中使用的标准。

3 针对每种需求使用 API 实现不同场景的代码样例

以下的所有场景均在 6.1 版本的 Web Content Management 中测试过;然而,同样的逻辑可以应用于版本 6.0,只需在需要时对 API 进行修改。

场景 1:按名称查找给定类型的项

要按名称查找给定类型的项,您可以选择并使用清单 1 中的相应 API 代码。通过这些代码,您可以使用 workspace.findbyName API 搜索 Site、Site Area、Content、Content Link、Authoring 模板、Presentation 模板、所有库组件、工作流、工作流阶段、分类和类别等等。

这实际上将返回一个具有指定名称的特定类型的所有对象的 ID 迭代器。

清单 1. 按名称查找项的示例代码
<%@ page import="com.ibm.workplace.wcm.api. *"%>
<%@ page import="java.util.*"%>
<%
// retrieve repository
Repository repository = WCM_API.getRepository();
// get the workspace for current user
Workspace workspace = repository.getWorkspace(request.getUserPrincipal());
// set the library 
// workspace.setCurrentDocumentLibrary(workspace.getDocumentLibrary("WebContent"));
// **************************** Find Site example *************************** 
// define site name
String siteName = new String("Site");
// find site by name
DocumentIdIterator siteIterator = workspace.findByName(DocumentTypes. Site,siteName);
if (siteIterator.hasNext()) {
    out.println("Site found : " + siteName + "<br>");
}else {
    out.println("Could not find site : " + siteName + "<br>");
}
// ************************* Find Sitearea example **************************
// define sitearea name
String siteArea = new String("SiteArea");
// find sitearea by name
DocumentIdIterator siteAreaIterator =
workspace.findByName(DocumentTypes. SiteArea,siteArea);
if (siteAreaIterator.hasNext()) {
out.println("Sitearea found : " + siteArea + "<br>");
}else {
out.println("Could not find Sitearea : " + siteArea + "<br>");
}
// ************************* Find Content example ***************************
// define content name
String contentName = new String("Content");
// find content by name
DocumentIdIterator contentIterator = workspace
    .findByName(DocumentTypes.Content,contentName);
if (contentIterator.hasNext()) {
out.println("Content found : " + contentName + "<br>");
}else {
out.println("Could not find Content : " + contentName + "<br>");
}
// *********************** Find Authoring Template example *******************
// define authoring template name
String authoringTemplateName = new String("AuthoringTemplate");
// find authoring template by name
DocumentIdIterator authoringTemplateIterator = 
    workspace.findByName(DocumentTypes.AuthoringTemplate,authoringTemplateName);
if (authoringTemplateIterator.hasNext()) {
   out.println("Authoring template found : " + authoringTemplateName + "<br>");
}else {
   out.println("Could not find Authoring template: " + authoringTemplateName + "<br>");
}
// *********************** Find Presentation Template example *****************
// define presentation template name
String presentationTemplateName = new String("PresentationTemplate");
// find presentation template by name
DocumentIdIterator presentationTemplateIterator = 
    workspace.findByName(DocumentTypes.PresentationTemplate,presentationTemplateName);
if (presentationTemplateIterator.hasNext()) {
    out.println("Presentation template found : " + presentationTemplateName + "<br>");
}else {
    out.println("Could not find Presentation template: " 
		+ presentationTemplateName + "<br>");
}
// *********************** Find Library Component example *******************
// define library component name
String libraryComponentName = new String("LibraryComponent");
// find library component by name
DocumentIdIterator libraryComponentIterator = 
    workspace.findByName(DocumentTypes.LibraryComponent,libraryComponentName);
if (libraryComponentIterator.hasNext()) {
    out.println("Library component found : " + libraryComponentName + "<br>");
}else {
    out.println("Could not find Library component: " + libraryComponentName + "<br>");
}
// *************************** Find Workflow example ***********************
// define workflow name
String workflowName = new String("Workflow");
// find workflow by name
DocumentIdIterator workflowIterator = workspace
    .findByName(DocumentTypes.Workflow,workflowName);
if (workflowIterator.hasNext()) {
out.println("Workflow found : " + workflowName + "<br>");
}else {
out.println("Could not find Workflow: " + workflowName + "<br>");
}
// ************************* Find Workflow Stage example ********************
// define workflow stage name
String workflowStageName = new String("WorkflowStageName");
// find workflow stage by name
DocumentIdIterator workflowStageIterator = 
    workspace.findByName(DocumentTypes.WorkflowStage,workflowStageName);
if (workflowStageIterator.hasNext()) {
    out.println("Workflow Stage found : " + workflowStageName + "<br>");
}else {
    out.println("Could not find Workflow Stage: " + workflowStageName + "<br>");
}
// ************************** Find Taxonomy example ************************
// define taxonomy name
String taxonomyName = new String("Taxonomy");
// find taxonomy by name
DocumentIdIterator taxonomyIterator = 
    workspace.findByName(DocumentTypes.Taxonomy,taxonomyName);
if (taxonomyIterator.hasNext()) {
    out.println("Taxonomy found : " + taxonomyName + "<br>");
}else {
    out.println("Could not find Taxonomy: " + taxonomyName + "<br>");
}
// ************************** Find Category example *************************
// define category name
String categoryName = new String("Category");
// find category by name
DocumentIdIterator categoryIterator = 
    workspace.findByName(DocumentTypes.Category,categoryName);
if (categoryIterator.hasNext()) {
out.println("Category Found : " + categoryName + "<br>");
}else {
out.println("Could not find Category : " + categoryName + "<br>");
}
%>

场景 2:根据项类型查找项

要根据特定类型查找项,可以直接选择和使用清单 2 中的相应的 API 代码。通过这些代码,您可以使用workspace.findbyType API 搜索所有 Sites、Site Areas、Contents、Content Links、Authoring templates、Presentation 模板、所有库组件、工作流、工作流阶段、分类和类别等等。

这将返回给定类型的所有对象的 ID 迭代器。

清单 2. 按类型查找项的示例代码
<%@ page import="com.ibm.workplace.wcm.api. *"%>
<%@ page import="java.util.*"%>
<%
// retrieve repository
Repository repository = WCM_API.getRepository();
// get workspace for current user
Workspace workspace = repository.getWorkspace(request.getUserPrincipal());
// set library 
// workspace.setCurrentDocumentLibrary(workspace.getDocumentLibrary("WebContent"));
// **************************** Find Site example ***************************
// find all sites
DocumentIdIterator siteIterator 
    = workspace.findByType(DocumentTypes. Site); DocumentId siteId = null;
if(siteIterator.hasNext()) {
while(siteIterator.hasNext())
{
siteId = siteIterator.nextId();
out.println("Found Site : " + siteId.getName() + "<br>");
} else {
out.println("Could not find any Site");
}
// ************************** Find Sitearea example *************************
// find all siteareas
DocumentIdIterator siteAreaIterator 
    = workspace.findByType(DocumentTypes. SiteArea); DocumentId siteAreaId = null;
if(siteAreaIterator.hasNext()) {
while(siteAreaIterator.hasNext())
{
siteAreaId = siteAreaIterator.nextId();
out.println("Found Sitearea : " + siteAreaId.getName() + "<br>");
}
} else {
out.println("Could not find any Sitearea");
}
// ************************** Find Content example **************************
// find all contents
DocumentIdIterator contentIterator 
    = workspace.findByType(DocumentTypes.Content); DocumentId contentId = null;
if(contentIterator.hasNext()) {
while(contentIterator.hasNext())
{
contentId = contentIterator.nextId();
out.println("Found Content : " + contentId.getName() + "<br>");
}
} else {
out.println("Could not find any Content");
}
// ********************** Find Authoring Template example *********************
// find all authoring templates
DocumentIdIterator authoringTemplateIterator 
    = workspace.findByType(DocumentTypes.AuthoringTemplate);
DocumentId authoringTemplateId = null;
if(authoringTemplateIterator.hasNext()) { 
    while(authoringTemplateIterator.hasNext())
    {
    authoringTemplateId = authoringTemplateIterator.nextId();
    out.println("Found Authoring Template : " + authoringTemplateId.getName() +
    "<br>");
    }
} else {
    out.println("Could not find any Authoring Template");
}
// ********************* Find Presentation Template example ********************
// find all presentation templates
DocumentIdIterator presentationTemplateIterator 
    = workspace.findByType(DocumentTypes.PresentationTemplate); 
DocumentId presentationTemplateId = null;
if(presentationTemplateIterator.hasNext()) {
  while(presentationTemplateIterator.hasNext())
  {
  presentationTemplateId = presentationTemplateIterator.nextId();
  out.println("Found Presentation Template : " + presentationTemplateId.getName()
  + "<br>");
  }
} else {
  out.println("Could not find any Presentation Template");
}
// ********************** Find Library Component example *********************
// find all library components
DocumentIdIterator libraryComponentIterator 
    = workspace.findByType(DocumentTypes.LibraryComponent); 
DocumentId libraryComponentId = null;
if(libraryComponentIterator.hasNext()) {
  while(libraryComponentIterator.hasNext())
  {
  libraryComponentId = libraryComponentIterator.nextId();
  out.println("Found Library component : " + libraryComponentId.getName() +
  "<br>");
  }
} else {
  out.println("Could not find any Library component");
}
// ************************** Find Workflow example *************************
// find all workflows
DocumentIdIterator workflowIterator = workspace.findByType(DocumentTypes.Workflow);
DocumentId workflowId = null;
if(workflowIterator.hasNext()) {
  while(workflowIterator.hasNext())
  {
  workflowId = workflowIterator.nextId();
  out.println("Found Workflow : " + workflowId.getName() + "<br>");
  }
} else {
  out.println("Could not find any Workflow");
}
// ************************ Find Workflow Stage example **********************
// find all workflow stages
DocumentIdIterator workflowStageIterator 
    = workspace.findByType(DocumentTypes.WorkflowStage); 
DocumentId workflowStageId = null;
if(workflowStageIterator.hasNext()) {
  while(workflowStageIterator.hasNext())
  {
  workflowStageId = workflowStageIterator.nextId();
  out.println("Found Workflow Stage : " + workflowStageId.getName() + "<br>");
  }
} else {
  out.println("Could not find any Workflow Stage");
}
// ************************** Find Taxonomy example ************************
// find all taxonomies
DocumentIdIterator taxonomyIterator = workspace.findByType(DocumentTypes.Taxonomy); 
DocumentId taxonomyId = null;
if(taxonomyIterator.hasNext()) {
  while(taxonomyIterator.hasNext())
  {
  taxonomyId = taxonomyIterator.nextId();
  out.println("Found Taxonomy : " + taxonomyId.getName() + "<br>");
  }
} else {
  out.println("Could not find any Taxonomy");
}
// ************************** Find Category example *************************
// find all categories
DocumentIdIterator categoryIterator = workspace.findByType(DocumentTypes.Category); 
DocumentId categoryId = null;
if(categoryIterator.hasNext()) {
  while(categoryIterator.hasNext())
  {
  categoryId = categoryIterator.nextId();
  out.println("Found Category : " + categoryId.getName() + "<br>");
  }
} else {
  out.println("Could not find any Category");
}
%>

场景 3:根据各种条件查找内容

要按照 Authoring Template、Category、路径、Workflow Stag 和修改日期查找内容,可以选择和使用清单 3 中的相应的 API 代码,使用以下 API:

  • workspace.findContentByAuthoringTemplate
  • workspace.findContentByCategory
  • workspace.findContentByPath
  • workspace.findContentByWorkflowStage
  • workspace.findContentModifiedSince
  • workspace.findContentModifiedBetween
清单 3. 按条件查找内容的示例代码
<%@ page import="com.ibm.workplace.wcm.api. *"%>
<%@ page import="java.util.*"%>
<%
// retrieve repository
Repository repository = WCM_API.getRepository();
// get workspace for current user
Workspace workspace = repository.getWorkspace(request.getUserPrincipal());
// Set library 
// workspace.setCurrentDocumentLibrary(workspace.getDocumentLibrary("WebContent"));
DocumentIdIterator contentIterator = null; 
DocumentId contentId = null;
// **************** Find Content by authoring template example ******************
// define authoring template
String authoringTemplateName = new String("AuthoringTemplate");
// find authoring template by name
DocumentIdIterator authoringTemplateIterator 
    = workspace.findByName(DocumentTypes.AuthoringTemplate,authoringTemplateName);
DocumentId authoringTemplateId = null; 
if (authoringTemplateIterator.hasNext()) {
out.println("Authoring Template found : " + authoringTemplateName + "<br>"); 
authoringTemplateId = authoringTemplateIterator.nextId();
// find all the contents having above authoring template
contentIterator = workspace.findContentByAuthoringTemplate(authoringTemplateId);
if(contentIterator.hasNext()) {
contentId = contentIterator.nextId();
out.println("List of Content uses " + authoringTemplateName ); 
while(contentId!=null) {
out.println( "<BR>" + contentId.getName());
contentId = contentIterator.nextId();
}
} else {
out.println("Could not find any Content that uses " + authoringTemplateName );
}
}else {
out.println("Could not find Authoring Template: " + authoringTemplateName + "<br>");
}
// ******************* Find Content by Category example ***********************
// define category
String categoryName = new String("Category"); DocumentId categoryId = null;
// find category by name
DocumentIdIterator categoryIterator 
    = workspace.findByName(DocumentTypes.Category,categoryName);
if (categoryIterator.hasNext()) {
out.println("Category found : " + categoryName + "<br>"); 
categoryId = categoryIterator.nextId();
// find all the content having above category
contentIterator = workspace.findContentByCategory(categoryId);
if(contentIterator.hasNext()) {
out.println("List of Content uses " + categoryName ); 
while(contentIterator.hasNext()) {
contentId = contentIterator.nextId();
out.println( "<BR>" + contentId.getName());
}
} else {
out.println("Could not find any Content that uses " + categoryName );
}
}else {
out.println("Could not find Category: " + categoryName + "<br>");
}
// ******************* Find Content by Path example **************************
// define content path
String contentPath = "/Web content/Site/SiteArea/Content";
// find content by path
contentIterator = workspace.findContentByPath(contentPath);
if (contentIterator.hasNext()) {
contentId = contentIterator.nextId();
out.println("Content found on Path : " + contentPath 
    + " : Content name : " + contentId.getName() + "<br>");
}else {
out.println("Could not find Content on Path : " + contentPath + " <BR>");
}
// ******************* Find Content by Workflow Stage example ******************
// define workflow stage
String workflowStageName = new String("WorkflowStageName");
// find workflow stage by name
DocumentIdIterator workflowStageIterator 
    = workspace.findByName(DocumentTypes.WorkflowStage,workflowStageName);
if (workflowStageIterator.hasNext()) {
DocumentId workflowStageId = workflowStageIterator.nextId(); 
out.println("Workflow Stage found : " + workflowStageName + "<br>");
// find all the content having above workflow stage
contentIterator = workspace.findContentByWorkflowStage(workflowStageId);
if(contentIterator.hasNext()) {
contentId = contentIterator.nextId();
out.println("List of contents under Workflow Stage " + workflowStageName ); 
while(contentId!=null) {
out.println( "<BR>" + contentId.getName());
contentId = contentIterator.nextId();
}
} else {
out.println("Could not find any content under Workflow Stage " + workflowStageName );
}
}else {
out.println("Could not find Workflow Stage: " + workflowStageName + "<br>");
}
// ******************* Find Content since modified date example *****************
// define start date in dd/mm/yyyy format Date startDate = new Date("01/01/2008");
// find content modified since start date
contentIterator = workspace.findContentModifiedSince(startDate);
if(contentIterator.hasNext()) {
contentId = contentIterator.nextId();
out.println("List of contents modified since " + startDate ); 
while(contentId!=null) {
out.println( "<BR>" + contentId.getName()); contentId = contentIterator.nextId();
}
} else {
out.println("Could not find any content modified since " + startDate );
}
%>
// **************** Find Content modified between two dates example *************
// define start date in dd/mm/yyyy format startDate = new Date("0 1/01/2008");
// define end date in dd/mm/yyyy format Date endDate = new Date("12/31/2009");
// find all the contents modified between start date and end date
contentIterator = workspace.findContentModifiedBetween(startDate,endDate);
if(contentIterator.hasNext()) {
contentId = contentIterator.nextId();
out.println("List of contents modified between " + startDate + "and" + endDate ); 
while(contentId!=null) {
out.println( "<BR>" + contentId.getName());
contentId = contentIterator.nextId();
}
} else {
out.println("Could not find any content modified between " + startDate + "and" +
endDate );
}
%>

场景 4:根据 Authoring Template、Site Area、Category 和 Keywords 条件搜索内容:

要根据由 Authoring Template、Site Area、Category 或 Keywords 组成的条件组合搜索内容,可以选择并使用清单 4 中的相应 API。您可以通过 ContentSearch 方法实现此搜索,该方法将返回匹配给定搜索条件的对象的 ID 迭代器。

ContentSearch 方法的行为类似于 Menu Component。如果已经指定了 Site Areas,那么所有父类和子类 Site Areas 也将包括在搜索中。

这将执行 “or” 搜索,而不是 “and” 搜索。这意味着对两个不同 Categories 和一个 Content Template 的搜索将返回至少使用两种 profile 类型(一个 Category 和一个 Template)的其中之一描述的内容,而不是匹配所有参数的内容。只匹配一种条件类型(只匹配 Template )的内容不会被返回。

注意,返回的结果的顺序是不确定的,并且所有的参数都是可选的,最后一个参数 matchAllKeys 除外。

清单 4. 根据条件搜索代码的示例代码
<%@ page import="com.ibm.workplace.wcm.api. *"%> 
<%@ page import="java.util.*"%>
<%
// retrieve repository
Repository repository = WCM_API.getRepository();
// get workspace for current user
Workspace workspace = repository.getWorkspace(request.getUserPrincipal());
// Set library 
// workspace.setCurrentDocumentLibrary(workspace.getDocumentLibrary("WebContent"));
DocumentId contentId = null;
DocumentId authoringTemplateId = null; DocumentId siteAreaId = null;
DocumentId categoryId = null;
// define authoring template
String authoringTemplateName = new String("AuthoringTemplate");
// find authoring template by name
DocumentIdIterator authoringTemplateIterator 
    = workspace.findByName(DocumentTypes.AuthoringTemplate,authoringTemplateName);
if (authoringTemplateIterator.hasNext()) {
authoringTemplateId = authoringTemplateIterator.nextId();
out.println("Authoring Template found : " + authoringTemplateName + "<br>");
}else {
out.println("Could not find Authoring Template: " + authoringTemplateName + "<br>");
}
// define siteare
String siteArea = new String("SiteArea");
// find sitearea by name
DocumentIdIterator siteAreaIterator 
    = workspace.findByName(DocumentTypes. SiteArea,siteArea);
if (siteAreaIterator.hasNext()) {
siteAreaId = siteAreaIterator.nextId();
out.println("Sitearea Found : " + siteArea + "<br>");
}else {
out.println("Could not find Sitearea : " + siteArea + "<br>");
}
// define category
String categoryName = new String("Category");
// find category by name
DocumentIdIterator categoryIterator 
    = workspace.findByName(DocumentTypes.Category,categoryName);
if (categoryIterator.hasNext()) {
categoryId = categoryIterator.nextId();
out.println("Category Found : " + categoryName + "<br>");
}else {
out.println("Could not find Category : " + categoryName + "<br>");
}
// define keywords
String[] keywords = new String[]{"Keyword"};
// search all the contents based on authoring template , 
// sitearea , category and keywords
DocumentIdIterator contentIterator 
    = workspace.contentSearch(authoringTemplateId, 
	    new DocumentId [] {siteAreaId}, 
        new DocumentId [] {categoryId}, 
        keywords,true);
if(contentIterator.hasNext()) {
contentId = contentIterator.nextId();
while(contentId!=null) {
out.println("Found Content : " + contentId.getName() + "<br>");
contentId = contentIterator.nextId();
}
} else {
out.println("Could not find any Content using the contentSearch Method");
}
%>

场景 5:创建一个新站点

您可以使用 Web Content Management API 方法创建一个新站点,创建好站点之后,还可以在 Site Object 下使用所有方法。您可以选择和使用清单 5 中的相应代码,它们只演示了新站点的创建、设置站点名、标题和描述,并将其保存到存储库中。

我们使用 workspace.createSite 实现这点,它将返回新的 Site 对象。

清单 5. 创建新站点的示例代码
<%@ page import="com.ibm.workplace.wcm.api. *"%>
<%@ page import="java.util.*"%>
<%
// retrieve repository
Repository repository = WCM_API.getRepository();
// get workspace for current user
Workspace workspace = repository.getWorkspace(request.getUserPrincipal());
// Set library 
// workspace.setCurrentDocumentLibrary(workspace.getDocumentLibrary("WebContent"));
// create new site
Site newSite = workspace.createSite();
newSite. setName("NewSite");
newSite. setTitle("NewSite");
newSite.setDescription("New Site Created using WCM API");
String[] saveMessage = workspace.save((Document)newSite);
if (saveMessage.length==0) {
    out.println("Could not create new Site. .<BR>");
}else{
    out.println("New Site created successfully.");
}
%>

场景 6:创建新的 Site Area

还可以使用 Web Content Management API 方法创建新的站点区域,之后可以在 Site Area Object 下使用所有这些方法。

清单 6 仅展示了新站点区域的创建,设置名称、标题、描述并将其保存到存储库中。我们在这里使用 workspace.createSiteArea,它将在给定父项下创建一个新站点区域。该父项可能是站点或站点区域,并且方法将返回新的 Site Area 对象。

清单 6. 创建新站点区域的示例代码
<%@ page import="com.ibm.workplace.wcm.api. *"%>
<%@ page import="java.util. *"%>
<%
// retrieve repository
Repository repository = WCM_API.getRepository();
// get workspace for current user
Workspace workspace = repository.getWorkspace(request.getUserPrincipal());
// Set library 
// workspace.setCurrentDocumentLibrary(workspace.getDocumentLibrary("WebContent"));
DocumentId documentId = null; Site parentSite = null;
String parentSiteName = "Site"; DocumentId siblingId = null;
// find parent site
DocumentIdIterator siteIterator 
    = workspace.findByName(DocumentTypes. Site ,parentSiteName); 
if (siteIterator.hasNext()) {
documentId = siteIterator.nextId();
parentSite = (Site) workspace.getById(documentId);
// create new sitearea
SiteArea newSiteArea 
    = workspace.createSiteArea((DocumentId)parentSite.getId(),
	    siblingId,ChildPosition.END);
newSiteArea. setName("NewSiteArea");
newSiteArea.setTitle("NewSiteArea");
newSiteArea.setDescription("New Sitearea Created using WCM API
String[] saveMessage = workspace. save((Document)newSiteArea);
if (saveMessage.length==0) {
out.println (" <BR> Created new Sitearea under " + parentSiteName );
}
} else {
out.println (" <BR> Could not find parent Site " + parentSiteName 
    + ". Could not create a new Sitearea." );
}
%>

场景 7:创建新内容

通过使用 Web Content Management API,您可以在特定的位置在特定的站点区域下创建新的内容。您可以选择和使用清单 7 中的相应代码,这些代码演示了使用特定的 Authoring Template 在最后一个位置以及特定站点区域下创建内容。

代码还对工作流进行了配置,并保存了内容。我们使用 workspace.createContent 实现此目的,它将根据指定的 Authoring Template 返回新内容对象。API 代码可以根据需求更改。

清单 7. 创建新内容的示例代码
<%@ page import="com.ibm.workplace.wcm.api. *"%>
<%@ page import="java.util.*"%>
<%
// retrieve repository
Repository repository = WCM_API.getRepository();
// get workspace for current user
Workspace workspace = repository.getWorkspace(request.getUserPrincipal());
// Set library 
// workspace.setCurrentDocumentLibrary(workspace.getDocumentLibrary("WebContent"));
// define authoring template
String authoringTemplateName = new String("AuthoringTemplate");
// define parent sitearea
String parentSiteAreaName = new String("SiteArea");
// define workflow
String workflowName = new String("Workflow");
DocumentId authoringTemplateId = null;
DocumentId parentSiteAreaId = null;
DocumentId siblingId = null;
DocumentId workflowId = null;
// find authoring template by name
DocumentIdIterator authoringTemplateIterator
    = workspace.findByName(DocumentTypes.AuthoringTemplate,authoringTemplateName);
if (authoringTemplateIterator.hasNext()) {
authoringTemplateId = authoringTemplateIterator.nextId();
out.println("Authoring Template found : " + authoringTemplateName + "<br>");
}else {
out.println("Could not find Authoring Template: " + authoringTemplateName + "<br>");
}
// find sitearea by name
DocumentIdIterator siteAreaIterator =
workspace.findByName(DocumentTypes. SiteArea,parentSiteAreaName );
if (siteAreaIterator.hasNext()) {
parentSiteAreaId = siteAreaIterator.nextId();
out.println("Sitearea Found : " + parentSiteAreaName + "<br>");
}else {
out.println("Could not find Sitearea : " + parentSiteAreaName + "<br>");
}
// find workflow by name
DocumentIdIterator workflowIterator 
    = workspace.findByName(DocumentTypes.Workflow,workflowName);
if (workflowIterator.hasNext()) {
workflowId = workflowIterator.nextId();
out.println("Workflow found : " + workflowName + "<br>");
}else {
out.println("Could not find Workflow: " + workflowName + "<br>");
}
if((authoringTemplateId!=null) && (parentSiteAreaId!=null) && (workflowId!=null)) {
// create new content
Content newContent 
    = workspace.createContent(authoringTemplateId,
	    parentSiteAreaId,
	    siblingId,
	    ChildPosition.END);
newContent. setName("NewContent");
newContent. setTitle("NewContent");
newContent.setDescription("New Content created using WCM API");
newContent. setWorkflowId(workflowId);
String[] saveMessage = workspace. save((Document)newContent);
if (saveMessage.length==0) {
out.println (" <BR> Created new Content under " + parentSiteAreaName );
}else {
out.println ("Could not create new content");
}
%>

场景 8:创建一个链接到现有内容的新内容链接

您可以在指定站点空间下创建一个链接到现有内容的新内容链接。在创建内容链接之前,必须对内容进行保存,而内容链接会被立即创建,因此不应该保存。

我们使用 workspace.createContentLink 实现此目的,它将返回一个新的 Content Link 对象。清单 8 中的代码假设 Content Link 没有在站点区域下给出。

清单 8. 创建新内容链接的示例代码
<%@ page import="com.ibm.workplace.wcm.api. *"%>
<%@ page import="java.util.*"%>
<%
// retrieve repository
Repository repository = WCM_API.getRepository();
// get workspace for current user
Workspace workspace = repository.getWorkspace(request.getUserPrincipal());
// Set library 
// workspace.setCurrentDocumentLibrary(workspace.getDocumentLibrary("WebContent"));
// define content
String contentName = new String("Content");
// define sitearea where the content link needs to be created 
// String parentSiteArea = new String("NewSiteArea");
DocumentId contentId = null;
DocumentId parentSiteAreaId =null; DocumentId siblingId = null;
// find content by name
DocumentIdIterator contentIterator 
    = workspace.findByName(DocumentTypes.Content,contentName);
if (contentIterator.hasNext())
contentId = contentIterator.nextId();
// find sitearea by name
DocumentIdIterator parentSiteAreaIterator =
workspace.findByName(DocumentTypes. SiteArea,parentSiteArea);
if (parentSiteAreaIterator.hasNext())
parentSiteAreaId = parentSiteAreaIterator.nextId();
if((contentId!=null) && (parentSiteAreaId!=null)) {
// create content link ContentLink contentLink =
workspace. createContentLink(contentId,
    parentSiteAreaId, 
    siblingId, 
    ChildPosition.END);
out.println("New Content link of Content " 
    + contentName + " is created under new Sitearea " 
    + parentSiteArea);
} else{
out.println("Could not create Content link of Content " 
    + contentName + " under new Sitearea " 
    + parentSiteArea);
}
%>

场景 9:创建各种库组件

您可以创建库组件,比如 DateComponent、DocumentManagerComponent、FileComponent、HTMLComponent、ImageComponent、JSPComponent、LinkComponent、RichTextComponent、ShortTextComponent、TextComponent 和 UserSelectionComponent。

清单 9 中的代码演示了内容创建、设置名称、标题和描述,以及将内容保存到 Web Content Management 存储库中。可以直接使用这些代码创建 文件组件、图像组件和富文本组件:

  • workspace.createFi leComponent
  • workspace.createImageComponent
  • workspace.createRichTextComponent

创建好组件后可以使用其他 API。

清单 9. 创建各种库组件的示例代码
<%@ page import="com.ibm.workplace.wcm.api. *"%>
<%@ page import="java.util.*"%>
<%
// retrieve repository
Repository repository = WCM_API.getRepository();
// get workspace for current user
Workspace workspace = repository.getWorkspace(request.getUserPrincipal());
// Set library 
// workspace.setCurrentDocumentLibrary(workspace.getDocumentLibrary("WebContent"));
String[] saveMessage = new String[1];
// ***************** Create File Resource Component example ********************
LibraryFileComponent libraryFileComponent = workspace.createFileComponent();
libraryFileComponent.setName("NewFileComponent");
libraryFileComponent.setTitle("NewFileComponent");
libraryFileComponent.setDescription("New File resource component created using API");
saveMessage = workspace.save((Document)libraryFileComponent);
out.println ("<BR> New File resource component created :" 
    + libraryFileComponent.getName());
// ******************* Create Image Component example ***********************
LibraryImageComponent libraryImageComponent = workspace.createImageComponent();
libraryImageComponent.setName("NewImageComponent");
libraryImageComponent.setTitle("NewImageComponent");
libraryImageComponent.setDescription("New Image component created using API");
saveMessage = workspace. save((Document)libraryImageComponent);
out.println ("<BR> New Image component created :" + libraryImageComponent.getName());
// ******************* Create Rich Text Component example **********************
LibraryRichTextComponent libraryRichTextComponent = workspace.createRichTextComponent();
libraryRichTextComponent.setName("NewRichTextComponent");
libraryRichTextComponent.setTitle("NewRichTextComponent");
libraryRichTextComponent.setDescription("New Rich text component created using API");
saveMes sage = workspace.save((Document)libraryRichTextComponent);
out.println ("<BR> New Rich text component created :" 
    + libraryRichTextComponent.getName());
%>

场景 10:创建新分类和新类别

您可以在某个特定类别或分类下创建新的分类以及新的类别。清单 10 的代码演示了在特定的父分类下创建新的分类和新的类别,并且您可以直接在自己的代码中使用这些代码。我们使用:

  • workspace.createTaxonomy,返回新的分类对象
  • workspace.createCategory,返回新的类别对象
清单 10. 创建新分类和新类别的示例代码
<%@ page import="com.ibm.workplace.wcm.api. *"%>
<%@ page import="java.util.*"%>
<%
// retrieve repository
Repository repository = WCM_API.getRepository();
// get workspace for current user
Workspace workspace = repository.getWorkspace(request.getUserPrincipal());
// Set library 
// workspace.setCurrentDocumentLibrary(workspace.getDocumentLibrary("WebContent"));
String[] saveMessage = new String[1];
// *********************** Create Taxonomy example **************************
Taxonomy parentTaxonomy = workspace.createTaxonomy();
parentTaxonomy. setName("NewParentTaxonomy");
parentTaxonomy.setTitle("NewParentTaxonomy");
parentTaxonomy.setDescription("New Taxonomy created using WCM API");
saveMessage = workspace.save((Document)parentTaxonomy);
if (saveMessage.length==0) {
out.println (" <BR> Created new Taxonomy : " + parentTaxonomy.getName());
}
// *********************** Create Category example **************************
Category newCategory = workspace.createCategory((DocumentId)parentTaxonomy.getId());
newCategory.setName("NewCategory");
newCategory.setTitle("NewCategory");
newCategory.setDescription("New Category Created using WCM API");
saveMessage = workspace.save((Document)newCategory);
if (saveMessage.length==0) {
    out.println (" <BR> Created new Category : " + newCategory.getName());
}
%>

场景 11:在已发布的内容项上创建和取消草稿

您可以使用一个 Web Content Management API 在已发布的内容项上创建和取消草稿。清单11 中的代码可以用来直接创建现有内容的草稿,也可以用来为已发布的内容取消现有草稿。

清单 11. 创建和取消草稿的示例代码
<%@ page import="com.ibm.workplace.wcm.api. *"%>
<%@ page import="java.util.*"%>
<%
// retrieve repository
Repository repository = WCM_API.getRepository();
// get workspace for current user
Workspace workspace = repository.getWorkspace(request.getUserPrincipal());
// Set library 
// workspace.setCurrentDocumentLibrary(workspace.getDocumentLibrary("WebContent"));
// define the publish content
String contentName = new String("PublishedContent");
DocumentId contentId = null;
// find content by name
DocumentIdIterator contentIterator 
    = workspace.findByName(DocumentTypes.Content,contentName);
if (contentIterator.hasNext()) {
contentId = contentIterator.nextId();
Content content = (Content) workspace.getById(contentId);
// create draft from publish content
Document draftContent = content.createDraftDocument();
out.println("Draft created for content " + contentName);
// cancel draft
if (content. hasDraft()) {
draftContent = content.cancelDraftDocument();
out.println("Draft cancled for " + contentName);
} else {
out.println("Draft does not exist for content : " 
    + contentName);
}
}
%>

场景 12:将内容移动到工作流的下一阶段,重启工作流,对特定内容设置另一个工作流

您可以将内容移动到工作流的下一阶段,重启工作流,对特定内容设置另一个工作流。您可以使用清单 12 中的代码将内容从草稿阶段进入发布阶段,重新启动工作流,然后为特定的内容项设置另一个工作流。

清单 12. 移动内容的示例代码
<%@ page import="com.ibm.workplace.wcm.api. *"%>
<%@ page import="java.util.*"%>
<%
// retrieve repository
Repository repository = WCM_API.getRepository();
// get workspace for current user
Workspace workspace = repository.getWorkspace(request.getUserPrincipal());
// Set library 
// workspace.setCurrentDocumentLibrary(workspace.getDocumentLibrary("WebContent"));
// define the draft content
String contentName = new String("Content");
Content content = null;
DocumentId contentId = null;
// define new workflow to be set on content
String newWorkflowName = new String("Workflow");
DocumentId newWorkflowId = null;
// find content by name
DocumentIdIterator contentIterator 
    = workspace.findByName(DocumentTypes.Content,contentName);
if (contentIterator.hasNext()) {
contentId = contentIterator.nextId();
content = (Content) workspace.getById(contentId);
// below code may not be required if the next workflow stage does not exist
// moving content to next workflow stage
content.nextWorkflowStage();
out.println("Draft content" + contentName + "is moved to next workflow stage");
// restarting workflow content.restartWorkflow();
out.println("<BR> Workflow restarted for content " + contentName);
}
// find new workflow by name
DocumentIdIterator workflowIterator 
    = workspace.findByName(DocumentTypes.Workflow,newWorkflowName);
if (workflowIterator.hasNext())
newWorkflowId = workflowIterator.nextId();
if((contentId!=null) && (newWorkflowId !=null)) {
// set new \ another workflow on content content. setWorkflowId(newWorkflowId);
String[] saveMessage = workspace. save((Document)content);
out.println("<BR> New Workflow set on content : " + contentName);
} else {
out.println("<BR> Could not set new Workflow on content : " + contentName);
}
%>

场景 13:呈现 Sites、Site Areas、Contents、Content 组件或 Library 组件

您可以呈现 Sites、Site Areas、Contents、Content 组件或 Library 组。给定的 Web Content Management 内容组件将使用指定的呈现上下文呈现。

注意,在 RenderingContext 中指定将要呈现 ContentComponent 是不够的,还需要指定包含 ContentComponent 的项的路径。

清单 13 中的代码演示了如何呈现 Content、Content 组件和 Library 组件。您可以始终添加或删除更多的组件,这将根据您的需求而定。

清单 13. 呈现各种工件的示例代码
<%@ page import="com.ibm.workplace.wcm.api. *"%>
<%@ page import="java.util.*"%>
<%
// retrieve repository
Repository repository = WCM_API.getRepository();
// get workspace for current user
Workspace workspace = repository.getWorkspace(request.getUserPrincipal());
// Set library 
// workspace.setCurrentDocumentLibrary(workspace.getDocumentLibrary("WebContent"));
// ******************* Render Site\ Sitearea or Content example ****************** 
// define path of the site , sitearea or content to be rendered.
String contentPath = new String ("/WebContent/Site/SiteArea/Content");
Map parametermap = new HashMap();
parametermap.put("srv", "page");
// create rendering context
RenderingContext renderingContext 
    = workspace.createRenderingContext(request, response, parametermap);
if(renderingContext!=null) {
renderingContext. setRenderedContent(contentPath); 
out.println("Rendering content " + contentPath );
out.println ("<BR>" + workspace.render(renderingContext)); 
} else {
out.println("Could not render content");
}
// ********************* Render Content Component example ********************
// define content name
String contentName = new String("Content");
// define siteArea name
String siteAreaName = new String("SiteArea");
Content content = null;
ContentComponent component=null; 
SiteArea siteArea = null;
// find content by name
DocumentIdIterator contentIterator 
    = workspace.findByName(DocumentTypes.Content,contentName);
if (contentIterator.hasNext()) {
content = (Content) workspace.getById(contentIterator.nextId()); 
component = content.getComponent("MyComponent");
}
// find sitearea by name
DocumentIdIterator siteAreaIterator 
    = workspace.findByName(DocumentTypes. SiteArea,siteAreaName);
if (siteAreaIterator.hasNext())
siteArea = (SiteArea) workspace.getById(siteAreaIterator.nextId());
if((content!=null) && (siteArea!=null)) {
renderingContext.setRenderedContent(content,siteArea);
out.println("<BR> Rendering content component : " 
    + component.getName()); out.println ("<BR>" 
    + workspace.render(renderingContext,component));
} else {
out.println("Could not render Content component");
}
// ********************* Render Library Component example ********************
// define library component
String libraryComponentName = new String("LibraryComponent");
// find library component by name
DocumentIdIterator libraryComponentIterator 
    = workspace.findByName(DocumentTypes.LibraryComponent,libraryComponentName);
if (libraryComponentIterator.hasNext()) {
LibraryComponent libraryComponent = (LibraryComponent)
workspace. getById(libraryComponentIterator. nextId());
renderingContext. setRenderedContent(contentPath);
out.println("<BR> Rendering library component " + libraryComponentName );
out.println ("<BR>" + workspace.render(renderingContext,libraryComponent)); 
} else {
out.println("<BR> Could not render Library component" + libraryComponentName);
}
%>

场景 14:在库的内部或库之间移动或复制整个站点区域

要将整个站点区域及其所有子内容移动或复制到同一库中的父站点或另一个库,可以使用清单 14 的代码。要移动站点区域,我们将使用 workspace.moveSiteFrameworkDocument 方法。

要复制站点区域,可以使用下面的相同代码,用 workspace.copySiteFrameworkDocument 方法来替换 workspace.moveSiteFrameworkDocument 方法。

清单 14. 移动或复制站点区域的示例代码
<%@ page import="com.ibm.workplace.wcm.api. *"%>
<%@ page import="java.util.*"%>
<%
// retrieve repository
Repository repository = WCM_API.getRepository();
// get workspace for current user
Workspace workspace = repository.getWorkspace(request.getUserPrincipal());
// define sitearea to be move
String siteArea = new String("SiteArea");
// define new parent site
String newParentSite = new String("Site"); DocumentId siteAreaId = null;
// define sibling id
DocumentId siblingId = null;.
DocumentId newParentsiteId = null;
// set source library 
// workspace.setCurrentDocumentLibrary(workspace.getDocumentLibrary("Source Library"));
// find sitearea to be moved
DocumentIdIterator siteAreaIterator =
workspace.findByName(DocumentTypes. SiteArea,siteArea);
if (siteAreaIterator.hasNext()) {
siteAreaId = siteAreaIterator.nextId();
out.println("Sitearea Found : " + siteArea + "<br>");
}else {
out.println("Could not find Sitearea : " + siteArea + "<br>");
}
// target library. 
// Not required while moving Sitearea to the same library 
// workspace.setCurrentDocumentLibrary(workspace.getDocumentLibrary("Target Library"));
// find new parent site
DocumentIdIterator siteIterator 
    = workspace.findByName(DocumentTypes. Site ,newParentSite);
if (siteIterator.hasNext()) {
newParentsiteId = siteIterator.nextId();
out.println("New parent site found : " + newParentSite + "<br>");
}else {
out.println("Could not find new parent site : " + newParentSite + "<br>");
}
if ((newParentsiteId!=null) && (siteAreaId!=null)) {
out.println(" Moving Sitearea <b> " + siteArea 
    + "</b> to new parent site <b>" + newParentSite + "</b><br>");
// move sitearea to new parent site
workspace.moveSiteFrameworkDocument(siteAreaId, 
    newParentsiteId, 
    siblingId, 
    ChildPosition.START);
out.println(" Moved Sitearea <b>" + siteArea 
    + " </b> to new parent site <b>" + newParentSite + "</b><br>");
}else{
out.println(" Moving Sitearea <b> " + siteArea + "</b> to new parent site <b>" 
    + newParentSite + "</b> failed <br>");
}
%>

场景 15:在库的内部或库之间移动或复制内容

使用清单 15 的代码,您可以将内容移动或复制到另一个站点区域,该站点区域可以位于同一个库,或位于不同的库。要移动内容,我们将使用 workspace.moveSiteFrameworkDocument 方法。

要复制站点区域,可以使用下面的相同代码,用 workspace.copySiteFrameworkDocument 方法替代 workspace.moveSiteFrameworkDocument 方法。

清单 15. 移动或复制内容的示例代码
<%@ page import="com.ibm.workplace.wcm.api. *"%>
<%@ page import="java.util.*"%>
<%
// retrieve repository
Repository repository = WCM_API.getRepository();
// get workspace for current user
Workspace workspace = repository.getWorkspace(request.getUserPrincipal());
// define content to be move
String contentName = new String("Content");
// define new parent siteArea
String newParentSitearea = new String("SiteArea");
// sibling id
DocumentId siblingId = null;
DocumentId contentId = null;
DocumentId newParentsiteareaId = null;
// set source library 
// workspace.setCurrentDocumentLibrary(workspace.getDocumentLibrary("Source Library"));
// find content to be moved
DocumentIdIterator contentIterator 
    = workspace.findByName(DocumentTypes.Content,contentName);
if (contentIterator.hasNext()) {
contentId = contentIterator.nextId();
out.println("Content Found : " + contentName + "<br>");
}else {
out.println("Could not find Content : " + contentName + "<br>");
}
// set target library. 
// Not required when moving content to the same library 
// workspace.setCurrentDocumentLibrary(workspace.getDocumentLibrary("Target Library"));
// find new parent sitearea
DocumentIdIterator newParentSiteareaIterator =
    workspace.findByName(DocumentTypes. SiteArea,newParentSitearea);
if (newParentSiteareaIterator.hasNext()) {
newParentsiteareaId = newParentSiteareaIterator.nextId();
out.println("New parent Sitearea found : " + newParentSitearea + "<br>");
}else {
out.println("Could not find new parent Sitearea : " + newParentSitearea + "<br>");
}
if ((contentId!=null) && (newParentsiteareaId!=null)) {
out.println(" Moving content <b> " + contentName 
    + "</b> to new parent Sitearea <b>" + newParentSitearea + "</b><br>");
// move content to new sitearea 
// workspace.moveSiteFrameworkDocument(contentId,
//     newParentsiteareaId,siblingId,ChildP osition.START);
out.println(" Moved content <b>" + contentName + " </b> to new parent Sitearea <b>" 
    + newParentSitearea + "</b><br>");
}else{
out.println(" Moving content <b> " + contentName + "</b> to new parent Sitearea <b>" 
    + newParentSitearea + "</b> failed.<br>");
}
%>

场景 16:将非分层的项或根内容移动或复制到另一个库

要将非分层的项(Authoring Templates、Presentation Templates、Library Components、Workflows、Workflow Stages)或根项(Sites 和 Taxonomies)移动或复制到另一个库,可以使用清单 16 中的代码。要将项移动到另一个库,我们将使用 workspace.moveToLibrary 方法,它将非分层项或根项移动到另一个库。

要复制内容项,我们将使用下面的相同代码,用 workspace.copyToLibrary 方法替换 workspace.moveToLibrary 方法。

清单 16 中的代码展示了如何针对 Authoring Templates、Presentation Templates、Library 组件、Workflows、Workflow Stages、Sites 和 Taxonomies 实现这个操作。

清单 16. 将根项移动或复制到另一个库
<%@ page import="com.ibm.workplace.wcm.api. *"%> 
<%@ page import="java.util.*"%>
<%
// retrieve repository
Repository repository = WCM_API.getRepository();
// get workspace for current user
Workspace workspace = repository.getWorkspace(request.getUserPrincipal());
// set source library 
// workspace.setCurrentDocumentLibrary(workspace.getDocumentLibrary("Source Library"));
// get target library
DocumentLibrary targetDocumentLibrary = workspace.getDocumentLibrary("Target Library");
// ********************** Move Authoring Template example ******************
// define authoring template
String authoringTemplateName = new String("AuthoringTemplate");
// find authoring template by name
DocumentIdIterator authoringTemplateIterator 
    = workspace.findByName(DocumentTypes.AuthoringTemplate,authoringTemplateName);
if (authoringTemplateIterator.hasNext()) {
DocumentId authoringTemplateId = authoringTemplateIterator.nextId(); 
out.println("Authoring Template found : " + authoringTemplateName + "<br>"); 
out.println(" Moving Authoring Template <b> " + authoringTemplateName 
    + "</b> to new library <b> Target Library </b><br>");
// move authoring template to another library
workspace.moveToLibrary(targetDocumentLibrary ,authoringTemplateId ); 
out.println(" Moved Authoring Template <b>" + authoringTemplateName 
    + " </b> to another library <b> Target Library </b><br>");
}else {
out.println("Could not find Authoring Template: " + authoringTemplateName + "<br>");
}
// ********************** Move Presentation Template example ******************
// define presentation template
String presentationTemplateName = new String("PresentationTemplate");
// find presentation template by name
DocumentIdIterator presentationTemplateIterator = 
    workspace.findByName(DocumentTypes.PresentationTemplate,presentationTemplateName);
if (presentationTemplateIterator.hasNext()) {
DocumentId presentationTemplateId = presentationTemplateIterator.nextId();
out.println("Presentation Template found : " + presentationTemplateName + "<br>"); 
out.println(" Moving Presentation Template <b> " + presentationTemplateName 
    + "</b> to new library <b> Target Library </b><br>");
// move presentation template to another library 
// workspace.moveToLibrary(targetDocumentLibrary ,presentationTemplateId ); 
// Moving presentation tempate to another library
out.println(" Moved Presentation Template <b>" + presentationTemplateName + 
    " </b> to another library <b> Target Library </b><br>");
}else {
out.println("Could not find Presentation Template: " + presentationTemplateName + 
    "<br>");
}
// ********************** Move Library Component example *********************
// define library component
String libraryComponentName = new String("LibraryComponent");
// find library component by name
DocumentIdIterator libraryComponentIterator = 
    workspace.findByName(DocumentTypes.LibraryComponent,libraryComponentName);
if (libraryComponentIterator.hasNext()) {
DocumentId libraryComponentId = libraryComponentIterator.nextId(); 
out.println("Library Component found : " + libraryComponentName + "<br>"); 
out.println(" Moving Library Component <b> " + libraryComponentName + 
    "</b> to new library <b> Target Library </b><br>");
// move library component to new library 
// workspace.moveToLibrary(targetDocumentLibrary ,libraryComponentId );
out.println(" Moved Library Component <b>" + libraryComponentName + 
    " </b> to another library <b> Target Library </b><br>");
}else {
out.println("Could not find Library Component: " + libraryComponentName + 
    "<br>");
}
// ************************* Move Workflow example *************************
// define workflow
String workflowName = new String("Workflow");
// find workflow by name
DocumentIdIterator workflowIterator = 
    workspace.findByName(DocumentTypes.Workflow,workflowName);
if (workflowIterator.hasNext()) {
DocumentId workflowId = workflowIterator.nextId();
out.println("Workflow found : " + workflowName + "<br>");
out.println(" Moving Workflow <b> " + workflowName + 
    "</b> to new library <b> Target Library </b><br>");
// move workflow to another library
workspace.moveToLibrary(targetDocumentLibrary ,workflowId );
out.println(" Moved workflow <b>" + workflowName + 
    " </b> to another library <b> Target Library </b><br>");
}else {
out.println("Could not find Workflow: " + workflowName + "<br>");
// ************************ Move Site example ******************************
// define site to be move
String siteName = new String("Site");
// find site by name
DocumentIdIterator siteIterator = workspace.findByName(DocumentTypes. Site,siteName);
DocumentId siteId = null;
if (siteIterator.hasNext()) {
out.println("Site found : " + siteName + "<br>");
out.println(" Moving Site <b> " + siteName + 
    "</b> to new library <b> Target Library </b><br>");
siteId = siteIterator.nextId();
// move site to another library
workspace.moveToLibrary(targetDocumentLibrary ,siteId );
out.println(" Moved Site <b>" + siteName + 
     " </b> to another library <b> Target Library </b><br>");
}else {
out.println("Could not find Site : " + siteName + "<br>");
}
// ********************** Move Workflow Stage example ***********************
// define workflow stage
String workflowStageName = new String("WorkflowStageName");
// find workflow stage by name
DocumentIdIterator workflowStageIterator =
    workspace.findByName(DocumentTypes.WorkflowStage,workflowStageName);
if (workflowStageIterator.hasNext()) {
DocumentId workflowStageId = workflowStageIterator.nextId();
out.println("Workflow Stage found : " + workflowStageName + "<br>");
out.println(" Moving Workflow Stage<b> " + workflowStageName 
    + "</b> to new library <b> Target Library </b><br>");
// move workflowstage to another library 
// workspace.moveToLibrary(targetDocumentLibrary ,workflowStageId );
out.println(" Moved Workflow Stage<b>" + workflowStageName + 
    " </b> to another
library <b> Target Library </b><br>");
}else {
out.println("Could not find Workflow Stage: " + workflowStageName + 
    "<br>");
}
// ************************ Move Taxonomy example *************************
// define taxonomy
String taxonomyName = new String("Taxonomy");
// find taxonomy by name
DocumentIdIterator taxonomyIterator = 
    workspace.findByName(DocumentTypes.Taxonomy,taxonomyName);
if (taxonomyIterator.hasNext()) {
DocumentId taxonomyId = taxonomyIterator.nextId();
out.println("Taxonomy found : " + taxonomyName + "<br>");
out.println(" Moving Taxonomy <b> " + taxonomyName + 
    "</b> to new library <b> Target Library </b><br>");
// move taxonomy to another library
workspace.moveToLibrary(targetDocumentLibrary ,taxonomyId );
out.println(" Moved Taxonomy <b>" + taxonomyName + 
    " </b> to another library <b> Target Library </b><br>");
}else {
out.println("Could not find Taxonomy: " + taxonomyName + "<br>");
}
%>

场景 17:在库的内部或库之间移动或复制类别

要在同一个库的内部或库与库之间移动或复制类别,可以使用清单 17 中的代码。要在同一个库中移动项或将项移动到另一个库,我们将使用 workspace.moveCategory 方法。该方法实际上移动一个类别并将其添加到一个新的父类别下。

要复制类别,我们将使用下面的相同代码,用 workspace.copyCategory 方法替换 workspace.moveToLibrary 方法。

注意,下面的示例将一个类别移动到另一个分类中;您也可以将类别移动到另一个父类别中。

清单 17. 移动或复制类别的示例代码
<%@ page import="com.ibm.workplace.wcm.api. *"%>
<%@ page import="java.util.*"%>
<%
// retrieve repository
Repository repository = WCM_API.getRepository();
// get workspace for current user
Workspace workspace = repository.getWorkspace(request.getUserPrincipal());
// Set library
// workspace.setCurrentDocumentLibrary(workspace.getDocumentLibrary("WebContent"));
// define category to be move
String categoryName = new String("Category");
// define parent taxonomy
String newTaxonomy = new String("Taxonomy");
DocumentId categoryId = null; DocumentId taxonomyId = null;
// find category to be moved
DocumentIdIterator categoryIterator = 
    workspace.findByName(DocumentTypes.Category,categoryName);
if (categoryIterator.hasNext()) {
categoryId = categoryIterator.nextId();
out.println("Category Found : " + categoryName + "<br>");
}else {
out.println("Could not find Category : " + categoryName + "<br>");
}
// find taxonomy by name
DocumentIdIterator taxonomyIterator =
    workspace.findByName(DocumentTypes.Taxonomy,newTaxonomy);
if (taxonomyIterator.hasNext()) {
taxonomyId = taxonomyIterator.nextId();
out.println("Taxonomy found : " + newTaxonomy + "<br>");
}else {
out.println("Could not find Taxonomy: " + newTaxonomy + "<br>");
}
if ((categoryId!=null) && (taxonomyId!=null)) {
out.println(" Moving Category <b> " + categoryName + 
    "</b> to new parent taxonomy <b>" + newTaxonomy + "</b><br>");
// move category
workspace.moveCategory(categoryId,taxonomyId);
out.println(" Moved Category <b>" + categoryName + 
    " </b> to new parent taxonomy <b>" + newTaxonomy + "</b><br>");
}else{
out.println(" Moving Category <b> " + categoryName + 
    "</b> to new parent taxonomy <b>" + newTaxonomy + "</b> failed <br>");
}
%>

场景 18:删除和清除对象

我们可以使用 Web Content Management API 删除和清除所有对象。在删除实际对象之前,最好清除被删除对象的所有引用;否则,删除将失败。

我们还可以清除(永久删除)来自库的对象。清单 18 的代码演示了如何删除和清除内容项,以及一个库组件。

要删除站点 / 站点区域 / 分类,您必须在删除它们之前清除所有子内容。

清单 18. 删除和清除对象的示例代码
<%@ page import="com.ibm.workplace.wcm.api. *"%>
<%@ page import="java.util.*"%>
<%
// retrieve repository
Repository repository = WCM_API.getRepository();
// get workspace for current user
Workspace workspace = repository.getWorkspace(request.getUserPrincipal());
// Set library 
// workspace.setCurrentDocumentLibrary(workspace.getDocumentLibrary("WebContent"));
// ********************** Delete \ Purge Content example **********************
// define content
String contentName = new String("Content"); String[] deleteMessage = new String[1];
// find content by name
DocumentIdIterator contentIterator = 
    workspace.findByName(DocumentTypes.Content,contentName); 
DocumentId contentId = null;
if (contentIterator.hasNext()) {
contentId = contentIterator.nextId();
// clear all the references of the content
if(workspace.getReferences(contentId) !=null) 
    workspace.clearReferences(workspace.getReferences(contentId));
// delete content
deleteMessage = workspace.delete(contentId);
out.println("Content deleted :" + deleteMes sage);
// purge content
deleteMessage = workspace.purge(contentId);
out.println("<BR> Content purged:" + deleteMessage); 
} else {
out.println("Could not delete content :" + contentName);
}
// ****************** Delete \ Purge Library Component example ******************
// define library component
String libraryComponentName = new String("LibraryComponent");
// find library component by name
DocumentIdIterator libraryComponentIterator = 
    workspace.findByName(DocumentTypes.LibraryComponent,libraryComponentName);
DocumentId libraryComponentId = null;
if (libraryComponentIterator.hasNext()) {
libraryComponentId = libraryComponentIterator.nextId();
// clear all the references of library component 
// if(workspace.getReferences(libraryComponentId) !=null) 
//   workspace.clearReferences(workspace.getReferences(libraryComponentId));
// delete library component
deleteMessage = workspace.delete(libraryComponentId);
out.println("Library Component deleted :" + deleteMessage);
// purge library component
deleteMessage = workspace.purge(libraryComponentId);
out.println("<BR> Library Component purged:" + deleteMessage);
} else {
out.println("Could not delete Library Component :" + libraryComponentName);
}
%>

4 在所有示例中指定的名称的标准

如本红皮书开头所述,我们为大部分代码行添加了以下划线表示的注释,以方便理解代码和流程。

在为提供的 API 样例编写代码时,设定了一些需要遵循的标准。根据您的系统上的 Web Content Management 工件的具体需求,可能需要修改这些标准并输入适当的值:

  • WebContent。被作为将在所有场景中设置的标准库
  • Site。将被搜索的已定义的站点名,或已经为站点设置好的名称
  • NewSite。创建的新站点的名称
  • SiteArea。已定义的站点区域
  • NewSiteArea。创建的新站点区域的名称
  • Content。已定义的内容名称
  • NewContent。创建的新内容的名称
  • PublishedContent。已发布的内容的名称
  • AuthoringTemplate。已定义的 Authoring Template
  • PresentationTemplate。已定义的 Presentation
  • LibraryComponent。已定义的库组件名
  • MyComponent。已定义的组件名
  • NewImageComponent。创建的新图像组件的名称
  • NewRichTextComponent。创建的新富文本组件的名称
  • Workflow。已定义的工作流名
  • WorkflowStageName。已定义的工作流阶段名
  • NewFileComponent。新创建的文件资源的名称
  • Taxonomy。已定义的分类名
  • NewParentTaxonomy。新创建的分类的名称
  • Category。将被搜索的已定义的类别名
  • NewCategory。新创建的类别的名称
  • Keyword。已定义的关键字
  • "/Web content/Site/SiteArea/Content"。内容路径
  • Source Library。已定义的源库的名称
  • Target Library。已定义的目标库的名称
  • 01/01/2008。选择作为起始日期的样例日期
  • 12/31/2009。选择作为终止日期的样例日期

5 结束语

本文档给出了详细的代码样例,您可以直接使用这些代码(复制/粘帖)来实现使用 Web Content Management 6.1 .0.x API 的各种场景,从而扩展 Web Content Management 的使用。希望我们已经涵盖了在用户实现和使用 API 过程中所遇到的最常见的问题。

参考资料

学习

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Lotus, WebSphere
ArticleID=462337
ArticleTitle=使用 IBM Lotus Web Content Management 6.1 API 实现常见扩展场景
publish-date=01192010