﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-少年阿宾-随笔分类-workflow</title><link>http://www.blogjava.net/stevenjohn/category/51867.html</link><description>那些青春的岁月</description><language>zh-cn</language><lastBuildDate>Sun, 03 Jun 2012 18:06:41 GMT</lastBuildDate><pubDate>Sun, 03 Jun 2012 18:06:41 GMT</pubDate><ttl>60</ttl><item><title>学习OSWorkFlow的文章收集 </title><link>http://www.blogjava.net/stevenjohn/archive/2012/06/03/379881.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Sun, 03 Jun 2012 15:16:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/06/03/379881.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/379881.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/06/03/379881.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/379881.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/379881.html</trackback:ping><description><![CDATA[<div id="blog_content" class="blog_content">
<p>OSWorkflow是一个灵活的工作流引擎，设计成可嵌入到企业应用程序中。它提供了许多的持久化API支持包括：EJB,Hibernate,JDBC和其它。OSWorkflow还可以与Spring集成。<br />网址：<a href="http://www.opensymphony.com/osworkflow/" target="_blank"><font color="#108ac6">http://www.opensymphony.com/osworkflow/</font></a></p>
<p>1.OSWorkflow基本概念(gigix)<br /><a href="http://gigix.blogdriver.com/gigix/113138.html" target="_blank"><font color="#108ac6">http://gigix.blogdriver.com/gigix/113138.html</font></a><br />2.osworkflow中文指南(Quake Wang)<br /><a href="http://wiki.opensymphony.com/display/WF/Tutorial+-+Chinese" target="_blank"><font color="#108ac6">http://wiki.opensymphony.com/display/WF/Tutorial+-+Chinese</font></a><br />3.OSWorkflow入门(史帝芬心得笔记)<br /><a href="http://my.so-net.net.tw/idealist/OSWorkflow/" target="_blank"><font color="#108ac6">http://my.so-net.net.tw/idealist/OSWorkflow/</font></a><br />4.英文文档<br /><a href="http://wiki.opensymphony.com/display/WF/Manual" target="_blank"><font color="#108ac6">http://wiki.opensymphony.com/display/WF/Manual</font></a><br />5.深入分析(银狐999)<br /><a href="http://blog.csdn.net/james999/category/52990.aspx" target="_blank"><font color="#108ac6">http://blog.csdn.net/james999/category/52990.aspx</font></a></p>
<p><font color="#108ac6"><br /></font></p>
<p>其它关于osworkflow的文章</p>
<p><a href="http://captainandboat.spaces.live.com/blog/cns%219a3607f7808d2d0d%21334.entry"><font color="#108ac6">http://captainandboat.spaces.live.com/blog/cns!9a3607f7808d2d0d!334.entry</font></a></p>
<p><a href="http://qinysong.iteye.com/blog/post/333919"><font color="#108ac6">http://qinysong.iteye.com/blog/post/333919</font></a></p>
<p><a href="http://www.cnblogs.com/jssy/archive/2007/06/08/776175.html"><font color="#108ac6">http://www.cnblogs.com/jssy/archive/2007/06/08/776175.html</font></a></p>
<p><span style="background-color: rgb(0,204,51); color: rgb(0,0,204); text-decoration: underline">http://zhusl.blog.sohu.com/32223382.html</span><br /></p>
<p><a href="http://www.cnblogs.com/jssy/archive/2007/06/08/776175.html"><br /></a></p></div><img src ="http://www.blogjava.net/stevenjohn/aggbug/379881.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-06-03 23:16 <a href="http://www.blogjava.net/stevenjohn/archive/2012/06/03/379881.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Osworkflow2.8  入门级例子</title><link>http://www.blogjava.net/stevenjohn/archive/2012/06/03/379878.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Sun, 03 Jun 2012 14:39:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/06/03/379878.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/379878.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/06/03/379878.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/379878.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/379878.html</trackback:ping><description><![CDATA[osworkflow.xml<br />&lt;osworkflow&gt;<br />&nbsp;&lt;persistence class="com.opensymphony.workflow.spi.memory.MemoryWorkflowStore" /&gt;<br />&nbsp;&lt;factory class="com.opensymphony.workflow.loader.XMLWorkflowFactory"&gt;<br />&nbsp;&nbsp;&lt;property key="resource" value="workflows.xml" /&gt;<br />&nbsp;&lt;/factory&gt;<br />&lt;/osworkflow&gt;<br /><br /><br />workflows.xml<br />&lt;workflows&gt;<br />&nbsp; &lt;workflow name="docworkflow" type="resource" location="myworkflow.xml"/&gt;<br />&lt;/workflows&gt;<br /><br /><br />myworkflow.xml<br />
<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;!DOCTYPE workflow PUBLIC "-//OpenSymphony Group//DTD OSWorkflow 2.6//EN" "<a href="http://www.opensymphony.com/osworkflow/workflow_2_8.dtd">http://www.opensymphony.com/osworkflow/workflow_2_8.dtd</a>"&gt;<br />&lt;workflow&gt;<br />&nbsp;&lt;registers&gt;<br />&nbsp;&nbsp;&lt;register type="class" variable-name="log"&gt;<br />&nbsp;&nbsp;&nbsp;&lt;arg name="class.name"&gt;com.opensymphony.workflow.util.LogRegister&lt;/arg&gt;<br />&nbsp;&nbsp;&nbsp;&lt;arg name="addInstanceId"&gt;true&lt;/arg&gt;<br />&nbsp;&nbsp;&lt;/register&gt;<br />&nbsp;&lt;/registers&gt;</p>
<p>&nbsp;&lt;initial-actions&gt;<br />&nbsp;&nbsp;&lt;action id="100" name="Start Ordinary Workflow"&gt;<br />&nbsp;&nbsp;&nbsp;&lt;results&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;unconditional-result old-status="Finished"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;status="Queued" step="1" /&gt;<br />&nbsp;&nbsp;&nbsp;&lt;/results&gt;<br />&nbsp;&nbsp;&lt;/action&gt;<br />&nbsp;&nbsp;&lt;action id="200" name="Start Emergent Workflow"&gt;<br />&nbsp;&nbsp;&nbsp;&lt;results&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;unconditional-result old-status="Finished"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;status="Queued" step="5" /&gt;<br />&nbsp;&nbsp;&nbsp;&lt;/results&gt;<br />&nbsp;&nbsp;&lt;/action&gt;<br />&nbsp;&lt;/initial-actions&gt;</p>
<p>&nbsp;&lt;steps&gt;</p>
<p>&nbsp;&nbsp;&lt;step id="1" name="Initiate Doc"&gt;<br />&nbsp;&nbsp;&nbsp;&lt;actions&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;action id="1" name="Initial Work"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;restrict-to&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;conditions&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;condition type="class"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;arg name="class.name"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;com.opensymphony.workflow.util.StatusCondition<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/arg&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;arg name="status"&gt;Queued&lt;/arg&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/condition&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/conditions&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/restrict-to&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;validators&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;validator type="class"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;arg name="class.name"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.abin.lee.validator.TitleValidator<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/arg&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/validator&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/validators&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;pre-functions&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;function type="class"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;arg name="class.name"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;com.opensymphony.workflow.util.Caller<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/arg&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;arg name="stepId"&gt;1&lt;/arg&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/function&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;function type="beanshell"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;arg name="script"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;transientVars.get("log").info("Initiate Work");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/arg&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/function&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/pre-functions&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;results&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;unconditional-result old-status="Finished"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;status="Prepared" step="1" owner="${caller}" /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/results&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;post-functions&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;function type="beanshell"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;arg name="script"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;propertySet.setString("title",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(String)transientVars.get("title"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/arg&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/function&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/post-functions&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/action&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;action id="2" name="Deliver Work"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;restrict-to&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;conditions type="AND"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;condition type="class"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;arg name="class.name"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;com.opensymphony.workflow.util.StatusCondition<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/arg&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;arg name="status"&gt;Prepared&lt;/arg&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;arg name="stepId"&gt;1&lt;/arg&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/condition&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;condition type="class"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;arg name="class.name"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;com.opensymphony.workflow.util.AllowOwnerOnlyCondition<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/arg&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/condition&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/conditions&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/restrict-to&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;pre-functions&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;function type="beanshell"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;arg name="script"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;transientVars.get("log").info("Deliver Doc to Boss A and B");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/arg&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/function&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/pre-functions&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;results&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;unconditional-result old-status="Finished"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;status="Prepared" split="1" /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/results&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/action&gt;<br />&nbsp;&nbsp;&nbsp;&lt;/actions&gt;<br />&nbsp;&nbsp;&lt;/step&gt;</p>
<p>&nbsp;&nbsp;&lt;step id="2" name="Review Doc In Boss A"&gt;<br />&nbsp;&nbsp;&nbsp;&lt;external-permissions&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;permission name="permA"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;restrict-to&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;conditions type="AND"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;condition name="check.status" type="class"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;arg name="class.name"&gt;com.opensymphony.workflow.util.StatusCondition&lt;/arg&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;arg name="status"&gt;Prepared&lt;/arg&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/condition&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;condition name="allow.owner.only" type="class"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;arg name="class.name"&gt;com.opensymphony.workflow.util.AllowOwnerOnlyCondition&lt;/arg&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/condition&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/conditions&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/restrict-to&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/permission&gt;<br />&nbsp;&nbsp;&nbsp;&lt;/external-permissions&gt;<br />&nbsp;&nbsp;&nbsp;&lt;actions&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;action id="3" name="Review Work By A"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;pre-functions&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;function type="beanshell"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;arg name="script"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;transientVars.get("log").info("Doc Reviewed By Boss A")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/arg&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/function&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/pre-functions&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;results&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;unconditional-result old-status="Finished"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;status="Underway" join="1" /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/results&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/action&gt;<br />&nbsp;&nbsp;&nbsp;&lt;/actions&gt;<br />&nbsp;&nbsp;&lt;/step&gt;</p>
<p>&nbsp;&nbsp;&lt;step id="3" name="Review Doc In Boss B"&gt;<br />&nbsp;&nbsp;&nbsp;&lt;external-permissions&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;permission name="permA"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;restrict-to&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;conditions type="AND"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;condition name="check.status" type="class"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;arg name="class.name"&gt;com.opensymphony.workflow.util.StatusCondition&lt;/arg&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;arg name="status"&gt;Prepared&lt;/arg&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/condition&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;condition name="allow.owner.only" type="class"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;arg name="class.name"&gt;com.opensymphony.workflow.util.AllowOwnerOnlyCondition&lt;/arg&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/condition&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/conditions&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/restrict-to&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/permission&gt;<br />&nbsp;&nbsp;&nbsp;&lt;/external-permissions&gt;<br />&nbsp;&nbsp;&nbsp;&lt;actions&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;action id="4" name="Review Work By B"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;pre-functions&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;function type="beanshell"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;arg name="script"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;transientVars.get("log").info("Doc Reviewed By Boss B")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/arg&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/function&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/pre-functions&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;results&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;unconditional-result old-status="Finished"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;status="Underway" join="1" /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/results&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/action&gt;<br />&nbsp;&nbsp;&nbsp;&lt;/actions&gt;<br />&nbsp;&nbsp;&lt;/step&gt;</p>
<p>&nbsp;&nbsp;&lt;step id="4" name="Finish Ordinary Work"&gt;<br />&nbsp;&nbsp;&nbsp;&lt;pre-functions&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;function type="beanshell"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;arg name="script"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Finish Doc Review. \nTitle:"+propertySet.getString("title")+".");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/arg&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/function&gt;<br />&nbsp;&nbsp;&nbsp;&lt;/pre-functions&gt;<br />&nbsp;&nbsp;&lt;/step&gt;</p>
<p>&nbsp;&nbsp;&lt;step id="5" name="Finish Emergent Work"&gt;<br />&nbsp;&nbsp;&nbsp;&lt;pre-functions&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;function type="beanshell"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;arg name="script"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Emergency Handler");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/arg&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/function&gt;<br />&nbsp;&nbsp;&nbsp;&lt;/pre-functions&gt;<br />&nbsp;&nbsp;&lt;/step&gt;</p>
<p>&nbsp;&lt;/steps&gt;</p>
<p>&nbsp;&lt;splits&gt;<br />&nbsp;&nbsp;&lt;split id="1"&gt;<br />&nbsp;&nbsp;&nbsp;&lt;unconditional-result old-status="Finished"<br />&nbsp;&nbsp;&nbsp;&nbsp;status="Prepared" step="2" /&gt;<br />&nbsp;&nbsp;&nbsp;&lt;unconditional-result old-status="Finished"<br />&nbsp;&nbsp;&nbsp;&nbsp;status="Prepared" step="3" /&gt;<br />&nbsp;&nbsp;&lt;/split&gt;<br />&nbsp;&lt;/splits&gt;</p>
<p>&nbsp;&lt;joins&gt;<br />&nbsp;&nbsp;&lt;join id="1"&gt;<br />&nbsp;&nbsp;&nbsp;&lt;conditions type="AND"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;condition type="beanshell"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;arg name="script"&gt;&lt;![CDATA[ "Finished".equals(jn.getStep(2).getStatus()) &amp;&amp; "Finished".equals(jn.getStep(3).getStatus()) ]]&gt;&lt;/arg&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/condition&gt;<br />&nbsp;&nbsp;&nbsp;&lt;/conditions&gt;<br />&nbsp;&nbsp;&nbsp;&lt;unconditional-result old-status="Finished"<br />&nbsp;&nbsp;&nbsp;&nbsp;status="Reviewed" step="4" /&gt;<br />&nbsp;&nbsp;&lt;/join&gt;<br />&nbsp;&lt;/joins&gt;</p>
<p>&lt;/workflow&gt;</p><br /><br /><br />TitleValidator.java<br />
<p>package org.abin.lee.validator;</p>
<p>import java.util.Map;<br />import com.opensymphony.module.propertyset.PropertySet;<br />import com.opensymphony.workflow.InvalidInputException;<br />import com.opensymphony.workflow.Validator;<br />import com.opensymphony.workflow.WorkflowException;</p>
<p>public class TitleValidator implements Validator {<br />&nbsp;public void validate(Map transientVars, Map args, PropertySet ps)<br />&nbsp;&nbsp;&nbsp;throws InvalidInputException, WorkflowException {<br />&nbsp;&nbsp;System.out.println("TitleValidator is running");<br />&nbsp;&nbsp;String title = (String) transientVars.get("title");<br />&nbsp;&nbsp;if (title == null)<br />&nbsp;&nbsp;&nbsp;throw new InvalidInputException("Missing title");<br />&nbsp;&nbsp;if (title.length() &gt; 30)<br />&nbsp;&nbsp;&nbsp;throw new InvalidInputException("Title too long");<br />&nbsp;}<br />}</p><br /><br />SimpleSample.java<br />
<p>package org.abin.lee.workflow;</p>
<p>import java.util.HashMap;</p>
<p>import com.opensymphony.workflow.InvalidActionException;<br />import com.opensymphony.workflow.InvalidEntryStateException;<br />import com.opensymphony.workflow.InvalidInputException;<br />import com.opensymphony.workflow.InvalidRoleException;<br />import com.opensymphony.workflow.Workflow;<br />import com.opensymphony.workflow.WorkflowException;<br />import com.opensymphony.workflow.basic.BasicWorkflow;<br />import com.opensymphony.workflow.config.DefaultConfiguration;</p>
<p>public class SimpleSample {<br />&nbsp;public static void main(String[] args) {<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;Workflow workflow = new BasicWorkflow("abin");</p>
<p>&nbsp;&nbsp;&nbsp;DefaultConfiguration config = new DefaultConfiguration();<br />&nbsp;&nbsp;&nbsp;workflow.setConfiguration(config);</p>
<p>&nbsp;&nbsp;&nbsp;long workflowId = workflow.initialize("docworkflow", 100, null);<br />&nbsp;&nbsp;&nbsp;HashMap inputs = new HashMap();<br />&nbsp;&nbsp;&nbsp;inputs.put("title", "openopen");</p>
<p>&nbsp;&nbsp;&nbsp;workflow.doAction(workflowId, 1, inputs);</p>
<p>&nbsp;&nbsp;&nbsp;workflow.doAction(workflowId, 2, null);</p>
<p>&nbsp;&nbsp;&nbsp;workflow.doAction(workflowId, 3, null);</p>
<p>&nbsp;&nbsp;&nbsp;workflow.doAction(workflowId, 4, null);<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;} catch (InvalidActionException e) {<br />&nbsp;&nbsp;&nbsp;System.out.println(e.getMessage());<br />&nbsp;&nbsp;} catch (InvalidRoleException e) {<br />&nbsp;&nbsp;&nbsp;System.out.println(e.getMessage());<br />&nbsp;&nbsp;} catch (InvalidInputException e) {<br />&nbsp;&nbsp;&nbsp;System.out.println(e.getMessage());<br />&nbsp;&nbsp;} catch (InvalidEntryStateException e) {<br />&nbsp;&nbsp;&nbsp;System.out.println(e.getMessage());<br />&nbsp;&nbsp;} catch (WorkflowException e) {<br />&nbsp;&nbsp;&nbsp;System.out.println(e.getMessage());<br />&nbsp;&nbsp;}<br />&nbsp;}<br />}</p><br /><br /><br />log4j.properties<br />
<p>log4j.rootCategory=info,log,console</p>
<p>log4j.logger.org.apache.axis2.enterprise=FATAL<br />log4j.logger.de.hunsicker.jalopy.io=FATAL<br />log4j.logger.httpclient.wire.header=FATAL<br />log4j.logger.org.apache.commons.httpclient=FATAL</p>
<p>log4j.appender.console=org.apache.log4j.ConsoleAppender<br />log4j.appender.console.layout=org.apache.log4j.PatternLayout<br />log4j.appender.console.layout.ConversionPattern=%d [%t] %-5p %c %x - %m%n<br />&nbsp;<br />log4j.appender.log=org.apache.log4j.DailyRollingFileAppender<br />log4j.appender.log.File=logs/osworkflow.log<br />log4j.appender.log.layout=org.apache.log4j.PatternLayout<br />log4j.appender.log.layout.ConversionPattern=%d [%t] %-5p %c %x - %m%n</p><br /><br /><br />
<p><a href="http://blog.sina.com.cn/s/blog_544a96ce0100nvjy.html">http://blog.sina.com.cn/s/blog_544a96ce0100nvjy.html</a></p>
<p><a href="http://blog.csdn.net/tanruitian/article/details/498167">http://blog.csdn.net/tanruitian/article/details/498167</a></p>
<p><a href="http://www.cnblogs.com/jacky73/archive/2008/12/17/1357134.html">http://www.cnblogs.com/jacky73/archive/2008/12/17/1357134.html</a></p><img src ="http://www.blogjava.net/stevenjohn/aggbug/379878.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-06-03 22:39 <a href="http://www.blogjava.net/stevenjohn/archive/2012/06/03/379878.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>