转自:developerWorks
作者:郭 亮 (guoliang@cn.ibm.com), 软件工程师, IBM 中国软件研发中心
赵 旭芹 (zhaoxq@cn.ibm.com), 软件工程师, IBM 中国软件研发中心
贾 翠琴 (jiacuiq@cn.ibm.com), 软件工程师, IBM 中国软件研发中心
IBM Web Content Management 是包含在 WebSphere Portal Enable 和 Extend 版本中的 Web 内容管理组件,提供了在 WebSphere Portal 环境下创建、管理和发布 Web 内容的方式。使用 Web Content Management(Web 内容管理,以下简称 WCM)可以使 Web 站点的设计、页面设计,和内容提供以及内容评阅的工作完全分开,能够让具有不同技能的人员独立工作,从而高效的创建和管理 Web 内容,为用户提供了一个端到端的解决方案。
工作流程是 WCM 中重要的功能模块,应用工作流程可以有效地控制 Web 内容的生命周期。使 Web 内容,从创建到审批,到发布,到存档的过程成为一个可监控的流程,并使 Web 内容在这个流程中有规律的运动,而当 Web 内容需要更改时可以返回到相应的专家那里得到修正。确保了 Web 内容的准确性和有效性。另外在 WCM 中,也可以设定对编写模板、演示模板、站点、站点区域、组件、分类法、类别等 Web 组件应用工作流。
在 WCM 中,应用工作流程的 Web 组件和没应用工作流程的 Web 组件在组件状态和组件安全性上具有以下区别:
- 没有应用工作流程的组件仅有一个已发布的工作流程状态;而应用工作流程的组件可具备草稿状态、已发布状态和过期状态等三种状态。
- 草稿状态:组件处于设计编写中,还没有被发布,网站用户还不能在网站上对此组件进行访问。在 WCM 的编写界面中由一个黄色的图标进行表示。
- 已发布状态:组件已正式发布了。网站用户可以对其进行访问。在 WCM 的编写界面中由一个绿色的图标进行表示。
- 过期状态:组件时效性已过,已不再网站中进行发布。在 WCM 的编写界面中由一个蓝色的图标进行表示。
- 没有应用工作流程的 Web 组件的安全性和状态都是由保存时所手动设定的;而应用工作流程的组件的安全性可以在工作流程阶段中进行设置,Web 组件的安全性将会随着工作流程阶段的转换而按照设定好的模式,有计划自动的改变。
由于有以上区别,应用工作流程可以使 Web 内容的发布具有更可靠的管理,尽可能的保证了 Web 内容在发布时的准确性。而且保证了网站对最终用户的展示是网站管理者和编辑者所期望的 Web 内容。在 WCM 中,工作流程的概念是由工作流程、工作流程阶段和不同的工作流程操作组成:
- 工作流程操作,是用来定义当 Web 组件进入或退出某个工作流程阶段时,对这个 Web 组件所进行的动作。
- 工作流程阶段,是用来描述工作流程中某个特定的逻辑阶段,在进入或退出某个工作流程阶段时可以执行一个到多个工作流程操作。可以由 Web 对象的审批人员决定当前的 Web 组件是否进入下一个工作流程阶段或者重新开始工作流程。
- 工作流程,一个完整的工作流程是由多个工作流程阶段组成。应用工作流程的 Web 组件将对应一个工作流程。
工作流程、工作流程阶段和工作流程操作之间的关系如图 1 所示。
图 1. 工作流程、工作流程阶段和工作流程操作关系图
户定制操作带来的新改变
用户定制操作是 WCM 6.1 版本中引入的新功能,使 WCM 的使用发生了巨大的变化。在 WCM 6.1 之前,用户只能使用 WCM 中内置的发布操作、过期操作、定时移动操作和电子邮件操作等几种内置的工作流程操作。而在 WCM 6.1 后,用户使用定制操作,可以开发特定于自己应用的代码,实现自身业务相关的操作,并嵌入到 WCM 的工作流程中,作为 WCM 工作流程的一部分得以自动执行。比如可以在发布前更改内容中图片的大小,对发布的内容进行索引等。极大的减少了内容管理的额外操作,满足了用户的多样化需求。
操作名称 | 操作介绍 |
发布操作 | 将 Web 组件的状态从草稿更改为已发布。 Web 组件将显示在呈现站点上。一旦 Web 组件进入包含发布操作的工作流程阶段,并且到了发布日期和时间,将发布该 Web 组件。 |
到期操作 | 将 Web 组件的状态从已发布更改为已到期。 Web 组件在站点上将不再可用。一旦 Web 组件进入包含到期操作的工作流程阶段,并且到了所选的到期日期和时间,那么 Web 组件将过期。 |
定时移动操作 | 在指定的日期执行转换到下一阶段的已安排的移动。可以在列表框中选择在每个文档中输入的四种日期类型中的一种,或者指定某个具体的日期。 |
电子邮件操作 | 在执行时发送电子邮件。可以创建新的电子邮件操作并指定收件人。可以选择向核准人、作者和所有者发送电子邮件。还可以创建要向其发送电子邮件的其他用户或组的列表。电子邮件中包含要查看的 Web 组件的链接。 |
版本操作 | 执行时将创建 Web 组件的一个版本。本操作为 WCM6.1 新引入的工作流程操作 |
定制操作 | 执行时将执行用户先前部署到系统的用户定制的代码。本文将详细地介绍其概念,开发、部署和使用。本操作为 WCM6.1 新引入的工作流程操作 |
定制操作依靠 WebSphere Application Server(以下简称 WAS)中内建的 Eclipse Plug-in 框架,用户开发的定制操作被部署后,将自动嵌入到 WCM 运行环境中,由 WCM 动态的感知并使用。在部署成功后,用户可以以类似内置工作流程相似的方式使用用户自己开发的定制操作。
本文将以 RSS 更新定制工作流程操作为例,详细地介绍定制操作的基本概念,以及定制工作流程操作的开发、部署和使用。
在 IBM Rational Application Developer 7.5 及以上版本中,已经内置了对 WCM 开发的支持,只需要创建普通的动态 Web 工程就可以进行 WCM 定制操作的开发。当我们使用 Eclipse 环境时需要手动配置开发环境。本章将以 Eclipse3.4 为例介绍主要配置的步骤。
- 创建动态 Web 工程
- 在 Eclipse 主菜单中点击 File->New->Dynamic Web Project 。
- 在弹出的对话框中输入工程的名字,RSS Custom Workflow Action 。
- 勾选 Add project to an EAR 。
- 保留其它默认选项,并单击 Finish 按钮。
图 2. 创建 RSS 更新定制工作流程操作工程Eclipse 会为我们创建出 WCM 定制工作流程操作项目和相应的 EAR 项目。在工程浏览器中如图 3 所示。
图 3. 初始工程树视图() - 设置工程的构建路径
- 在文件系统中创建一个新目录,命名为 ILWWCM_v6.1_dir 。
- 从安装好 Portal/WCM 6.1 的服务器中将 ilwwcm-api.jar 文件(位于 \wcm\prereq.wcm\wcm\shared\app)和 wp.base.jar 文件(位于 \base\wp.base\shared\app),复制到步骤 a 所创建的目录中。
- 在工程管理器中,右键单击 RSS Custom Workflow Action,选择 Properties 。
- 在弹出的对话框中选择 Java Build Path,单击 Libraries 页。点击 Add External JARs 按钮选择步骤 b 复制的 ilwwcm-api.jar 和 wp.base.jar 文件。点击 OK 按钮,将 Jar 包添加到工程的构建路径上。
图 4. 设置工程构建路径

配置 WCM Java 帮助文档的支持
- 从安装好 Portal/WCM 6.1 的服务器中将 WCM 的 Java 帮助文档(位于 \installedApps\\wcm.ear\ilwwcm.war\webinterface\ api-javadoc 目录)拷贝到前面步骤所创建的 ILWWCM_v6.1_dir 目录中。
- 在工程浏览器中,右键单击 ilwwcm-api.jar,选择 Properties 。
- 在弹出的对话框中选择 Javadoc Location 。选择 Javadoc URL,并选择上面步骤中复制的 api-javadoc 目录。单击 OK 按钮。
图 5. 添加 Java 帮助文档

这样我们在 Eclipse 中创建好了 WCM 开发环境,接下来将进入定制工作流程操作的开发过程了。
在 WCM 6.1 中我们可以使用传统的菜单组件等方式进行 RSS 数据源的生成。但是因为在其中新引入了用户定制操作的功能,所以我们可以开发和使用 RSS 更新定制操作,在工作流程中自动完成 RSS 数据源的生成和更新。
WCM 定制操作开发的工程中,主要包括 Java 类和部署描述文件两种类型的文件。
首先创建我们工程中的 Java 类:
com.ibm.wcm.customworkflowaction.RSSTool:用于 RSS 数据源更新的工具类,提供创建 RSS 数据源文件,添加和删除 RSS 数据项的方法。
com.ibm.wcm.customworkflowaction.AddRSSItemAction:将新发布的内容信息写入 RSS 数据源的定制操作类。此类实现了 CustomWorkflowAction 接口,每一个 WCM 定制操作开发工程中至少需要包括一个实现此接口的 Java 类。
com.ibm.wcm.customworkflowaction.RemoveRSSItemAction:将已过期的内容信息从 RSS 数据源中删除的用户定制操作类。此类实现了 CustomWorkflowAction 接口。
com.ibm.wcm.customworkflowaction.RSSCustomWorkflowActionFactory:管理对 RSS 更新定制操作实例的创建。此类实现了 CustomWorkflowActionFactory 接口,每一个 WCM 定制操作开发工程中至少需要包括一个实现此接口的 Java 类。
接下来需要创建部署描述文件。
WCM 定制操作的部署描述文件除了普通 Web 应用程序所需要的 web.xml 之外,还有 plugin.xml 。由于 web.xml 在工程创建时由 Eclipse 在自动生成,所以我们只需要手动建立 plugin.xml 文件。
将 plugin.xml 创建于 WebContent/WEB-INF 目录下,这个文件用于将 RSS 更新定制工作流程操作注册到 WCM 的运行环境中。
创建好的工程如图 7 所示
编写 WCM 定制操作的主要工作是通过实例化 CustomWorkflowAction 接口,来实现的在其中定义的两个方法。
表 2. CustomWorkflowAction 接口说明
方法声明 | 说明 |
CustomWorkflowActionResult execute(Document document) | 定制工作流程操作的具体执行代码 |
java.util.Date getExecuteDate(Document document) | 指定当前工作流程操作执行的时间 |
其中 CustomWorkflowActionResult 接口中包括一个 String 类型的动作完成信息(将显示于工作流程的状态信息中)和一个用来指示 WCM 引擎接下来动作的 Directive 类型的数据。
域 | 说明 |
Directive Directives.CONTINUE | 指示 WCM 引擎正常执行工作流程 |
Directive Directives.CREATE_DRAFT | 指定 WCM 引擎创建当前文档的草稿 |
Directive Directives.DECLINE | 指示 WCM 引擎拒绝当前文档 |
Directive Directives.NEXT_WORKFLOW_STAGE | 指示 WCM 引擎直接将当前文档移动到下一个工作流程阶段 |
Directive Directives.RESTART_WORKFLOW | 指示 WCM 引擎重新开始当前文档的工作流程 |
Directive Directives.ROLLBACK_DOCUMENT | 指示 WCM 引擎回退当前文档的所有更改 . |
Directive Directives.STOP | 指示 WCM 引擎停止执行当前工作流程阶段的后续操作 |
下面让我们具体来编写 AddRSSItemAction 这个定制操作类。
1 .实现 getExecuteDate 方法
getExecuteDate 方法的返回值用来指定当前这个动作执行的时间。工作流程执行到当前操作时,如果时间晚于或等于 getExecuteDate 方法所返回的时间,那么这个定制操作就立即执行,如果早于 getExecuteDate 方法所返回的时间那么当前的工作流程会被挂起,直到所设定的时间到来时,这个工作流程才会继续执行。可以使这个方法中返回 DATE_EXECUTE_NOW 来使动作立即执行。在我们的例子中将使其返回 DATE_EXECUTE_NOW 。
public Date getExecuteDate(Document arg0) { returnDATE_EXECUTE_NOW; } |
2 .实现 execute 方法
execute(Document document) 实现了定制操作的主要工作。我们实例化这个方法来实现读取当前内容的信息,并向 RSS 数据源文件中添加项目的功能,这将在当前动作执行时运行。其 CustomWorkflowActionResult 类型的返回值中,包括一个 String 类型的动作完成信息,将显示于工作流程的状态信息中;和一个 Directive 类型的信息,将用来指示 WCM 引擎接下来的动作。在我们的例子中是将返回 Directives.CONTINUE 使工作流程正常进行下去。
public CustomWorkflowActionResult execute(Document arg0) { Directive directive = Directives.CONTINUE; String message = "Item is not a content"; if (arg0 instanceof Content) { boolean result = RSSTool.getInstance().AddRSSItem((Content)arg0); if(result){ message = "Content successfully added to RSS repository "; }else{ message = "Content failed added to RSS repository "; } } WebContentCustomWorkflowService webContentCustomWorkflowService = null; try{ InitialContext ctx = new InitialContext(); webContentCustomWorkflowService = (WebContentCustomWorkflowService) ctx.lookup("portal:service/wcm/WebContentCustomWorkflowService"); }catch (Exception ne){ ne.printStackTrace(); return null; } CustomWorkflowActionResult result = webContentCustomWorkflowService .createResult(directive, message); return result; } |
相似的我们实现第二个定制操作类 RemoveRssItemAction 。具体的代码可以参见本文后面的附件。
WCM 定制操作使用了工厂方法的设计模式,用户通过工厂类将实现的定制操作注册到 WCM 引擎中,同时工厂类也会在 WCM 引擎需要时提供,定制操作类的具体属性和实例。
在编写定制操作的 Web 应用程序时,需要实例化 CustomWorkflowActionFactory 接口来编写工厂类。 CustomWorkflowActionFactory 的主要接口如下:
表 4. CustomWorkflowActionFactory 接口说明
方法声明 | 说明 |
CustomWorkflowAction getAction(java.lang.String actionName,Documentdocument) | 根据 actionName 返回定制流程操作的一个实例 |
java.lang.String getActionDescription(java.util.Locale displayLocale, java.lang.String actionName) | 根据 actionName 返回对定制流程操作的介绍,将会显示在创建 workflow action 的界面中 |
java.lang.String[] getActionNames() | 返回当前工厂类所能创建的工作流程操作的 actionName 集合 |
java.lang.String getActionTitle(java.util.Locale displayLocale, java.lang.String actionName) | 根据 actionName 返回定制流程操作的标题,将会显示在创建定制流程操作的界面中 |
java.lang.String getName() | 返回对定制流程操作工厂类的名称 |
java.lang.String getTitle(java.util.Locale displayLocale) | 返回定制流程操作工厂类的标题,将会显示在创建定制流程操作的界面中 |
下面是如何返回相应定制操作类实例的 getAction 方法的代码,具体的工厂类代码可以参见本文后面的附件。
public CustomWorkflowAction getAction(String actionName, Document document) { if (actionName.equals("AddRSSItemAction")){ return new AddRSSItemAction(); } else if (actionName.equals("RemoveRSSItemAction")){ return new RemoveRSSItemAction(); } System.err.println("Specify an Invalid Action Name" + actionName); return null; } |
plugin.xml 将会由 WAS 服务器中的 Eclipse Plugin Framework 读取,文件提供的信息用于将定制操作工厂类注册到 WAS 服务器的运行环境中。
其中主要的几个 xml 元素包括
- plugin 节点:plugin.xml 文件的根节点,提供了当前定制操作的基本信息
- extension-point 节点:plugin 节点的子节点,用来提供扩展点的信息。其中 id 属性应该为 CustomWorkflowActionFactory
- extension 节点:plugin 节点的子节点,每一个定制操作工厂类都由一个 extension 节点来表示,其 point 属性必须为 com.ibm.workplace.wcm.api.custom.CustomWorkflowActionFactory,以表示扩展的为 WCM 定制操作。 id 属性用来为定制操作工厂类提供唯一标识,可以由用户自己来设定。
- provider 节点:extension 节点的子节点,必须为提供的工厂类的完整类名
下面是本文使用的 plugin.xml 文件
<?xml version="1.0" encoding="UTF-8"?> |
最后还完成工具类 RSSTool 的编写,由于不涉及定制操作的特有内容,本文不在此赘述,详细代码可以参见附件。
WCM 允许将定制操作应用程序打包成 WAR 或 EAR 。由于打包成 EAR 拥有可以对其进行热部署而不用重启服务器的优势,所以我们使用 EAR 的方式进行打包和部署。采用 WAR 包的方式与此类似,但需要在部署完成后重新启动应用服务器来完成最终的部署。
- 在工程管理器中选中前文中创建的 EAR 项目。
- 点击文件 -> 导出菜单。
- 在导出对话框中选择 Jave EE->EAR file,单击 Next 按钮。
- 在目的文件中输入目标路径,单击 Finish 按钮。
- 使用系统管理员登陆 WAS 管理控制台。
- 在左侧的树型列表中选择“应用程序”,“安装新的应用程序”。
- 单击“安装”按钮,在本地文件系统路径中填入上文所保存的 EAR 文件的完整路径和文件名。
- 单击“下一步”,进入安装配置界面。
- 保持步骤 1: 选择安装选项的默认设置不变,单击“下一步”。
- 在步骤 2: 将模块映射至服务器中,勾选我们将要部署的模块“ RSS Custom Workflow Action ”,然后选择 WebSphere_Portal,点击“应用”按钮。使 RSS 更新定制流程操作映射到 Portal 服务器中。
- 保持步骤 3: 为 Web 模块映射虚拟主机的默认设置不变,单击“下一步”。
- 单击完成按钮,进行模块的安装。
- 当出现安装成功的提示后,选择“保存到主配置”。
- 在左侧的树型列表中选择“应用程序”。
- 在企业应用程序的列表中,勾选我们刚刚安装的 RSS Custom Workflow ActionEAR
- 单击“启动”按钮。
RSS Custom Workflow Action 应用程序前出现绿色的三角图标,表示已经正常启动了。
现在我们在 WCM 的编写界面中已经可以看到 RSS 更新定制操作了。
RSS 更新定制操作的使用策略是,当内容发布时就将内容的信息写入 RSS 数据源文件,当内容到达过期阶段时就将其信息从 RSS 数据源文件中移除。
我们需要在内容库中建立三个文本组件用来为我们的 RSS 更新定制操作提供必要的信息。
文本组件名称 | 描述 |
ContentRoot | 用于生成内容 URL 的根地址 |
ChannelLink | 本频道的 URL 地址 |
RSSFileName | RSS 数据源文件的完整路径和文件名 |
同时需要我们建立具有如下三个工作流程阶段的工作流程。
表 6. 使用 RSS 更新新定制工作流程操作所需的工作流程阶段
工作流程阶段 | 描述 |
草稿阶段 | 内容处于编写设计阶段 |
发布和添加 RSS 项阶段 | 使新内容在 Web 站点中可见,并加入到 RSS 数据源中 |
过期和移除 RSS 项阶段 | 停止内容在 Web 站点中的可见状态,并从 RSS 数据源中移除 |
建立工作流程操作
- 在 WCM 编写界面中,点击“新建”按钮分别建立“发布”和“过期”操作,并命名为 Publish 和 Expire 。
- 点击新建 -> 定制操作,并命名为 RSSAdd 。
- 点击选择操作按钮,弹出如图 10 所示对话框。
- 选择 Add RSS Item Action,并单击确定按钮。
- 点击保存按钮保存 RSSAdd 操作。
类似的建立 Remove RSS Item Action 的工作流程操作,并命名为 RSSRemove 。
建立工作流程阶段
- 点击“新建”按钮建立草稿阶段,为其命名为 DraftStage,授予 PublishApprover 组审批者的权限并保存。
- 点击“新建”按钮建立 RSS 发布阶段为其命名为 RSSPublishStage 。将 Publish 和 RSSAdd 操作加入为进入工作流程执行的操作,授予 ExpireApprover 组审批者的权限并保存。
- 点击“新建”按钮建立 RSS 过期阶段为其命名为 RSSExpireStage 。将 Expire 和 RSSRemove 操作加入为进入工作流程执行的操作,授予 ExpireApprover 组审批者的权限并保存。
建立工作流程
- 在 WCM 编写界面中,点击新建 -> 工作流程,并为其命名为 RSSWorkflow 。
- 点击选择工作流程阶段,将建立的 DraftStage,RSSPublishStage 和 RSSExpireStage 三个工作流程阶段顺次加入到 RSSWorkflow 中,并保存。
这样我们在使用 WCM 编写 Web 内容的时候,使内容采用 RSSWorkflow 作为其工作流程。这样当内容进入发布状态时,WCM 引擎就会自动地在 RSS 数据源文件中添加一个当前内容的条目;当内容离开发布状态,进入过期状态时,就会自动地从 RSS 数据源文件中将当前内容的条目移除。完成 RSS 数据源的自动更新。生成的 RSS 数据源文件如下。
清单 5. 由 RSS 更新定制工作流程操作生成的 RSS 文件示例
<?xml version="1.0" encoding="UTF-8"?> my content sitehttp://www.mysite.com.cn My first contentThis is my first contenthttp://mysite.com/my+content+site/glsite/glsitearea/Myfirstcontent 4ec261004e3499768a6dff9a4cc3fba9 |
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14751907/viewspace-608414/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/14751907/viewspace-608414/