Anonymous avatar Anonymous committed 9e751d5

Updated all docs from wiki
Added designer section

Comments (0)

Files changed (30)

docs/BSF_Functions.html

 <li>Up to <a href="Documentation.html">Documentation</a></li>
 <li>Back to <a href="BeanShell_Functions.html">BeanShell Functions</a></li>
 <li>Forward to <a href="Utility_Functions.html">Utility Functions</a></li>
-</ul><p class="paragraph"></p>In addition to OSWorkflow Java Function and <a href="BeanShell_Functions.html">BeanShell Functions</a>, OSWorkflow supports a third type of function: <span class="nobr"></img><a href="http://oss.software.ibm.com/developerworks/projects/bsf">Bean Scripting Framework</a></span> functions. BSF is a project by IBM's AlphaWorks group that allows for commonly used languages such as VBScript, Perlscript, Python, and JavaScript to operate in a common environment. What this means in OSWorkflow is that you can code your functions in any language supported by BSF in the following manner:<p class="paragraph"></p><div class="wikicode"><pre>&#60;function type=<span class="java&#45;quote">"bsf"</span>&#62;
-	&#60;arg name=<span class="java&#45;quote">"source"</span>&#62;foo.pl&#60;/arg&#62;
-	&#60;arg name=<span class="java&#45;quote">"row"</span>&#62;0&#60;/arg&#62;
-	&#60;arg name=<span class="java&#45;quote">"col"</span>&#62;0&#60;/arg&#62;
-	&#60;arg name=<span class="java&#45;quote">"script"</span>&#62;
-		print $bsf&#45;&#62;lookupBean(<span class="java&#45;quote">"propertySet"</span>).getString(<span class="java&#45;quote">"foo"</span>);
-	&#60;/arg&#62;
+</ul><p class="paragraph"></p>In addition to OSWorkflow Java Function and <a href="BeanShell_Functions.html">BeanShell Functions</a>, OSWorkflow supports a third type of function: <span class="nobr"></img><a href="http://oss.software.ibm.com/developerworks/projects/bsf">Bean Scripting Framework</a></span> functions. BSF is a project by IBM's AlphaWorks group that allows for commonly used languages such as VBScript, Perlscript, Python, and JavaScript to operate in a common environment. What this means in OSWorkflow is that you can code your functions in any language supported by BSF in the following manner:<p class="paragraph"></p><div class="wikicode"><pre>&#60;function type=<span class="java&#45;quote">"bsf"</span>&#62;
+	&#60;arg name=<span class="java&#45;quote">"source"</span>&#62;foo.pl&#60;/arg&#62;
+	&#60;arg name=<span class="java&#45;quote">"row"</span>&#62;0&#60;/arg&#62;
+	&#60;arg name=<span class="java&#45;quote">"col"</span>&#62;0&#60;/arg&#62;
+	&#60;arg name=<span class="java&#45;quote">"script"</span>&#62;
+		print $bsf&#45;&#62;lookupBean(<span class="java&#45;quote">"propertySet"</span>).getString(<span class="java&#45;quote">"foo"</span>);
+	&#60;/arg&#62;
 &#60;/function&#62;</pre></div><p class="paragraph"></p>The above code gets the <b class="bold">propertySet</b> then prints out the value with the key "foo". The same variables that are in default scope in BeanShell functions are available to lookup in your BSF script. Please read the BSF guide for info on how to lookup these beans in your language of choice.<p class="paragraph"></p></body></html>

docs/BeanShell_Functions.html

 <li>Up to <a href="Documentation.html">Documentation</a></li>
 <li>Back to <a href="Java-based_Function.html">Java-based Function</a></li>
 <li>Forward to <a href="BSF_Functions.html">BSF Functions</a></li>
-</ul><p class="paragraph"></p>OSWorkflow supports BeanShell as a scripting language. You can find out more about BeanShell at the <span class="nobr"></img><a href="http://www.beanshell.org/">BeanShell website</a></span>. Reading the documentation for BeanShell should be more than enough to get started with scripting for your own workflow definition file. There are a few behaviors that you should be aware of before starting, however:<p class="paragraph"></p>The <b class="bold">type</b> that must be chosen for BeanShell functions is <b class="bold">beanshell</b>. There is one required argument: <b class="bold">script</b>. The value for this argument is the actual script that is to be executed. Example:<p class="paragraph"></p><div class="wikicode"><pre>&#60;function type=<span class="java&#45;quote">"beanshell"</span>&#62;
-	&#60;arg name=<span class="java&#45;quote">"script"</span>&#62;	
-		<span class="java&#45;object">System</span>.out.println(<span class="java&#45;quote">"Hello, World!"</span>);
-	&#60;/arg&#62;
-&#60;/function&#62;</pre></div><p class="paragraph"></p>There are three variables in the expression scope at all times: <i class="italic">entry</i> <i class="italic">context</i>, and <i class="italic">store</i>. The variable "entry" is an object that implements <i class="italic">com.opensymphony.workflow.spi.WorkflowEntry</i> and represents the workflow instance. The variable "context" is an object of type <i class="italic">com.opensymphony.workflow.WorkflowContext</i> which allows for BeanShell functions to roll back transactions or determine the caller name. The "store" variable is of type <i class="italic">com.opensymphony.workflow.WorkflowStore</i>
- and allows the function to access the underlying workflow persistence store.<p class="paragraph"></p>Just like OSWorkflow Java Function, there are three variables that can be used and are automatically set in the BeanShell scope: <b class="bold">transientVars</b>, <b class="bold">args</b>, and <b class="bold">propertySet</b>. The same rules that apply to Java functions also apply here. Example:<p class="paragraph"></p><div class="wikicode"><pre>&#60;function type=<span class="java&#45;quote">"beanshell"</span>&#62;
-	&#60;arg name=<span class="java&#45;quote">"script"</span>&#62;	
-		propertySet.setString(<span class="java&#45;quote">"world"</span>, <span class="java&#45;quote">"Earth"</span>);
-	&#60;/arg&#62;
-&#60;/function&#62;
-&#60;function type=<span class="java&#45;quote">"beanshell"</span>&#62;
-	&#60;arg name=<span class="java&#45;quote">"script"</span>&#62;	
-		<span class="java&#45;object">System</span>.out.println(<span class="java&#45;quote">"Hello, "</span>+propertySet.getString(<span class="java&#45;quote">"world"</span>));
-	&#60;/arg&#62;
+</ul><p class="paragraph"></p>OSWorkflow supports BeanShell as a scripting language. You can find out more about BeanShell at the <span class="nobr"></img><a href="http://www.beanshell.org/">BeanShell website</a></span>. Reading the documentation for BeanShell should be more than enough to get started with scripting for your own workflow definition file. There are a few behaviors that you should be aware of before starting, however:<p class="paragraph"></p>The <b class="bold">type</b> that must be chosen for BeanShell functions is <b class="bold">beanshell</b>. There is one required argument: <b class="bold">script</b>. The value for this argument is the actual script that is to be executed. Example:<p class="paragraph"></p><div class="wikicode"><pre>&#60;function type=<span class="java&#45;quote">"beanshell"</span>&#62;
+	&#60;arg name=<span class="java&#45;quote">"script"</span>&#62;	
+		<span class="java&#45;object">System</span>.out.println(<span class="java&#45;quote">"Hello, World!"</span>);
+	&#60;/arg&#62;
+&#60;/function&#62;</pre></div><p class="paragraph"></p>There are three variables in the expression scope at all times: <i class="italic">entry</i> <i class="italic">context</i>, and <i class="italic">store</i>. The variable "entry" is an object that implements <i class="italic">com.opensymphony.workflow.spi.WorkflowEntry</i> and represents the workflow instance. The variable "context" is an object of type <i class="italic">com.opensymphony.workflow.WorkflowContext</i> which allows for BeanShell functions to roll back transactions or determine the caller name. The "store" variable is of type <i class="italic">com.opensymphony.workflow.WorkflowStore</i>
+ and allows the function to access the underlying workflow persistence store.<p class="paragraph"></p>Just like OSWorkflow Java Function, there are three variables that can be used and are automatically set in the BeanShell scope: <b class="bold">transientVars</b>, <b class="bold">args</b>, and <b class="bold">propertySet</b>. The same rules that apply to Java functions also apply here. Example:<p class="paragraph"></p><div class="wikicode"><pre>&#60;function type=<span class="java&#45;quote">"beanshell"</span>&#62;
+	&#60;arg name=<span class="java&#45;quote">"script"</span>&#62;	
+		propertySet.setString(<span class="java&#45;quote">"world"</span>, <span class="java&#45;quote">"Earth"</span>);
+	&#60;/arg&#62;
+&#60;/function&#62;
+&#60;function type=<span class="java&#45;quote">"beanshell"</span>&#62;
+	&#60;arg name=<span class="java&#45;quote">"script"</span>&#62;	
+		<span class="java&#45;object">System</span>.out.println(<span class="java&#45;quote">"Hello, "</span>+propertySet.getString(<span class="java&#45;quote">"world"</span>));
+	&#60;/arg&#62;
 &#60;/function&#62;</pre></div><p class="paragraph"></p>The output of these two scripts would be "Hello, Earth". This is because any variable stored in the <b class="bold">propertySet</b> is persisted for use in functions later in the workflow.<p class="paragraph"></p></body></html>

docs/Compiling_from_CVS.html

 <html><head><title>OSWorkflow Compiling from CVS</title></head><body>
 <ul class="star">
 <li>Up to <a href="Documentation.html">Documentation</a></li>
-</ul><p class="paragraph"></p>To get the latest version of OSWorkflow, we recommend that you download the source via CVS and compile using the <span class="nobr"></img><a href="http://jakarta.apache.org/ant/index.html">Jakarta Ant</a></span> build script provided there. Compiling OSWorkflow from source is trivial with the following two ant targets:
+</ul><p class="paragraph"></p>To get the latest version of OSWorkflow, we recommend that you download the source via CVS and compile using the <span class="nobr"></img><a href="http://jakarta.apache.org/ant/index.html">Jakarta Ant</a></span> build script provided there. Compiling OSWorkflow from source is trivial with the following two ant targets:
 <ul class="minus">
 <li><b class="bold">jar</b> <i class="italic">(default)</i> - compiles the library <b class="bold">osworkflow.jar</b></li>
 <li><b class="bold">example-war</b> - compiles and assembles <b class="bold">osworkflow-2.5.0-example.war</b>, which is configured to use memory persistence and should deploy without any configuration into most web containers.</li>
 <li><b class="bold">example-ear</b> - compiled and assembles <b class="bold">osworkflow-2.5.0-example.ear</b>, which is a J2EE application that is configured to use osworkflow with the EJB persistence store. Some configuration of data sources is required, as well as a full J2EE application server.</li>
+<li><b class="bold">client-jar</b> - compiled and assembles <b class="bold">designer.jar</b>, which is a Swing GUI workflow designer application that can be used to visually inspect and edit workflows.</li>
 </ul></body></html>

docs/Conditions.html

 <li>Up to <a href="Documentation.html">Documentation</a></li>
 <li>Back to <a href="Registers.html">Registers</a></li>
 <li>Forward to <a href="SOAP_Support.html">SOAP Support</a></li>
-</ul><p class="paragraph"></p>Conditions in OSWorkflow work very much like functions, validators, and registers, with one exception: <b class="bold">in BSF and Beanshell scripts, there is an extra object in scope of the name "jn"</b>. This variable is of the class <i class="italic">com.opensymphony.workflow.JoinNodes</i> and is used for join-conditions. Other than that, conditions are just like functions except that they must return a value that equates to <b class="bold">true or false</b>. This includes a String "true" or a Boolean that evaluates to true, or any other object that has a toString() method that returns the String "true" in some manner (TRUE, True, true, etc).<p class="paragraph"></p>Each <b class="bold">condition</b> must be defined as a child of the <b class="bold">conditions</b> element. This element has one attribute called <b class="bold">type</b>, which can either be <b class="bold">AND</b> or <b class="bold">OR</b>. When using the type AND all the condition elements must evaluate to true or the overall condition will return as false. When using the type OR only one condition element must evaluate to true for the overall condition to pass. If you require more complex conditional logic, you must write it yourself using the <b class="bold">Condition</b> or <b class="bold">ConditionRemote</b> interfaces, BeanShell, or BSF.<p class="paragraph"></p>Four utility conditions have been provided to duplicate the old behavior in OSWorkflow 2.0 and below. They are:
+</ul><p class="paragraph"></p>Conditions in OSWorkflow work very much like functions, validators, and registers, with one exception: <b class="bold">in BSF and Beanshell scripts, there is an extra object in scope of the name "jn"</b>. This variable is of the class <i class="italic">com.opensymphony.workflow.JoinNodes</i> and is used for join-conditions. Other than that, conditions are just like functions except that they must return a value that equates to <b class="bold">true or false</b>. This includes a String "true" or a Boolean that evaluates to true, or any other object that has a toString() method that returns the String "true" in some manner (TRUE, True, true, etc).<p class="paragraph"></p>Each <b class="bold">condition</b> must be defined as a child of the <b class="bold">conditions</b> element. This element has one attribute called <b class="bold">type</b>, which can either be <b class="bold">AND</b> or <b class="bold">OR</b>. When using the type AND all the condition elements must evaluate to true or the overall condition will return as false. When using the type OR only one condition element must evaluate to true for the overall condition to pass. If you require more complex conditional logic, you must write it yourself using the <b class="bold">Condition</b> or <b class="bold">ConditionRemote</b> interfaces, BeanShell, or BSF.<p class="paragraph"></p>Below is a list of some of the standard conditions that OSWorkflow ships with:
 <ul class="minus">
 <li><b class="bold">OSUserGroupCondition</b> - Uses OSUser to determine if the caller is in the required argument "group"</li>
 <li><b class="bold">StatusCondition</b> - Determines if the current step's status if the same as the required argument "status".</li>

docs/Configuration.html

 <li>Up to <a href="Documentation.html">Documentation</a></li>
 <li>Back to <a href="Persistence_Options.html">Persistence Options</a></li>
 <li>Forward to <a href="Integration_with_Other_Modules.html">Integration with Other Modules</a></li>
-</ul><p class="paragraph"></p>OSWorkflow tries to be as flexible as possible with regards to configuration. Only one file is required to be in the classpath: <span class="nobr"></img><a href="#osworkflow.xml">osworkflow.xml</a></span>. This file dictates the persistence method (JDBC, EJB, Ofbiz) as well the workflow factory class that is to be used for loading workflow definitions. The default factory is <b class="bold">com.opensymphony.workflow.loader.XMLWorkflowFactory</b>. This loads up a file in the classpath that in turn contains links to many different workflow definition files, all in XML (<span class="nobr"></img><a href="http://www.opensymphony.com/osworkflow/workflow.dtd">see Appendix A</a></span>). During test phase it's also useful to have your workflow definition files reloaded as they are changed. For this you can specify an optional property called <b class="bold">reload</b> (true|false) to your factory definition (default is false). If you would rather specify your workflow definitions in a different way, you are free to extend <span class="nobr"></img><a href="http://www.opensymphony.com/osworkflow/api/com/opensymphony/workflow/loader/AbstractWorkflowFactory.html">com.opensymphony.workflow.loader.AbstractWorkflowFactory</a></span> in any way that you like. <b class="bold">com.opensymphony.workflow.loader.JDBCWorkflowFactory</b> for example is an alternative factory, that allows you to store your workflow definitions in a JDBC database instead of putting them into the xml files. (<a href="JDBCWorkflowFactory.html">JDBCWorkflowFactory</a>)<p class="paragraph"></p>The most common configuration would be:
-<h3 class="heading-1-1"><a name="osworkflow.xml"></a><a href="Configuration#osworkflow_xml.html" title="Permalink to osworkflow.xml"></img></a> osworkflow.xml:
-<div class="wikicode"><pre>&#60;osworkflow&#62;
-  &#60;persistence class=<span class="java&#45;quote">"com.opensymphony.workflow.spi.jdbc.JDBCWorkflowStore"</span>&#62;
-    &#60;arg name=<span class="java&#45;quote">"foo"</span> value=<span class="java&#45;quote">"bar"</span>/&#62;
-    ...
-  &#60;/persistence&#62;
-  &#60;factory class=<span class="java&#45;quote">"com.opensymphony.workflow.loader.XMLWorkflowFactory"</span>&#62;
-    &#60;property key=<span class="java&#45;quote">"resource"</span> value=<span class="java&#45;quote">"workflows.xml"</span> /&#62;
-  &#60;/factory&#62;
-&#60;/osworkflow&#62;</pre></div>
-<h3 class="heading-1-1"><a name="workflows.xml"></a><a href="Configuration#workflows_xml.html" title="Permalink to workflows.xml"></img></a> workflows.xml:
-  &#60;workflow name=<span class="java&#45;quote">"example"</span> type=<span class="java&#45;quote">"resource"</span> location=<span class="java&#45;quote">"example.xml"</span>/&#62;
+</ul><p class="paragraph"></p>OSWorkflow tries to be as flexible as possible with regards to configuration. Only one file is required to be in the classpath: <span class="nobr"></img><a href="#osworkflow.xml">osworkflow.xml</a></span>. This file dictates the persistence method (JDBC, EJB, Ofbiz) as well the workflow factory class that is to be used for loading workflow definitions. The default factory is <b class="bold">com.opensymphony.workflow.loader.XMLWorkflowFactory</b>. This loads up a file in the classpath that in turn contains links to many different workflow definition files, all in XML (<span class="nobr"></img><a href="http://www.opensymphony.com/osworkflow/workflow_2_6.dtd">see Appendix A</a></span>). During test phase it's also useful to have your workflow definition files reloaded as they are changed. For this you can specify an optional property called <b class="bold">reload</b> (true|false) to your factory definition (default is false). If you would rather specify your workflow definitions in a different way, you are free to extend <span class="nobr"></img><a href="http://www.opensymphony.com/osworkflow/api/com/opensymphony/workflow/loader/AbstractWorkflowFactory.html">com.opensymphony.workflow.loader.AbstractWorkflowFactory</a></span> in any way that you like. <b class="bold">com.opensymphony.workflow.loader.JDBCWorkflowFactory</b> for example is an alternative factory, that allows you to store your workflow definitions in a JDBC database instead of putting them into the xml files. (<a href="JDBCWorkflowFactory.html">JDBCWorkflowFactory</a>)<p class="paragraph"></p>The most common configuration would be:
+<h3 class="heading-1-1"><a name="osworkflow.xml"></a><a href="Configuration#osworkflow_xml.html" title="Permalink to osworkflow.xml"></img></a> osworkflow.xml:
+</h3>
+<div class="wikicode"><pre>&#60;osworkflow&#62;
+  &#60;persistence class=<span class="java&#45;quote">"com.opensymphony.workflow.spi.jdbc.JDBCWorkflowStore"</span>&#62;
+    &#60;arg name=<span class="java&#45;quote">"foo"</span> value=<span class="java&#45;quote">"bar"</span>/&#62;
+    ...
+  &#60;/persistence&#62;
+  &#60;factory class=<span class="java&#45;quote">"com.opensymphony.workflow.loader.XMLWorkflowFactory"</span>&#62;
+    &#60;property key=<span class="java&#45;quote">"resource"</span> value=<span class="java&#45;quote">"workflows.xml"</span> /&#62;
+  &#60;/factory&#62;
+&#60;/osworkflow&#62;</pre></div>
+<h3 class="heading-1-1"><a name="workflows.xml"></a><a href="Configuration#workflows_xml.html" title="Permalink to workflows.xml"></img></a> workflows.xml:
+</h3><p class="paragraph"></p><div class="wikicode"><pre>&#60;workflows&#62;
+  &#60;workflow name=<span class="java&#45;quote">"example"</span> type=<span class="java&#45;quote">"resource"</span> location=<span class="java&#45;quote">"example.xml"</span>/&#62;
 &#60;/workflows&#62;</pre></div></body></html>

docs/Creating_a_new_workflow.html

 <li>Up to <a href="Documentation.html">Documentation</a></li>
 <li>Back to <a href="Interface_choices.html">Interface choices</a></li>
 <li>Forward to <a href="Executing_actions.html">Executing actions</a></li>
-</ul><p class="paragraph"></p>This is a very brief guide on how you can create a new workflow instance using the OSWorkflow Java APIs. First, the workflow definition file (in XML) must be created and defined using the <a href="Configuration.html">Configuration</a>. Then your code must know what the <b class="bold">initialStep</b> value should be for initializing an instance. Before you can initialize a workflow you must <b class="bold">create</b> it so that you have an ID that can be referenced from now on in the API. The following code example illustrates this:<p class="paragraph"></p>
-<div class="wikicode"><pre>Workflow wf = <span class="java&#45;keyword">new</span> BasicWorkflow(username);
-HashMap inputs = <span class="java&#45;keyword">new</span> HashMap();
-inputs.put(<span class="java&#45;quote">"docTitle"</span>, request.getParameter(<span class="java&#45;quote">"title"</span>));
+</ul><p class="paragraph"></p>This is a very brief guide on how you can create a new workflow instance using the OSWorkflow Java APIs. First, the workflow definition file (in XML) must be created and defined using the <a href="Configuration.html">Configuration</a>. Then your code must know what the <b class="bold">initialStep</b> value should be for initializing an instance. Before you can initialize a workflow you must <b class="bold">create</b> it so that you have an ID that can be referenced from now on in the API. The following code example illustrates this:<p class="paragraph"></p>
+<div class="wikicode"><pre>Workflow wf = <span class="java&#45;keyword">new</span> BasicWorkflow(username);
+HashMap inputs = <span class="java&#45;keyword">new</span> HashMap();
+inputs.put(<span class="java&#45;quote">"docTitle"</span>, request.getParameter(<span class="java&#45;quote">"title"</span>));
 wf.initialize(<span class="java&#45;quote">"workflowName"</span>, 1, inputs);</pre></div><p class="paragraph"></p>Note that usually, you would use a more appropriate Workflow implementation rather than BasicWorkflow. For example, EJBWorkflow or OfbizWorkflow. If you want to use a Workflow store that does not have a custom workflow context implementation (for example, JDBC, or Hibernate), then use BasicWorkflow. Contributions of WorkflowContexts for various stores are more than welcome!</body></html>

docs/Designer_Installation.html

+<html><head><title>Designer Installation</title></head><body>
+<ul class="star">
+<li>Up to <a href="Documentation.html">Documentation</a></li>
+<li>Back to <a href="SOAP_Support.html">SOAP Support</a></li>
+<li>Forward to <a href="Getting_Started.html">Getting Started</a></li>
+</ul><p class="paragraph"></p>The OSWorkflow GUI Designer application is a Swing based Java application<p class="paragraph"></p>The only prerequisite is a Java 1.4 installation. The application can be launched a number of different ways:
+<ul class="star">
+<li><span class="nobr"></img><a href="http://www.opensymphony.com/osworkflow/designer/designer.jnlp">Webstart</a></span></li>
+<li>From sources: Simply run the <b class="bold">client-jar</b> ant target in the source tree to build the client, then run <b class="bold">java -jar dist/designer.jar</b> from the commandline, or double click on <b class="bold">designer.jar</b> to launch it.</li>
+<li>From the binary distribution: Download the latest version of OSWorkflow, and double click on the designer.jar file.</li>
+</ul></body></html>

docs/Documentation.html

 <html><head><title>OSWorkflow Documentation</title></head><body>
-<h3 class="heading-1">Getting Started 
+<h3 class="heading-1">Getting Started 
+</h3>
 <ul class="star">
 <li><a href="Introduction.html">Introduction</a></li>
 <li><a href="Requirements.html">Requirements</a></li>
 <li><a href="Persistence_Options.html">Persistence Options</a></li>
 <li><a href="Configuration.html">Configuration</a></li>
 </ul>
-<h3 class="heading-1"><a href="Integration_with_Other_Modules.html">Integration with Other Modules</a>
+<h3 class="heading-1"><a href="Integration_with_Other_Modules.html">Integration with Other Modules</a>
+</h3>
 <ul class="star">
 <li>OSCore</li>
 <li>PropertySet</li>
 </ul>
-<h3 class="heading-1">Understanding OSWorkflow
+<h3 class="heading-1">Understanding OSWorkflow
+</h3>
 <ul class="star">
 <li><a href="Workflow_Definition.html">Workflow Definition</a></li>
 <li><a href="Workflow_Concepts.html">Workflow Concepts</a></li>
 <li><a href="Conditions.html">Conditions</a></li>
 <li><a href="SOAP_Support.html">SOAP Support</a></li>
 </ul>
-<h3 class="heading-1">Using the API 
+<h3 class="heading-1">OSWorkflow GUI Designer
+</h3>
+<ul class="star">
+<li><a href="Designer_Installation.html">Designer Installation</a></li>
+<li><a href="Getting_Started.html">Getting Started</a></li>
+<li><a href="Workspaces.html">Workspaces</a></li>
+<li><a href="Palettes.html">Palettes</a></li>
+</ul>
+<h3 class="heading-1">Using the API 
+</h3>
 <ul class="star">
 <li><a href="Interface_choices.html">Interface choices</a></li>
 <li><a href="Creating_a_new_workflow.html">Creating a new workflow</a></li>
 <li><a href="Executing_actions.html">Executing actions</a></li>
+<li><a href="Queries.html">Queries</a></li>
 </ul>
-<h3 class="heading-1">Appendices 
+<h3 class="heading-1">Appendices 
+</h3>
 <ul class="star">
-<li>Appendix A - <span class="nobr"></img><a href="http://www.opensymphony.com/osworkflow/workflow_2_5.dtd">DTD (w/ documentation)</a></span></li>
+<li>Appendix A - <span class="nobr"></img><a href="http://www.opensymphony.com/osworkflow/workflow_2_6.dtd">DTD (w/ documentation)</a></span></li>
 <li>Appendix B - <span class="nobr"></img><a href="http://jira.opensymphony.com/secure/BrowseProject.jspa?id=10004&amp;report=roadmap">Project Roadmap</a></span></li>
 <li>Appendix C - <span class="nobr"></img><a href="http://www.opensymphony.com/osworkflow/api/index.html">JavaDocs</a></span></li>
 <li>Appendix D - <a href="Compiling_from_CVS.html">Compiling from CVS</a></li>

docs/Executing_actions.html

 <ul class="star">
 <li>Up to <a href="Documentation.html">Documentation</a></li>
 <li>Back to <a href="Creating_a_new_workflow.html">Creating a new workflow</a></li>
-</ul><p class="paragraph"></p>In OSWorkflow, executing an action is very simple:<p class="paragraph"></p><div class="wikicode"><pre>Workflow wf = <span class="java&#45;keyword">new</span> BasicWorkflow(username);
-HashMap inputs = <span class="java&#45;keyword">new</span> HashMap();
-inputs.put(<span class="java&#45;quote">"docTitle"</span>, request.getParameter(<span class="java&#45;quote">"title"</span>));
-<span class="java&#45;object">long</span> id = <span class="java&#45;object">Long</span>.parseLong(request.getParameter(<span class="java&#45;quote">"workflowId"</span>));
+<li>Forward to <a href="Queries.html">Queries</a></li>
+</ul><p class="paragraph"></p>In OSWorkflow, executing an action is very simple:<p class="paragraph"></p><div class="wikicode"><pre>Workflow wf = <span class="java&#45;keyword">new</span> BasicWorkflow(username);
+HashMap inputs = <span class="java&#45;keyword">new</span> HashMap();
+inputs.put(<span class="java&#45;quote">"docTitle"</span>, request.getParameter(<span class="java&#45;quote">"title"</span>));
+<span class="java&#45;object">long</span> id = <span class="java&#45;object">Long</span>.parseLong(request.getParameter(<span class="java&#45;quote">"workflowId"</span>));
 wf.doAction(id, 1, inputs);</pre></div></body></html>

docs/Functions.html

 <li>Up to <a href="Documentation.html">Documentation</a></li>
 <li>Back to <a href="Workflow_Concepts.html">Workflow Concepts</a></li>
 <li>Forward to <a href="Java-based_Function.html">Java-based Function</a></li>
-</ul><p class="paragraph"></p>Functions in OSWorkflow are where you can perform the "meat" of your workflow-based application. They can be executed before and after (pre- and post-) transitions from one state to another in the finite state machine. OSWorkflow supports the following forms of functions:
-<h3 class="heading-1-1"><a href="Java-based_Function.html">Java-based Function</a>
+</ul><p class="paragraph"></p>Functions in OSWorkflow are where you can perform the "meat" of your workflow-based application. They can be executed before and after (pre- and post-) transitions from one state to another in the finite state machine. OSWorkflow supports the following forms of functions:
+<h3 class="heading-1-1"><a href="Java-based_Function.html">Java-based Function</a>
+</h3>
 <ul class="minus">
 <li>Java classes loaded by a ClassLoader</li>
 <li>Java classes retrieved via JNDI</li>
 <li>Remote EJBs</li>
 <li>Local EJBs</li>
 </ul>
-<h3 class="heading-1-1"><a href="BeanShell_Functions.html">BeanShell Functions</a> 
-<h3 class="heading-1-1"><a href="BSF_Functions.html">BSF Functions</a> (perlscript, vbscript, javascript) 
-<h3 class="heading-1-1"><a href="Utility_Functions.html">Utility Functions</a>
+<h3 class="heading-1-1"><a href="BeanShell_Functions.html">BeanShell Functions</a> 
+</h3>
+<h3 class="heading-1-1"><a href="BSF_Functions.html">BSF Functions</a> (perlscript, vbscript, javascript) 
+</h3>
+<h3 class="heading-1-1"><a href="Utility_Functions.html">Utility Functions</a>
+</h3><p class="paragraph"></p>OSWorkflow also includes a small set of <a href="Utility_Functions.html">Utility Functions</a> that will start you off in the right direction. Some of these utility functions are extremely valuable in creating dynamic workflow definitions.</body></html>

docs/Getting_Started.html

+<html><head><title>Getting Started</title></head><body>
+<ul class="star">
+<li>Up to <a href="Documentation.html">Documentation</a></li>
+<li>Back to <a href="Designer_Installation.html">Designer Installation</a></li>
+<li>Forward to <a href="Workspaces.html">Workspaces</a></li>
+</ul><p class="paragraph"></p>Before editing and creating workflows, a workspaces must be created. The first time the designer is started, you will be prompted to either load in an existing workspace, or create a new one. Choose create a new workspace.<p class="paragraph"></p>You will be presented with a file dialog, create a new directory and enter a name for your workspace file inside this directory. All the files a workspace uses are created alongside the master workspace file, which is why it is best to ensure that it goes into its own directory.<p class="paragraph"></p>Now that you have a workspace loaded in, it's time to add or import workflows. Let's import a workflow first, just to see what a complete one looks like.
+<h3 class="heading-1">Importing a workflow
+</h3>
+Go to the <b class="bold">file</b> menu, and select <b class="bold">import</b>. You will be presented with a dialog box prompting you to specify the location and type of import. You can import either a local workflow descriptor, or specify a remote one via its URL. OSWorkflow uses a number of descriptors in its testcases, so these can all be imported remotely. A list of these can be viewed <span class="nobr"></img><a href="https://osworkflow.dev.java.net/source/browse/osworkflow/src/test/samples/">here</a></span>. Select any one of those examples, and copy the 'as text' link and enter that into the URL box. The link will look something like <span class="nobr"></img><a href="https://osworkflow.dev.java.net/unbranded-source/browse/*checkout*/osworkflow/src/test/samples/auto-split.xml?rev=1.2&amp;content-type=text/plain">&#104;ttps://osworkflow.dev.java.net/unbranded-source/browse/*checkout*/osworkflow/src/test/samples/auto-split.xml?rev=1.2&amp;content-type=text/plain</a></span>
+The Designer will now import this file, and when the import is complete, you will see it listed in your workspace and be able to view it.
+<h3 class="heading-1">Layout
+</h3>
+Once you have successfully imported a workflow, the designer will check if a layout exists for the specified workflow. The workflow layout determines where all the labels and steps are placed on the graph. If no layout exists, then a reasonable attempt is made to lay out the items in the workflow. You can force this automatic layout by choosing __Layout-&#62;Layout graph' from the menu.<p class="paragraph"></p>If you modify the layout (by dragging steps and labels around, for example), make sure you save the workspace. This will ensure that your layout is persisted and will be used the next time you view this graph.
+<h3 class="heading-1">Creating a workflow
+</h3>
+Instead of importing an existing workflow, you might wish to create a new one from scratch. Select <b class="bold">File-&#62;New-&#62;New Workflow</b> from the menu. You will be prompted to specify a workflow name.
+<h3 class="heading-1">Editing a workflow
+</h3>
+ Once the workflow is created, a new tab wil display it and will have an initial step in it. You can then drag steps, joins, and splits from the toolbar to create these items in the workflow. In order to create actions between steps, simply move the cursor over the red dot in the middle of every step until the cursor changes, then drag it to the resultant step. The designer will disallow things like dragging results to an initial step, for example.<p class="paragraph"></p>To edit the information associated with a particular step or result, select it, and the detail tab on the left hand side will be populated with the pre and post functions, as well as conditions if relevant. You can also modify the step name and view here. Alternatively, it is possible to modify names on the graph directly by double clicking on a label.<p class="paragraph"></p>Once you are satisfied with the changes, save your workspace. Note that while the designer will allow you to create certain types of invalid workflows, you will not be able to save them until they are valid. Any attempts to save an invalid workflow will result in an error dialog box hopefully explaining why the workflow is invalid.</body></html>

docs/Integration_with_Other_Modules.html

 <li>Back to <a href="Configuration.html">Configuration</a></li>
 <li>Forward to <a href="Workflow_Definition.html">Workflow Definition</a></li>
 </ul>
-<h3 class="heading-1-1">Integration with OSCore
-<h3 class="heading-1-1">Integration with PropertySet
+<h3 class="heading-1-1">Integration with OSCore
+</h3><p class="paragraph"></p>OSWorkflow requires <span class="nobr"></img><a href="http://www.opensymphony.com/osuser">OSUser</a></span> and <span class="nobr"></img><a href="http://www.opensymphony.com/propertyset">PropertySet</a></span>, which both require <span class="nobr"></img><a href="http://www.opensymphony.com/oscore">OSCore</a></span>. Furthermore, OSWorkflow makes heavy usage of the many useful features in OSCore, and therefore OSCore version 2.0.1 or above is required to use OSWorkflow.
+<h3 class="heading-1-1">Integration with PropertySet
+</h3><p class="paragraph"></p>One of the key features in OSWorkflow is the ability to save variables dynamically. This allows for a <a href="Functions.html">Functions</a> function to take place on day 1 in the workflow lifecycle and store a piece of data in OSWorkflow. Then, many days later, when an action is executed in the workflow, that same data can be pulled up and re-used in another function. This is a very powerful feature that when used properly can allow for highly customized, long-lived workflow behavior that persists even after server restarts.<p class="paragraph"></p>This is all possible by using the <span class="nobr"></img><a href="http://www.opensymphony.com/propertyset">PropertySet</a></span> module. What kinds of variable types you can dynamically store in the propertyset (usually exposed as the variable <b class="bold">ps</b>) is totally up to the PropertySet implementation that is chosen by the <b class="bold">WorkflowStore</b> you have configured in <b class="bold">osworkflow.xml</b>. For example, if you choose the <b class="bold">JDBCWorkflowStore</b>, you must make sure that the jdbc propertyset is properly configured in <b class="bold">propertyset.xml</b>. Information on setting up the propertyset backend store (for example, sql scripts for the JDBCPropertySet) can be found in the propertyset download.</body></html>

docs/Interface_choices.html

 <html><head><title>OSWorkflow Interface choices</title></head><body>
 <ul class="star">
 <li>Up to <a href="Documentation.html">Documentation</a></li>
-<li>Back to <a href="SOAP_Support.html">SOAP Support</a></li>
+<li>Back to <a href="Palettes.html">Palettes</a></li>
 <li>Forward to <a href="Creating_a_new_workflow.html">Creating a new workflow</a></li>
-</ul><p class="paragraph"></p>OSWorkflow provides several implementations of the <b class="bold">com.opensymphony.workflow.Workflow</b> interface that can be used in your application.
-<h3 class="heading-1">BasicWorkflow
-<h3 class="heading-1">EJBWorkflow
-<h3 class="heading-1">OfbizWorkflow
+</ul><p class="paragraph"></p>OSWorkflow provides several implementations of the <b class="bold">com.opensymphony.workflow.Workflow</b> interface that can be used in your application.
+<h3 class="heading-1">BasicWorkflow
+</h3><p class="paragraph"></p>The BasicWorkflow has no transactional support, though depending upon your persistence implementation, transactional support can be wrapped around this. It is created by doing  <div class="wikicode"><pre>Workflow wf = <span class="java&#45;keyword">new</span> BasicWorkflow(username)</pre></div> where username is the user who is associated with the current request.
+<h3 class="heading-1">EJBWorkflow
+</h3><p class="paragraph"></p>The EJB workflow uses the EJB container to manage transactions. This is configured in <b class="bold">ejb-jar.xml</b>. It is created by doing <div class="wikicode"><pre>Workflow wf = <span class="java&#45;keyword">new</span> EJBWorkflow()</pre></div>. There is no need to give the username (as in BasicWorkflow and OfbizWorkflow) since that is automatically pulled in from the EJB container once the user has been authorized.
+<h3 class="heading-1">OfbizWorkflow
+</h3><p class="paragraph"></p>The OfbizWorkflow is exactly like the BasicWorkflow in every way, except that methods that require transactional support are wrapped with ofbiz TransactionUtil calls.<p class="paragraph"></p></body></html>

docs/Introduction.html

 <ul class="star">
 <li>Up to <a href="Documentation.html">Documentation</a></li>
 <li>Forward to <a href="Requirements.html">Requirements</a></li>
-</ul><p class="paragraph"></p>OSWorkflow is very different from most other workflow systems available, both commercially and in the open source world. What makes OSWorkflow different is that it is extremely flexible. This flexibility can be hard to grasp at first, however. In fact, OSWorkflow does not contain graphical user interface components. It is up to the application developer to provide this sort of integration, as well as any integration with existing code and databases. These may seem like problems to someone who is looking for a quick "plug-and-play" workflow solution, but we've found that such a solution never provides enough flexibility to properly fulfill requirements in a full-blown application. <b class="bold">OSWorkflow gives you this flexbility</b>.<p class="paragraph"></p>OSWorkflow can be considered a "low level" workflow implementation. Situations like "loops" and "conditions" that might be represented by a graphical icon in other workflow systems must be "coded" in OSWorkflow. That's not to say that actual code is needed to implement situations like this, but a scripting language must be employed to specify these conditions. It is not expected that a non-technical user modify workflow. We've found that although some systems provide GUIs that allow for simple editing of workflows, the applications surrounding the workflow usually end up damaged when changes like these are made. We believe it is best for these changes to be made by a developer who is aware of each change.<p class="paragraph"></p>OSWorkflow is based heavily on the concept of the <b class="bold">finite state machine</b>. Each state in represented by the combination of a step ID and a status. A <b class="bold">transition</b> from one state to another cannot happen without an action occuring first. There are always at least one or more active states during the lifetime of a workflow. These simple concepts are what lie at the core of the OSWorkflow engine and allow a simple XML file to be translated in to business workflow processes.</body></html>
+</ul><p class="paragraph"></p>OSWorkflow is very different from most other workflow systems available, both commercially and in the open source world. What makes OSWorkflow different is that it is extremely flexible. This flexibility can be hard to grasp at first, however. In fact, OSWorkflow does not contain graphical user interface components. It is up to the application developer to provide this sort of integration, as well as any integration with existing code and databases. These may seem like problems to someone who is looking for a quick "plug-and-play" workflow solution, but we've found that such a solution never provides enough flexibility to properly fulfill requirements in a full-blown application. <b class="bold">OSWorkflow gives you this flexibility</b>.<p class="paragraph"></p>OSWorkflow can be considered a "low level" workflow implementation. Situations like "loops" and "conditions" that might be represented by a graphical icon in other workflow systems must be "coded" in OSWorkflow. That's not to say that actual code is needed to implement situations like this, but a scripting language must be employed to specify these conditions. It is not expected that a non-technical user modify workflow. We've found that although some systems provide GUIs that allow for simple editing of workflows, the applications surrounding the workflow usually end up damaged when changes like these are made. We believe it is best for these changes to be made by a developer who is aware of each change. Having said that, the latest version provides a GUI designer that can help with the editing of the workflow.<p class="paragraph"></p>OSWorkflow is based heavily on the concept of the <b class="bold">finite state machine</b>. Each state in represented by the combination of a step ID and a status. A <b class="bold">transition</b> from one state to another cannot happen without an action occuring first. There are always at least one or more active states during the lifetime of a workflow. These simple concepts are what lie at the core of the OSWorkflow engine and allow a simple XML file to be translated in to business workflow processes.</body></html>

docs/JDBCWorkflowFactory.html

 <html><head><title>JDBCWorkflowFactory</title></head><body>
-<b class="bold">com.opensymphony.workflow.loader.JDBCWorkflowFactory</b> is an alternative factory, that allows you to store your workflow definitions in a JDBC database instead of putting them into the xml files.
-<h3 class="heading-1">These features are planned for JDBCWorkflowFactory, but not yet implemented:
+<b class="bold">com.opensymphony.workflow.loader.JDBCWorkflowFactory</b> is an alternative factory, that allows you to store your workflow definitions in a JDBC database instead of putting them into the xml files.
+<h3 class="heading-1">These features are planned for JDBCWorkflowFactory, but not yet implemented:
+</h3>
 <ol>
 <li> versioning support</li>
 <li> find alternative to storing xml directly</li>
 <li> delete function</li>
-</ol><p class="paragraph"></p>It requires some configuration to get it running:
-<h3 class="heading-1-1"><a name="osworkflow.xml"></a><a href="JDBCWorkflowFactory#osworkflow_xml.html" title="Permalink to osworkflow.xml"></img></a> osworkflow.xml:
-<div class="wikicode"><pre>&#60;osworkflow&#62;
-  &#60;persistence class=<span class="java&#45;quote">"com.opensymphony.workflow.spi.jdbc.JDBCWorkflowStore"</span>&#62;
-    &#60;arg name=<span class="java&#45;quote">"foo"</span> value=<span class="java&#45;quote">"bar"</span>/&#62;
-    ...
-  &#60;/persistence&#62;
-  &#60;factory class=<span class="java&#45;quote">"com.opensymphony.workflow.loader.JDBCWorkflowFactory"</span>&#62;
-  &#60;/factory&#62;
-&#60;/osworkflow&#62;</pre></div>
-<h3 class="heading-1-1"><a name="JDBCDatabase"></a><a href="JDBCWorkflowFactory#JDBCDatabase.html" title="Permalink to JDBCDatabase"></img></a> JDBC Database:
+</ol><p class="paragraph"></p>It requires some configuration to get it running:
+<h3 class="heading-1-1"><a name="osworkflow.xml"></a><a href="JDBCWorkflowFactory#osworkflow_xml.html" title="Permalink to osworkflow.xml"></img></a> osworkflow.xml:
+</h3>
+<div class="wikicode"><pre>&#60;osworkflow&#62;
+  &#60;persistence class=<span class="java&#45;quote">"com.opensymphony.workflow.spi.jdbc.JDBCWorkflowStore"</span>&#62;
+    &#60;arg name=<span class="java&#45;quote">"foo"</span> value=<span class="java&#45;quote">"bar"</span>/&#62;
+    ...
+  &#60;/persistence&#62;
+  &#60;factory class=<span class="java&#45;quote">"com.opensymphony.workflow.loader.JDBCWorkflowFactory"</span>&#62;
+  &#60;/factory&#62;
+&#60;/osworkflow&#62;</pre></div>
+<h3 class="heading-1-1"><a name="JDBCDatabase"></a><a href="JDBCWorkflowFactory#JDBCDatabase.html" title="Permalink to JDBCDatabase"></img></a> JDBC Database:
+</h3><p class="paragraph"></p>Example create table script for HSQLDB:
 <div class="wikicode"><pre>CREATE CACHED TABLE OS_WORKFLOWDEFS (WF_DEFINITION BINARY,WF_NAME VARCHAR(256) NOT NULL PRIMARY KEY)</pre></div></body></html>

docs/Java-based_Function.html

 <li>Up to <a href="Documentation.html">Documentation</a></li>
 <li>Back to <a href="Functions.html">Functions</a></li>
 <li>Forward to <a href="BeanShell_Functions.html">BeanShell Functions</a></li>
-</ul><p class="paragraph"></p>Java-based functions must implement the interface <b class="bold">com.opensymphony.workflow.FunctionProvider</b>. This interface has a single method, <b class="bold">execute</b>. This method takes three arguments:
+</ul><p class="paragraph"></p>Java-based functions must implement the interface <b class="bold">com.opensymphony.workflow.FunctionProvider</b>. This interface has a single method, <b class="bold">execute</b>. This method takes three arguments:
 <ul class="minus">
 <li><b class="bold">The transientVars Map</b> is the exact Map passed by the client code that called <b class="bold">Workflow.doAction()</b>. This is useful for functions that behave differently based on user input when the action is finished. It also includes a number of special variables that are helpful in accessing various aspects of the workflow. This includes all the variables configured in Registers (see <a href="Workflow_Concepts.html">Workflow Concepts</a>) as well as the following two special variables: <b class="bold">entry</b> (com.opensymphony.workflow.spi.WorkflowEntry) and <b class="bold">context</b> (com.opensymphony.workflow.WorkflowContext).</li>
 </ul>
-<br></br>
+<br></br>
 <ul class="minus">
 <li><b class="bold">The args Map</b> is a map that contains all the &#60;arg/&#62; tags embedded in the &#60;function/&#62; tag. These arguments are all of type String and have been parsed for any variable interpolation. This means that <i class="italic">&#60;arg name="foo"&#62;this is ${someVar}&#60;/arg&#62;</i> would result in a mapping from "foo" to "this is &#91;contents of someVar&#93;".</li>
 </ul>
-<br></br>
+<br></br>
 <ul class="minus">
 <li><b class="bold">The propertySet</b> contains all the persistent variables associated with the workflow instance.</li>
-</ul><p class="paragraph"></p>Java-based functions are available in the following <b class="bold">types</b>:
-<h3 class="heading-1-1">class
-	&#60;arg name=<span class="java&#45;quote">"class.name"</span>&#62;com.acme.FooFunction&#60;/arg&#62;
-	&#60;arg name=<span class="java&#45;quote">"message"</span>&#62;The message is $&#123;message&#125;&#60;/arg&#62;
-&#60;/function&#62;</pre></div>
-<h3 class="heading-1-1">jndi
-	&#60;arg name=<span class="java&#45;quote">"jndi.location"</span>&#62;java:/FooFunction&#60;/arg&#62;
-	&#60;arg name=<span class="java&#45;quote">"message"</span>&#62;The message is $&#123;message&#125;&#60;/arg&#62;
-&#60;/function&#62;</pre></div>
-<h3 class="heading-1-1">remote-ejb
-	&#60;arg name=<span class="java&#45;quote">"ejb.location"</span>&#62;java:/comp/env/FooEJB&#60;/arg&#62;
-	&#60;arg name=<span class="java&#45;quote">"message"</span>&#62;The message is $&#123;message&#125;&#60;/arg&#62;
-&#60;/function&#62;</pre></div>
-<h3 class="heading-1-1">local-ejb
-	&#60;arg name=<span class="java&#45;quote">"ejb.location"</span>&#62;java:/comp/env/FooEJB&#60;/arg&#62;
-	&#60;arg name=<span class="java&#45;quote">"message"</span>&#62;The message is $&#123;message&#125;&#60;/arg&#62;
+</ul><p class="paragraph"></p>Java-based functions are available in the following <b class="bold">types</b>:
+<h3 class="heading-1-1">class
+</h3><p class="paragraph"></p>For a class function, the ClassLoader must know the class name of your function. This can be accomplished with the argument class.name. An example is:<p class="paragraph"></p><div class="wikicode"><pre>&#60;function type=<span class="java&#45;quote">"class"</span>&#62;
+	&#60;arg name=<span class="java&#45;quote">"class.name"</span>&#62;com.acme.FooFunction&#60;/arg&#62;
+	&#60;arg name=<span class="java&#45;quote">"message"</span>&#62;The message is $&#123;message&#125;&#60;/arg&#62;
+&#60;/function&#62;</pre></div>
+<h3 class="heading-1-1">jndi
+</h3><p class="paragraph"></p>JNDI functions are just like class functions except they must already exist in the JNDI tree. Instead of a class.name argument, the argument <b class="bold">jndi.location</b> is required. Example:<p class="paragraph"></p><div class="wikicode"><pre>&#60;function type=<span class="java&#45;quote">"jndi"</span>&#62;
+	&#60;arg name=<span class="java&#45;quote">"jndi.location"</span>&#62;java:/FooFunction&#60;/arg&#62;
+	&#60;arg name=<span class="java&#45;quote">"message"</span>&#62;The message is $&#123;message&#125;&#60;/arg&#62;
+&#60;/function&#62;</pre></div>
+<h3 class="heading-1-1">remote-ejb
+</h3><p class="paragraph"></p>Remote EJBs can be used as a function in OSWorkflow provided a few things happen first. The remote interface of the EJB must extend <b class="bold">com.opensymphony.workflow.FunctionProviderRemote</b>. Also, the required argument ejb.location must be given. Example:<p class="paragraph"></p><div class="wikicode"><pre>&#60;function type=<span class="java&#45;quote">"remote&#45;ejb"</span>&#62;
+	&#60;arg name=<span class="java&#45;quote">"ejb.location"</span>&#62;java:/comp/env/FooEJB&#60;/arg&#62;
+	&#60;arg name=<span class="java&#45;quote">"message"</span>&#62;The message is $&#123;message&#125;&#60;/arg&#62;
+&#60;/function&#62;</pre></div>
+<h3 class="heading-1-1">local-ejb
+</h3><p class="paragraph"></p>Local EJBs are exactly like remote EJBs, except that the local interface of the EJB must extend <b class="bold">com.opensymphony.workflow.FunctionProvider</b>, just like the other Java-based functions. Example:<p class="paragraph"></p><div class="wikicode"><pre>&#60;function type=<span class="java&#45;quote">"local&#45;ejb"</span>&#62;
+	&#60;arg name=<span class="java&#45;quote">"ejb.location"</span>&#62;java:/comp/env/FooEJB&#60;/arg&#62;
+	&#60;arg name=<span class="java&#45;quote">"message"</span>&#62;The message is $&#123;message&#125;&#60;/arg&#62;
 &#60;/function&#62;</pre></div></body></html>

docs/Migrating_from_version_1_0.html

 <html><head><title>OSWorkflow Migrating from version 1.0</title></head><body>
 <ul class="star">
 <li>Back to <a href="Documentation.html">Documentation</a></li>
-</ul><p class="paragraph"></p>Migrating from OSWorkflow 1.x to 2.1+ is slightly complex due to the introduction of joins and splits, which means that there <b class="bold">can now be more than one current step</b>. Below is an attempt to provide helpful information for migrating your application to version 2.1+:
+</ul><p class="paragraph"></p>Migrating from OSWorkflow 1.x to 2.1+ is slightly complex due to the introduction of joins and splits, which means that there <b class="bold">can now be more than one current step</b>. Below is an attempt to provide helpful information for migrating your application to version 2.1+:
 <ul class="minus">
 <li><b class="bold">Check your workflow XML file with the latest DTD</b> - the DTD has changed a bit, especially with regards to functions, validators, and registers. The location attribute for these has been removed and must now be set with an <b class="bold">arg</b> name/value pair. Please read the documentation for the exact values you should place here.</li>
 <li><b class="bold">Data migration</b> - the tables in version 1.x were much simpler than they are now in 2.1+. <b class="bold">Status values have changed from numbers to Strings</b>. <b class="bold">The conversion is as follows: 0 -&#62; Queued, 1 -&#62; Underway, 2 - &#62; Finished</b>. Below is a small guide to help you migrate your data so that it works under 2.1+:</li>
 </ul>
-<h3 class="heading-1-1">The old OSWorkflow schema is as follows:
-&#45;&#45;&#45;&#45;&#45;&#45; 
-id 
-name 
-currentStep<p class="paragraph"></p>
-step 
-&#45;&#45;&#45;&#45; 
-id 
-entryId 
-status 
-startDate 
-finishDate 
-actionId 
-owner</pre></div>
-<h3 class="heading-1-1">The new schema is now:
-&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45; 
-ID 
-NAME 
-INITIALIZED<p class="paragraph"></p>
-OS_CURRENTSTEP 
-&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45; 
-ID 
-ENTRY_ID 
-STEP_ID 
-ACTION_ID 
-OWNER 
-START_DATE 
-FINISH_DATE 
-STATUS<p class="paragraph"></p>
-OS_HISTORYSTEP 
-&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45; 
-ID 
-ENTRY_ID 
-STEP_ID 
-ACTION_ID 
-OWNER 
-START_DATE 
-FINISH_DATE 
-STATUS<p class="paragraph"></p>
-OS_CURRENTSTEP_PREV 
-&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45; 
-ID 
-PREVIOUS_ID<p class="paragraph"></p>
-OS_HISTORYSTEP_PREV 
-&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45; 
-ID 
-PREVIOUS_ID</pre></div>
-<h3 class="heading-1-1">How to migrate
+<h3 class="heading-1-1">The old OSWorkflow schema is as follows:
+</h3><p class="paragraph"></p><div class="wikicode"><pre>entry 
+&#45;&#45;&#45;&#45;&#45;&#45; 
+id 
+name 
+currentStep<p class="paragraph"></p>
+step 
+&#45;&#45;&#45;&#45; 
+id 
+entryId 
+status 
+startDate 
+finishDate 
+actionId 
+owner</pre></div>
+<h3 class="heading-1-1">The new schema is now:
+</h3><p class="paragraph"></p><div class="wikicode"><pre>OS_WFENTRY 
+&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45; 
+ID 
+NAME 
+INITIALIZED<p class="paragraph"></p>
+OS_CURRENTSTEP 
+&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45; 
+ID 
+ENTRY_ID 
+STEP_ID 
+ACTION_ID 
+OWNER 
+START_DATE 
+FINISH_DATE 
+STATUS<p class="paragraph"></p>
+OS_HISTORYSTEP 
+&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45; 
+ID 
+ENTRY_ID 
+STEP_ID 
+ACTION_ID 
+OWNER 
+START_DATE 
+FINISH_DATE 
+STATUS<p class="paragraph"></p>
+OS_CURRENTSTEP_PREV 
+&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45; 
+ID 
+PREVIOUS_ID<p class="paragraph"></p>
+OS_HISTORYSTEP_PREV 
+&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45; 
+ID 
+PREVIOUS_ID</pre></div>
+<h3 class="heading-1-1">How to migrate
+</h3><p class="paragraph"></p>First, dump all non-initialized workflows in your old schema with<p class="paragraph"></p><div class="wikicode"><pre>DELTE <span class="sql&#45;keyword">FROM</class> entry <span class="sql&#45;keyword">WHERE</class> currentStep is NULL or currentStep = 0;</pre></div><p class="paragraph"></p>Now we can assume the rest of the workflow instances are all initialized. Now just copy the (id, workflowName) tuple in to OS_WFENTRY as the tuple (id, name, 1) (the 1 is to mark the workflow as initialized).<p class="paragraph"></p>Next, using the currentStep attribute on the old "entry" table, make a query to populate OS_CURRENTSTEP. For the previousId attribute in the old "step" table, populate the OS_CURRENTSTEP_PREV with the tuple (currentStep, previousId).<p class="paragraph"></p>Lastly, delete all entries in the old "step" table that have a join to the "entry" table (ensuring the step table only contains history steps now). Now do the same thing you did above for the rest of the tuples in "step", except use the OS_HISTORYSTEP and OS_HISTORYSTEP_PREV tables.<p class="paragraph"></p></body></html>

docs/Migrating_from_version_2_1.html

 <html><head><title>OSWorkflow Migrating from version 2.1</title></head><body>
 <ul class="star">
 <li>Back to <a href="Documentation.html">Documentation</a></li>
-</ul><p class="paragraph"></p>There have been a number of changes in OSWorkflow between 2.1 and 2.5. This guide attempts to provide a migration path and a note of non-backward compatible changes.<p class="paragraph"></p>Improved error handling: All exceptions are not checked, and are propagated correctly with their underlying causes. This means that you now have to explicitly catch WorkflowException, or one of its subclasses.<p class="paragraph"></p>The 'inputs' field in scripts has been renamed to 'transientVars', and the 'variables' field renamed to 'propertySet'. The variables map has been removed, and now the PropertySet it previously wrapped is directly passed around. The API's for conditions, validators, and functions have been modified accordingly. Calls to variables.put/get need to be changed to their PropertySet equivelants (eg, setString/getString and so on). This also means that the get/createVariableMap methods from AbstractWorkflow are removed. This also means that the API for FunctionProviders and Conditions has been changed appropriately. Updating your code is a fairly simply matter of changing variable names and converting Map methods to PropertySet equivelants.<p class="paragraph"></p>Workflow XML descriptor files are now validated. Previously invalid files were still parsed and handled, with the invalid content ignored. This is no longer the case.<p class="paragraph"></p>The DTD was updated and renamed to workflow_2_5.dtd, you will need to update the DTD declaration in your workflow descriptors.<p class="paragraph"></p>Use of BasicWorkflow inside of functions is discouraged. Those who used it to access the workflow store now have a 'store' variable in the transient vars that can be used.<p class="paragraph"></p>A new DUE_DATE column is required in the step tables.<p class="paragraph"></p>The EJB Store now has a session bean facade.<p class="paragraph"></p>A number of methods in AbstractWorkflow have also been changed. Instead of two calls to createEntry followed by initialize, initializing a workflow is now done by:
-<div class="wikicode"><pre>workflow.initialize(workflowName, initialAction, inputs);</pre></div>
+</ul><p class="paragraph"></p>There have been a number of changes in OSWorkflow between 2.1 and 2.5. This guide attempts to provide a migration path and a note of non-backward compatible changes.<p class="paragraph"></p>Improved error handling: All exceptions are not checked, and are propagated correctly with their underlying causes. This means that you now have to explicitly catch WorkflowException, or one of its subclasses.<p class="paragraph"></p>The 'inputs' field in scripts has been renamed to 'transientVars', and the 'variables' field renamed to 'propertySet'. The variables map has been removed, and now the PropertySet it previously wrapped is directly passed around. The API's for conditions, validators, and functions have been modified accordingly. Calls to variables.put/get need to be changed to their PropertySet equivelants (eg, setString/getString and so on). This also means that the get/createVariableMap methods from AbstractWorkflow are removed. This also means that the API for FunctionProviders and Conditions has been changed appropriately. Updating your code is a fairly simply matter of changing variable names and converting Map methods to PropertySet equivelants.<p class="paragraph"></p>Workflow XML descriptor files are now validated. Previously invalid files were still parsed and handled, with the invalid content ignored. This is no longer the case.<p class="paragraph"></p>The DTD was updated and renamed to workflow_2_5.dtd, you will need to update the DTD declaration in your workflow descriptors.<p class="paragraph"></p>Use of BasicWorkflow inside of functions is discouraged. Those who used it to access the workflow store now have a 'store' variable in the transient vars that can be used.<p class="paragraph"></p>A new DUE_DATE column is required in the step tables.<p class="paragraph"></p>The EJB Store now has a session bean facade.<p class="paragraph"></p>A number of methods in AbstractWorkflow have also been changed. Instead of two calls to createEntry followed by initialize, initializing a workflow is now done by:
+<div class="wikicode"><pre>workflow.initialize(workflowName, initialAction, inputs);</pre></div>
 This will return a long with the created entry's ID.<p class="paragraph"></p>Previous descriptor access methods like getActionName, getStepName, and getStepNames in AbstractWorkflow have been removed. It is possible to interrogate the descriptor more fully via the getWorkflowDescriptor method.</body></html>

docs/Palettes.html

+<html><head><title>OSWorkflow Palettes</title></head><body>
+<ul class="star">
+<li>Up to <a href="Documentation.html">Documentation</a></li>
+<li>Back to <a href="Workspaces.html">Workspaces</a></li>
+<li>Forward to <a href="Interface_choices.html">Interface choices</a></li>
+</ul><p class="paragraph"></p>Given all the flexibility that OSWOrkflow provides, the designer is highly flexible in terms of allowing the deployer to specify the set of functions and conditions that is available.<p class="paragraph"></p>A palette in designer terms is an xml file that consists of a number of conditions and functions that the user can choose from when creating a workflow. The palette defines the arguments that can be specified to a particular function or condition, as well as whether that argument is modifiable.<p class="paragraph"></p>Note also that palettes are fully internationalized. All the strings are resource bundle keys. The actual text is specified in <b class="bold">palette.properties</b>.<p class="paragraph"></p>There are a number of magic keys that are checked. For every function or condition name (for example, <b class="bold">check.status</b>), a .long key is used for its description (in our example, the key for description would be <b class="bold">check.status.long</b>).<p class="paragraph"></p>For arguments, the naming convention for keys is &#60;element name&#62;.&#60;arg name&#62;. So for the check.status condition's status argument, the key in the properties file is <b class="bold">check.status.status</b>.<p class="paragraph"></p>In all cases, if a particular key is not found, an appropriate fallback value is used (for example, the condition or arg name as listed in the xml file).<p class="paragraph"></p>Currently the designer only supports one global palette. A default one with support for most of the built-in functions and conditions is shipped in the designer's META-INF directory. Deployers are encouraged to develop their own palettes for their functions and conditions.</body></html>

docs/Persistence_Options.html

 <li>Up to <a href="Documentation.html">Documentation</a></li>
 <li>Back to <a href="Running_the_Example_App.html">Running the Example App</a></li>
 <li>Forward to <a href="Configuration.html">Configuration</a></li>
-</ul><p class="paragraph"></p>OSWorkflow provides a pluggable persistence mechanism that can be used to allow for many choices of ways for workflow content to be stored. Included with OSWorkflow are the following WorkflowStore implementations: <b class="bold">MemoryStore (default), SerializableStore, JDBCStore, OfbizStore, and EJBStore</b>. If one of these does not fit your requirements, you can implement your own workflow store by implementing the interface <span class="nobr"></img><a href="http://www.opensymphony.com/osworkflow/api/com/opensymphony/workflow/spi/WorkflowStore.html">com.opensymphony.workflow.spi.WorkflowStore</a></span>. Read the javadocs for more information.<p class="paragraph"></p>Also, please note that each workflow store implementation may have required or optional properties that must or can be set. It is recommend that you read the javadocs for the workflow store that you plan to use so that you can configure the store properly. A sample JDBC configuration for the JDBCStore is given below:<p class="paragraph"></p>(from osworkflow.xml)
-<div class="wikicode"><pre>&#60;persistence class=<span class="java&#45;quote">"com.opensymphony.workflow.spi.jdbc.JDBCWorkflowStore"</span>&#62;
-	&#60;!&#45;&#45; For jdbc persistence, all are required. &#45;&#45;&#62;
-	&#60;property key=<span class="java&#45;quote">"datasource"</span> value=<span class="java&#45;quote">"jdbc/DefaultDS"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"entry.sequence"</span> value=<span class="java&#45;quote">"SELECT nextVal('seq_os_wfentry')"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"entry.table"</span> value=<span class="java&#45;quote">"OS_WFENTRY"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"entry.id"</span> value=<span class="java&#45;quote">"ID"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"entry.name"</span> value=<span class="java&#45;quote">"NAME"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"entry.initialized"</span> value=<span class="java&#45;quote">"INITIALIZED"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"step.sequence"</span> value=<span class="java&#45;quote">"SELECT nextVal('seq_os_currentsteps')"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"history.table"</span> value=<span class="java&#45;quote">"OS_HISTORYSTEP"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"current.table"</span> value=<span class="java&#45;quote">"OS_CURRENTSTEP"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"historyPrev.table"</span> value=<span class="java&#45;quote">"OS_HISTORYSTEP_PREV"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"currentPrev.table"</span> value=<span class="java&#45;quote">"OS_CURRENTSTEP_PREV"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"step.id"</span> value=<span class="java&#45;quote">"ID"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"step.entryId"</span> value=<span class="java&#45;quote">"ENTRY_ID"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"step.stepId"</span> value=<span class="java&#45;quote">"STEP_ID"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"step.actionId"</span> value=<span class="java&#45;quote">"ACTION_ID"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"step.owner"</span> value=<span class="java&#45;quote">"OWNER"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"step.caller"</span> value=<span class="java&#45;quote">"CALLER"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"step.startDate"</span> value=<span class="java&#45;quote">"START_DATE"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"step.finishDate"</span> value=<span class="java&#45;quote">"FINISH_DATE"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"step.dueDate"</span> value=<span class="java&#45;quote">"DUE_DATE"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"step.status"</span> value=<span class="java&#45;quote">"STATUS"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"step.previousId"</span> value=<span class="java&#45;quote">"PREVIOUS_ID"</span>/&#62;
-&#60;/persistence&#62;</pre></div><p class="paragraph"></p>If you are using tomcat as the servlet container, you should config <b class="bold">$TOMCAT_HOME/conf/server.xml</b> for data source, by default, the data source name is <b class="bold">jdbc/DefaultDS</b>.<p class="paragraph"></p>You should also config the propertyset to use jdbc by add  <b class="bold">WEB-INF/classes/propertyset.xml</b>, please note that the datasource setting should match the name defined in tomcat.
-<div class="wikicode"><pre>&#60;propertysets&#62;
-    &#60;propertyset name=<span class="java&#45;quote">"jdbc"</span> class=<span class="java&#45;quote">"com.opensymphony.module.propertyset.database.JDBCPropertySet"</span>&#62;
-        &#60;arg name=<span class="java&#45;quote">"datasource"</span> value=<span class="java&#45;quote">"jdbc/DefaultDS"</span>/&#62;
-        &#60;arg name=<span class="java&#45;quote">"table.name"</span> value=<span class="java&#45;quote">"OS_PROPERTYENTRY"</span>/&#62;
-        &#60;arg name=<span class="java&#45;quote">"col.globalKey"</span> value=<span class="java&#45;quote">"GLOBAL_KEY"</span>/&#62;
-        &#60;arg name=<span class="java&#45;quote">"col.itemKey"</span> value=<span class="java&#45;quote">"ITEM_KEY"</span>/&#62;
-        &#60;arg name=<span class="java&#45;quote">"col.itemType"</span> value=<span class="java&#45;quote">"ITEM_TYPE"</span>/&#62;
-        &#60;arg name=<span class="java&#45;quote">"col.string"</span> value=<span class="java&#45;quote">"STRING_VALUE"</span>/&#62;
-        &#60;arg name=<span class="java&#45;quote">"col.date"</span> value=<span class="java&#45;quote">"DATE_VALUE"</span>/&#62;
-        &#60;arg name=<span class="java&#45;quote">"col.data"</span> value=<span class="java&#45;quote">"DATA_VALUE"</span>/&#62;
-        &#60;arg name=<span class="java&#45;quote">"col.<span class="java&#45;object">float</span>"</span> value=<span class="java&#45;quote">"FLOAT_VALUE"</span>/&#62;
-        &#60;arg name=<span class="java&#45;quote">"col.number"</span> value=<span class="java&#45;quote">"NUMBER_VALUE"</span>/&#62;
-    &#60;/propertyset&#62;
-&#60;/propertysets&#62;</pre></div><p class="paragraph"></p>A number of sample sql scripts to create the required tables are included in the OSWorkflow distribution in in the src/etc/deployment/jdbc directory.<p class="paragraph"></p>If HypersonicSQL is used as the datasource, you can follow these steps:
+</ul><p class="paragraph"></p>OSWorkflow provides a pluggable persistence mechanism that can be used to allow for many choices of ways for workflow content to be stored. Included with OSWorkflow are the following WorkflowStore implementations: <b class="bold">MemoryStore (default), SerializableStore, JDBCStore, OfbizStore, and EJBStore</b>. If one of these does not fit your requirements, you can implement your own workflow store by implementing the interface <span class="nobr"></img><a href="http://www.opensymphony.com/osworkflow/api/com/opensymphony/workflow/spi/WorkflowStore.html">com.opensymphony.workflow.spi.WorkflowStore</a></span>. Read the javadocs for more information.<p class="paragraph"></p>Also, please note that each workflow store implementation may have required or optional properties that must or can be set. It is recommend that you read the javadocs for the workflow store that you plan to use so that you can configure the store properly. A sample JDBC configuration for the JDBCStore is given below:<p class="paragraph"></p>(from osworkflow.xml)
+<div class="wikicode"><pre>&#60;persistence class=<span class="java&#45;quote">"com.opensymphony.workflow.spi.jdbc.JDBCWorkflowStore"</span>&#62;
+	&#60;!&#45;&#45; For jdbc persistence, all are required. &#45;&#45;&#62;
+	&#60;property key=<span class="java&#45;quote">"datasource"</span> value=<span class="java&#45;quote">"jdbc/DefaultDS"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"entry.sequence"</span> value=<span class="java&#45;quote">"SELECT nextVal('seq_os_wfentry')"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"entry.table"</span> value=<span class="java&#45;quote">"OS_WFENTRY"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"entry.id"</span> value=<span class="java&#45;quote">"ID"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"entry.name"</span> value=<span class="java&#45;quote">"NAME"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"entry.initialized"</span> value=<span class="java&#45;quote">"INITIALIZED"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"step.sequence"</span> value=<span class="java&#45;quote">"SELECT nextVal('seq_os_currentsteps')"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"history.table"</span> value=<span class="java&#45;quote">"OS_HISTORYSTEP"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"current.table"</span> value=<span class="java&#45;quote">"OS_CURRENTSTEP"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"historyPrev.table"</span> value=<span class="java&#45;quote">"OS_HISTORYSTEP_PREV"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"currentPrev.table"</span> value=<span class="java&#45;quote">"OS_CURRENTSTEP_PREV"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"step.id"</span> value=<span class="java&#45;quote">"ID"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"step.entryId"</span> value=<span class="java&#45;quote">"ENTRY_ID"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"step.stepId"</span> value=<span class="java&#45;quote">"STEP_ID"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"step.actionId"</span> value=<span class="java&#45;quote">"ACTION_ID"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"step.owner"</span> value=<span class="java&#45;quote">"OWNER"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"step.caller"</span> value=<span class="java&#45;quote">"CALLER"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"step.startDate"</span> value=<span class="java&#45;quote">"START_DATE"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"step.finishDate"</span> value=<span class="java&#45;quote">"FINISH_DATE"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"step.dueDate"</span> value=<span class="java&#45;quote">"DUE_DATE"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"step.status"</span> value=<span class="java&#45;quote">"STATUS"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"step.previousId"</span> value=<span class="java&#45;quote">"PREVIOUS_ID"</span>/&#62;
+&#60;/persistence&#62;</pre></div><p class="paragraph"></p>If you are using tomcat as the servlet container, you should config <b class="bold">$TOMCAT_HOME/conf/server.xml</b> for data source, by default, the data source name is <b class="bold">jdbc/DefaultDS</b>.<p class="paragraph"></p>You should also config the propertyset to use jdbc by add  <b class="bold">WEB-INF/classes/propertyset.xml</b>, please note that the datasource setting should match the name defined in tomcat.
+<div class="wikicode"><pre>&#60;propertysets&#62;
+    &#60;propertyset name=<span class="java&#45;quote">"jdbc"</span> class=<span class="java&#45;quote">"com.opensymphony.module.propertyset.database.JDBCPropertySet"</span>&#62;
+        &#60;arg name=<span class="java&#45;quote">"datasource"</span> value=<span class="java&#45;quote">"jdbc/DefaultDS"</span>/&#62;
+        &#60;arg name=<span class="java&#45;quote">"table.name"</span> value=<span class="java&#45;quote">"OS_PROPERTYENTRY"</span>/&#62;
+        &#60;arg name=<span class="java&#45;quote">"col.globalKey"</span> value=<span class="java&#45;quote">"GLOBAL_KEY"</span>/&#62;
+        &#60;arg name=<span class="java&#45;quote">"col.itemKey"</span> value=<span class="java&#45;quote">"ITEM_KEY"</span>/&#62;
+        &#60;arg name=<span class="java&#45;quote">"col.itemType"</span> value=<span class="java&#45;quote">"ITEM_TYPE"</span>/&#62;
+        &#60;arg name=<span class="java&#45;quote">"col.string"</span> value=<span class="java&#45;quote">"STRING_VALUE"</span>/&#62;
+        &#60;arg name=<span class="java&#45;quote">"col.date"</span> value=<span class="java&#45;quote">"DATE_VALUE"</span>/&#62;
+        &#60;arg name=<span class="java&#45;quote">"col.data"</span> value=<span class="java&#45;quote">"DATA_VALUE"</span>/&#62;
+        &#60;arg name=<span class="java&#45;quote">"col.<span class="java&#45;object">float</span>"</span> value=<span class="java&#45;quote">"FLOAT_VALUE"</span>/&#62;
+        &#60;arg name=<span class="java&#45;quote">"col.number"</span> value=<span class="java&#45;quote">"NUMBER_VALUE"</span>/&#62;
+    &#60;/propertyset&#62;
+&#60;/propertysets&#62;</pre></div><p class="paragraph"></p>A number of sample sql scripts to create the required tables are included in the OSWorkflow distribution in in the src/etc/deployment/jdbc directory.<p class="paragraph"></p>If HypersonicSQL is used as the datasource, you can follow these steps:
 <ol>
 <li>Assume your hsql db is named <b class="bold">oswf</b> and created in directory <b class="bold">/db</b></li>
-</ol><p class="paragraph"></p>2. Use the mckoi.sql script to create the tables, you can use <b class="bold">java -cp hsqldb.jar org.hsqldb.util.DatabaseManager</b> to startup the tool to execute the sript. Please delete all statements about create and drop sequence. HSQL does not support sequence, so we must have a workaround.<p class="paragraph"></p>3. Add the context config to <b class="bold">$TOMCAT_HOME/conf/server.xml</b>
-<div class="wikicode"><pre>&#60;Context path=<span class="java&#45;quote">"/osworkflow"</span> docBase=<span class="java&#45;quote">"/jakarta&#45;tomcat&#45;4.1.27/webapps/osworkflow&#45;2.6&#45;dev&#45;example"</span>&#62;
-          &#60;Resource name=<span class="java&#45;quote">"jdbc/oswf"</span> type=<span class="java&#45;quote">"javax.sql.DataSource"</span>/&#62;
-          &#60;ResourceParams name=<span class="java&#45;quote">"jdbc/DefaultDS"</span>&#62;
-            &#60;parameter&#62;&#60;name&#62;username&#60;/name&#62;&#60;value&#62;sa&#60;/value&#62;&#60;/parameter&#62;
-            &#60;parameter&#62;&#60;name&#62;password&#60;/name&#62;&#60;value&#62;&#60;/value&#62;&#60;/parameter&#62;
-            &#60;parameter&#62;&#60;name&#62;driverClassName&#60;/name&#62;
-              &#60;value&#62;org.hsqldb.jdbcDriver&#60;/value&#62;&#60;/parameter&#62;
-            &#60;parameter&#62;&#60;name&#62;url&#60;/name&#62;
-              &#60;value&#62;jdbc:hsqldb:/db/oswf&#60;/value&#62;&#60;/parameter&#62;
-          &#60;/ResourceParams&#62;
-&#60;/Context&#62;</pre></div><p class="paragraph"></p>4. Add <b class="bold">WEB-INF/classes/propertyset.xml</b> as described above<p class="paragraph"></p>5. Change the persistent setting of <b class="bold">WEB-INF/classes/osworkflow.xml</b>
-<div class="wikicode"><pre>&#60;persistence class=<span class="java&#45;quote">"com.opensymphony.workflow.spi.jdbc.JDBCWorkflowStore"</span>&#62;
-	&#60;!&#45;&#45; For jdbc persistence, all are required. &#45;&#45;&#62;
-	&#60;property key=<span class="java&#45;quote">"datasource"</span> value=<span class="java&#45;quote">"jdbc/DefaultDS"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"entry.sequence"</span> value=<span class="java&#45;quote">"select count(&#42;) + 1 from os_wfentry"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"entry.table"</span> value=<span class="java&#45;quote">"OS_WFENTRY"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"entry.id"</span> value=<span class="java&#45;quote">"ID"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"entry.name"</span> value=<span class="java&#45;quote">"NAME"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"entry.state"</span> value=<span class="java&#45;quote">"STATE"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"entry.initialized"</span> value=<span class="java&#45;quote">"STATE"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"step.sequence"</span> value=<span class="java&#45;quote">"select sum(c1) from (select 1 tb, count(&#42;) c1 from os_currentstep union select 2 tb, count(&#42;) c1 from os_historystep)"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"history.table"</span> value=<span class="java&#45;quote">"OS_HISTORYSTEP"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"current.table"</span> value=<span class="java&#45;quote">"OS_CURRENTSTEP"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"historyPrev.table"</span> value=<span class="java&#45;quote">"OS_HISTORYSTEP_PREV"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"currentPrev.table"</span> value=<span class="java&#45;quote">"OS_CURRENTSTEP_PREV"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"step.id"</span> value=<span class="java&#45;quote">"ID"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"step.entryId"</span> value=<span class="java&#45;quote">"ENTRY_ID"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"step.stepId"</span> value=<span class="java&#45;quote">"STEP_ID"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"step.actionId"</span> value=<span class="java&#45;quote">"ACTION_ID"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"step.owner"</span> value=<span class="java&#45;quote">"OWNER"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"step.caller"</span> value=<span class="java&#45;quote">"CALLER"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"step.startDate"</span> value=<span class="java&#45;quote">"START_DATE"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"step.finishDate"</span> value=<span class="java&#45;quote">"FINISH_DATE"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"step.dueDate"</span> value=<span class="java&#45;quote">"DUE_DATE"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"step.status"</span> value=<span class="java&#45;quote">"STATUS"</span>/&#62;
-	&#60;property key=<span class="java&#45;quote">"step.previousId"</span> value=<span class="java&#45;quote">"PREVIOUS_ID"</span>/&#62;
-&#60;/persistence&#62;</pre></div>
+</ol><p class="paragraph"></p>2. Use the hsql.sql script to create the tables, you can use <b class="bold">java -cp hsqldb.jar org.hsqldb.util.DatabaseManager</b> to startup the tool to execute the sript.<p class="paragraph"></p>3. Add the context config to <b class="bold">$TOMCAT_HOME/conf/server.xml</b>
+<div class="wikicode"><pre>&#60;Context path=<span class="java&#45;quote">"/osworkflow"</span> 
+         docBase=<span class="java&#45;quote">"/jakarta&#45;tomcat&#45;4.1.27/webapps/osworkflow&#45;2.6&#45;dev&#45;example"</span>&#62;
+          &#60;Resource name=<span class="java&#45;quote">"jdbc/oswf"</span> type=<span class="java&#45;quote">"javax.sql.DataSource"</span>/&#62;
+          &#60;ResourceParams name=<span class="java&#45;quote">"jdbc/DefaultDS"</span>&#62;
+            &#60;parameter&#62;&#60;name&#62;username&#60;/name&#62;&#60;value&#62;sa&#60;/value&#62;&#60;/parameter&#62;
+            &#60;parameter&#62;&#60;name&#62;password&#60;/name&#62;&#60;value&#62;&#60;/value&#62;&#60;/parameter&#62;
+            &#60;parameter&#62;&#60;name&#62;driverClassName&#60;/name&#62;
+              &#60;value&#62;org.hsqldb.jdbcDriver&#60;/value&#62;&#60;/parameter&#62;
+            &#60;parameter&#62;&#60;name&#62;url&#60;/name&#62;
+              &#60;value&#62;jdbc:hsqldb:/db/oswf&#60;/value&#62;&#60;/parameter&#62;
+          &#60;/ResourceParams&#62;
+&#60;/Context&#62;</pre></div><p class="paragraph"></p>4. Add <b class="bold">WEB-INF/classes/propertyset.xml</b> as described above<p class="paragraph"></p>5. Change the persistent setting of <b class="bold">WEB-INF/classes/osworkflow.xml</b>. This example below should be used for any database that does not support sequences (eg, HSQL)
+<div class="wikicode"><pre>&#60;persistence class=<span class="java&#45;quote">"com.opensymphony.workflow.spi.jdbc.JDBCWorkflowStore"</span>&#62;
+	&#60;!&#45;&#45; For jdbc persistence, all are required. &#45;&#45;&#62;
+	&#60;property key=<span class="java&#45;quote">"datasource"</span> value=<span class="java&#45;quote">"jdbc/DefaultDS"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"entry.sequence"</span> value=<span class="java&#45;quote">"select count(&#42;) + 1 from os_wfentry"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"entry.table"</span> value=<span class="java&#45;quote">"OS_WFENTRY"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"entry.id"</span> value=<span class="java&#45;quote">"ID"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"entry.name"</span> value=<span class="java&#45;quote">"NAME"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"entry.state"</span> value=<span class="java&#45;quote">"STATE"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"entry.initialized"</span> value=<span class="java&#45;quote">"STATE"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"step.sequence"</span> value=<span class="java&#45;quote">"select sum(c1) from (select 1 tb, count(&#42;) c1 from os_currentstep union select 2 tb, count(&#42;) c1 from os_historystep)"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"history.table"</span> value=<span class="java&#45;quote">"OS_HISTORYSTEP"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"current.table"</span> value=<span class="java&#45;quote">"OS_CURRENTSTEP"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"historyPrev.table"</span> value=<span class="java&#45;quote">"OS_HISTORYSTEP_PREV"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"currentPrev.table"</span> value=<span class="java&#45;quote">"OS_CURRENTSTEP_PREV"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"step.id"</span> value=<span class="java&#45;quote">"ID"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"step.entryId"</span> value=<span class="java&#45;quote">"ENTRY_ID"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"step.stepId"</span> value=<span class="java&#45;quote">"STEP_ID"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"step.actionId"</span> value=<span class="java&#45;quote">"ACTION_ID"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"step.owner"</span> value=<span class="java&#45;quote">"OWNER"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"step.caller"</span> value=<span class="java&#45;quote">"CALLER"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"step.startDate"</span> value=<span class="java&#45;quote">"START_DATE"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"step.finishDate"</span> value=<span class="java&#45;quote">"FINISH_DATE"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"step.dueDate"</span> value=<span class="java&#45;quote">"DUE_DATE"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"step.status"</span> value=<span class="java&#45;quote">"STATUS"</span>/&#62;
+	&#60;property key=<span class="java&#45;quote">"step.previousId"</span> value=<span class="java&#45;quote">"PREVIOUS_ID"</span>/&#62;
+&#60;/persistence&#62;</pre></div>
 Please note that in 2.6, <b class="bold">entry.initialized</b> has beed renamed to <b class="bold">entry.state</b>. The above sample define both property to column <b class="bold">STATE</b>, just in case.</body></html>

docs/Queries.html

+<html><head><title>OSWorkflow Queries</title></head><body>
+<ul class="star">
+<li>Up to <a href="Documentation.html">Documentation</a></li>
+<li>Back to <a href="Executing_actions.html">Executing actions</a></li>
+</ul><p class="paragraph"></p>OSWorkflow 2.6 introduces a new <span class="nobr"></img><a href="http://www.opensymphony.com/osworkflow/api/com/opensymphony/workflow/query/WorkflowExpressionQuery.html">ExpressionQuery</a></span> API.<p class="paragraph"></p>Note that not all workflow stores support queries. Currently the Hibernate, JDBC, and Memory workflow stores do support queries. The hibernate store however does not support mixed-type queries (for example, a query that uses both the history and current step contexts). To execute a query, a WorkflowExpressionQuery object is constructed, and the <span class="nobr"></img><a href="http://www.opensymphony.com/osworkflow/api/com/opensymphony/workflow/Workflow.html#query(com.opensymphony.workflow.query.WorkflowExpressionQuery)">query</a></span> method is invoked on the Workflow object.<p class="paragraph"></p>Below are some query example:<p class="paragraph"></p><div class="wikicode"><pre>//Get all workflow etnry ID's <span class="java&#45;keyword">for</span> which the owner is 'testuser'
+<span class="java&#45;keyword">new</span> WorkflowExpressionQuery(
+  <span class="java&#45;keyword">new</span> FieldExpression(FieldExpression.OWNER, //Check the OWNER field
+  FieldExpression.CURRENT_STEPS,  //Look in the current steps context
+  FieldExpression.EQUALS, //check equality
+  <span class="java&#45;quote">"testuser"</span>)); //the equality value is 'testuser'</pre></div><p class="paragraph"></p><div class="wikicode"><pre>//Get all workflow entry ID's that have the name 'myworkflow'
+<span class="java&#45;keyword">new</span> WorkflowExpressionQuery(
+  <span class="java&#45;keyword">new</span> FieldExpression(FieldExpression.NAME, //Check the NAME field
+  FieldExpression.ENTRY,  //Look in the entries context
+  FieldExpression.EQUALS,  //Check equality
+  'myworkflow')) //equality value is 'myworkflow'</pre></div><p class="paragraph"></p>Below is an example of a nested query:<p class="paragraph"></p><div class="wikicode"><pre>// Get all finished workflow entries where the current owner is 'testuser'
+Expression queryLeft = <span class="java&#45;keyword">new</span> FieldExpression(
+  FieldExpression.OWNER, 
+  FieldExpression.CURRENT_STEPS, 
+  FieldExpression.EQUALS, 'testuser');
+Expression queryRight = <span class="java&#45;keyword">new</span> FieldExpression(
+  FieldExpression.STATUS, 
+  FieldExpression.CURRENT_STEPS, 
+  FieldExpression.EQUALS, 
+  <span class="java&#45;quote">"Finished"</span>, 
+  <span class="java&#45;keyword">true</span>);
+WorkflowExpressionQuery query = <span class="java&#45;keyword">new</span> WorkflowExpressionQuery(
+  <span class="java&#45;keyword">new</span> NestedExpression(<span class="java&#45;keyword">new</span> Expression&#91;&#93; &#123;queryLeft, queryRight&#125;,
+  NestedExpression.AND));</pre></div><p class="paragraph"></p>Finally, here is an example of a mixed-context query. Note that this query is not supported by the Hibernate workflow store.<p class="paragraph"></p><div class="wikicode"><pre>//Get all workflow entries that were finished in the past
+//or are currently marked finished
+Expression queryLeft = <span class="java&#45;keyword">new</span> FieldExpression(
+  FieldExpression.FINISH_DATE, 
+  FieldExpression.HISTORY_STEPS, 
+  FieldExpression.LT, <span class="java&#45;keyword">new</span> Date());
+Expression queryRight = <span class="java&#45;keyword">new</span> FieldExpression(
+  FieldExpression.STATUS, 
+  FieldExpression.CURRENT_STEPS, 
+  FieldExpression.EQUALS, <span class="java&#45;quote">"Finished"</span>);
+WorkflowExpressionQuery query = <span class="java&#45;keyword">new</span> WorkflowExpressionQuery(
+  <span class="java&#45;keyword">new</span> NestedExpression(<span class="java&#45;keyword">new</span> Expression&#91;&#93; &#123;queryLeft, queryRight&#125;,
+  NestedExpression.OR));</pre></div></body></html>

docs/Registers.html

 <li>Up to <a href="Documentation.html">Documentation</a></li>
 <li>Back to <a href="Validators.html">Validators</a></li>
 <li>Forward to <a href="Conditions.html">Conditions</a></li>
-</ul><p class="paragraph"></p>A register in OSWorkflow is a runtime field that can be dynamically registered in the workflow definition file.<p class="paragraph"></p>Registers are useful in a number of situations. For example, you might want to provide easy access to the entity that is progressing through the workflow (separate from the actual workflow itself) to the workflow descriptor. In this case, you would define a register that encapsulates this entity. If this entity happens to be a local session EJB, you could use the <b class="bold">com.opensymphony.workflow.util.ejb.local.LocalEJBRegister</b> register class to make this entity available. Later on in a particular post-function, you will have access to the entity, and can call any of its methods through a beanshell script, for example.<p class="paragraph"></p>Registers, just like <a href="Validators.html">Validators</a> and <a href="Functions.html">Functions</a>, can be implemented using three different forms: <b class="bold">Java-based</b>, <b class="bold">BeanShell</b>, and <b class="bold">BSF</b>. 
-<h3 class="heading-1-1">Java-based
-<h3 class="heading-1-1">BeanShell and BSF registers
-<h3 class="heading-1-1">One note about registers
+</ul><p class="paragraph"></p>A register in OSWorkflow is a runtime field that can be dynamically registered in the workflow definition file.<p class="paragraph"></p>Registers are useful in a number of situations. For example, you might want to provide easy access to the entity that is progressing through the workflow (separate from the actual workflow itself) to the workflow descriptor. In this case, you would define a register that encapsulates this entity. If this entity happens to be a local session EJB, you could use the <b class="bold">com.opensymphony.workflow.util.ejb.local.LocalEJBRegister</b> register class to make this entity available. Later on in a particular post-function, you will have access to the entity, and can call any of its methods through a beanshell script, for example.<p class="paragraph"></p>Registers, just like <a href="Validators.html">Validators</a> and <a href="Functions.html">Functions</a>, can be implemented using three different forms: <b class="bold">Java-based</b>, <b class="bold">BeanShell</b>, and <b class="bold">BSF</b>. 
+<h3 class="heading-1-1">Java-based
+</h3><p class="paragraph"></p>Java-based registers must implement the <b class="bold">com.opensymphony.workflow.Register</b> interface (or in the case of <b class="bold">remote-ejb</b>'s, the <b class="bold">com.opensymphony.workflow.RegisterRemote</b> interface).  
+<h3 class="heading-1-1">BeanShell and BSF registers
+</h3><p class="paragraph"></p>The value or object returned by the script will be the object that is registered.
+<h3 class="heading-1-1">One note about registers
+</h3><p class="paragraph"></p>While validators and functions both have the three parameters (<b class="bold">transientVars</b>, <b class="bold">args</b>, and <b class="bold">propertySet</b>) to work with, registers only have the args Map to use (along with the <b class="bold">context</b> and <b class="bold">entry</b> variables that are found in the <b class="bold">propertySet</b> normally). This is because registers are called regardless of user input, and also make up the variables map, so it would not make sense to give them scope to that kind of information.</body></html>

docs/Requirements.html

 <li>Up to <a href="Documentation.html">Documentation</a></li>
 <li>Back to <a href="Introduction.html">Introduction</a></li>
 <li>Forward to <a href="Running_the_Example_App.html">Running the Example App</a></li>
-</ul><p class="paragraph"></p>Almost all of the required libraries for OSWorkflow are included in the distribution:
+</ul><p class="paragraph"></p>Almost all of the required libraries for OSWorkflow are included in the distribution:
 <ul class="star">
 <li><span class="nobr"></img><a href="http://www.opensymphony.com/oscore">OSCore 2.0.1+</a></span></li>
-<li><span class="nobr"></img><a href="http://www.opensymphony.com/propertyset">PropertySet 1.0+</a></span></li>
+<li><span class="nobr"></img><a href="http://www.opensymphony.com/propertyset">PropertySet 1.2+</a></span></li>
 <li><span class="nobr"></img><a href="http://jakarta.apache.org/commons/logging.html">Jakarta commons-logging</a></span></li>
 <li><span class="nobr"></img><a href="http://www.beanshell.org/">BeanShell</a></span> (optional)</li>
 <li><span class="nobr"></img><a href="http://oss.software.ibm.com/developerworks/projects/bsf">BSF</a></span> (optional)</li>
 <li>EJB interfaces (not neccesarily an EJB container)</li>
-<li>XML parser</li>
-</ul><p class="paragraph"></p><b class="bold">A note about SOAP and job scheduling:</b> GLUE is the SOAP implementation that OSWorkflow uses. We chose to go with GLUE due to the ease of setup as well as the incredible power it offers. GLUE is freely available from <span class="nobr"></img><a href="http://www.themindelectric.com/">TheMindElectric</a></span>. If you are going to require SOAP support or <b class="bold">remote</b> Job Scheduling support, you must download the <b class="bold">GLUE Professional</b> libraries. In addition to GLUE, you'll also need <span class="nobr"></img><a href="http://www.part.net/quartz.html">Quartz</a></span> for job scheduling. If you don't wish to use GLUE and/or Quartz, you can provide alternate implementations very easily by using the OSWorkflow API. <b class="bold">If you are going to run Quartz from within your application server or any place that has OSWorkflow properly configured, you do not need GLUE and must configure the JobScheduler to have the arg "local" set to <i class="italic">true</i></b>.<p class="paragraph"></p>In addition to the above libraries, you will have different required libraries or install bases based on the persistence mechanism (WorkflowStore) you choose to use in your application. You can read more about these requirements in the <a href="Persistence_Options.html">Persistence Options</a> section. You may also need other libraries based on any utility functions you decide to use. For example, if you use the <b class="bold">OSUserGroupCondition</b> you will need <span class="nobr"></img><a href="http://www.opensymphony.com/osuser">OSUser</a></span> installed as well.<p class="paragraph"></p></body></html>
+<li>XML parser (Not required for JDK 1.4)</li>
+</ul><p class="paragraph"></p>The core API of OSWorkflow will work with JDK 1.3+. However, the GUI designer application required a 1.4 JVM.<p class="paragraph"></p><b class="bold">A note about SOAP and job scheduling:</b> GLUE is the SOAP implementation that OSWorkflow uses. We chose to go with GLUE due to the ease of setup as well as the incredible power it offers. GLUE is freely available from <span class="nobr"></img><a href="http://www.themindelectric.com/">TheMindElectric</a></span>. If you are going to require SOAP support or <b class="bold">remote</b> Job Scheduling support, you must download the <b class="bold">GLUE Professional</b> libraries. In addition to GLUE, you'll also need <span class="nobr"></img><a href="http://www.part.net/quartz.html">Quartz</a></span> for job scheduling. If you don't wish to use GLUE and/or Quartz, you can provide alternate implementations very easily by using the OSWorkflow API. <b class="bold">If you are going to run Quartz from within your application server or any place that has OSWorkflow properly configured, you do not need GLUE and must configure the JobScheduler to have the arg "local" set to <i class="italic">true</i></b>.<p class="paragraph"></p>In addition to the above libraries, you will have different required libraries or install bases based on the persistence mechanism (WorkflowStore) you choose to use in your application. You can read more about these requirements in the <a href="Persistence_Options.html">Persistence Options</a> section. You may also need other libraries based on any utility functions you decide to use. For example, if you use the <b class="bold">OSUserGroupCondition</b> you will need <span class="nobr"></img><a href="http://www.opensymphony.com/osuser">OSUser</a></span> installed as well.<p class="paragraph"></p></body></html>

docs/Running_the_Example_App.html

 <li>Up to <a href="Documentation.html">Documentation</a></li>
 <li>Back to <a href="Requirements.html">Requirements</a></li>
 <li>Forward to <a href="Persistence_Options.html">Persistence Options</a></li>
-</ul><p class="paragraph"></p>Note that as of version 2.5, the example war application should deploy on most web containers with no external configuration required. The example app now uses memory persistence, so no datasources need to be configured. The instructions below apply for those wishing to configure a persistent store. In order to explore the example workflow, it is recommended that you first deploy the example war as-is, without any persistence.<p class="paragraph"></p>OSWorkflow comes with a very simple example application to help you get started with understanding the concepts OSWorkflow is based upon. The example application can run on any servlet container. The following guides have been provided courtesy of Ed Yu and Egor Kobylkin. If your application server is not listed, read one of the guides below as a starting point. Installation should be very similar.
+</ul><p class="paragraph"></p>Note that as of version 2.5, the example war application should deploy on most web containers with no external configuration required. The example app now uses memory persistence, so no datasources need to be configured. The instructions below apply for those wishing to configure a persistent store. In order to explore the example workflow, it is recommended that you first deploy the example war as-is, without any persistence.<p class="paragraph"></p>OSWorkflow comes with a very simple example application to help you get started with understanding the concepts OSWorkflow is based upon. The example application can run on any servlet container. The following guides have been provided courtesy of Ed Yu and Egor Kobylkin. If your application server is 
+not listed, read one of the guides below as a starting point. Installation
+should be very similar.
 <ul class="star">
 <li><span class="nobr"></img><a href="#orion">Orion</a></span></li>
 <li><span class="nobr"></img><a href="#jrun">JRun</a></span></li>
 <li><span class="nobr"></img><a href="#tomcat40">Tomcat 4.0.x</a></span></li>
 <li><span class="nobr"></img><a href="#tomcat41">Tomcat 4.1.x</a></span></li>
 </ul>
-<h3 class="heading-1">Orion <a name="orion"></a><a href="Running_the_Example_App#orion.html" title="Permalink to orion"></img></a> <span class="nobr"></img><a href="#top">top</a></span>
-&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;
-This is a quick stab on how to deploy osworkflow_example.war on Orion 1.5.4.<p class="paragraph"></p>
-Setting up persistence
-&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;
-It is important to properly configure pooled datasource <span class="java&#45;keyword">for</span> good performance.<p class="paragraph"></p>For Orion 1.5.4+, the add the following to file config/data&#45;sources.xml
-to properly configure pooled datasource required by OSWorkflow:<p class="paragraph"></p>	&#60;!&#45;&#45; Postgresql Pooled Datasource &#45;&#45;&#62;
-	&#60;data&#45;source
-                    class=<span class="java&#45;quote">"com.evermind.sql.DriverManagerDataSource"</span>
-                    name=<span class="java&#45;quote">"NoPoolPostgresql"</span>
-                    location=<span class="java&#45;quote">"jdbc/NoPoolDefaultDS"</span>
-                    xa&#45;location=<span class="java&#45;quote">"jdbc/xa/NoPoolDefaultXADS"</span>
-                    connection&#45;driver=<span class="java&#45;quote">"org.postgresql.Driver"</span>
-                    username=<span class="java&#45;quote">"name"</span>
-                    password=<span class="java&#45;quote">"pass"</span>
-                    url=<span class="java&#45;quote">"jdbc:postgresql://hostname:port/dbname"</span>
-                    inactivity&#45;timeout=<span class="java&#45;quote">"30"</span>
-        /&#62;
-	&#60;data&#45;source
-                    class=<span class="java&#45;quote">"com.evermind.sql.OrionPooledDataSource"</span>
-                    name=<span class="java&#45;quote">"PooledPostgresql"</span>
-                    location=<span class="java&#45;quote">"jdbc/DefaultDS"</span>
-                    pooled&#45;location=<span class="java&#45;quote">"jdbc/DefaultDS"</span>
-                    xa&#45;location=<span class="java&#45;quote">"jdbc/xa/DefaultXADS"</span>
-                    source&#45;location=<span class="java&#45;quote">"jdbc/NoPoolDefaultDS"</span>
-                    connection&#45;driver=<span class="java&#45;quote">"org.postgresql.Driver"</span>
-                    username=<span class="java&#45;quote">"name"</span>
-                    password=<span class="java&#45;quote">"pass"</span>
-                    url=<span class="java&#45;quote">"jdbc:postgresql://hostname:port/dbname"</span>
-                    inactivity&#45;timeout=<span class="java&#45;quote">"30"</span>
-        /&#62;<p class="paragraph"></p>	&#60;!&#45;&#45; Oracle Pooled Datasource &#45;&#45;&#62;
-	&#60;data&#45;source
-                    class=<span class="java&#45;quote">"oracle.jdbc.pool.OracleDataSource"</span>
-                    name=<span class="java&#45;quote">"Default"</span>
-                    location=<span class="java&#45;quote">"jdbc/DefaultDS"</span>
-                    xa&#45;location=<span class="java&#45;quote">"jdbc/xa/DefaultXADS"</span>
-                    ejb&#45;location=<span class="java&#45;quote">"jdbc/DefaultDS"</span>
-                    connection&#45;driver=<span class="java&#45;quote">"oracle.jdbc.driver.OracleDriver"</span>
-                    username=<span class="java&#45;quote">"name"</span>
-                    password=<span class="java&#45;quote">"pass"</span>
-                    url=<span class="java&#45;quote">"jdbc:oracle:thin:@hostname:port:SID"</span>
-                    inactivity&#45;timeout=<span class="java&#45;quote">"30"</span>
-        /&#62;<p class="paragraph"></p>
-In addition, modify the osworkflow.xml to reflect how to access sequence
-objects <span class="java&#45;keyword">for</span> your database.<p class="paragraph"></p>To use postgresql as the backend database, execute the file tables_postgres.sql
-against the database and make sure the following is defined in the file
-osworkflow.xml:<p class="paragraph"></p>        &#60;!&#45;&#45; Postgresql sequence access &#45;&#45;&#62;
-        &#60;property key=<span class="java&#45;quote">"entry.sequence"</span> value=<span class="java&#45;quote">"SELECT nextVal('seq_os_wfentry')"</span>/&#62;
-        &#60;property key=<span class="java&#45;quote">"step.sequence"</span> value=<span class="java&#45;quote">"SELECT nextVal('seq_os_currentsteps')"</span>/&#62;<p class="paragraph"></p>To use oracle as the backend database, execute the file tables_oracle.sql
-against the database and make sure the following is defined in the
-osworkflow.xml:<p class="paragraph"></p>        &#60;!&#45;&#45; Oracle sequence access &#45;&#45;&#62;
-        &#60;property key=<span class="java&#45;quote">"entry.sequence"</span> value=<span class="java&#45;quote">"SELECT seq_os_wfentry.nextval FROM dual"</span>/&#62;
-        &#60;property key=<span class="java&#45;quote">"step.sequence"</span> value=<span class="java&#45;quote">"SELECT seq_os_currentsteps.nextval FROM dual"</span>/&#62;<p class="paragraph"></p>
-WAR Deployment
-&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;
-Make a directory under the server home (e.g. C:&#111;rion&#111;swf), pleace the file
-osworkflow_example.war file under it.<p class="paragraph"></p>Modify file config/application.xml and add the following line in:<p class="paragraph"></p>	&#60;web&#45;module id=<span class="java&#45;quote">"oswf"</span> path=<span class="java&#45;quote">"../oswf/osworkflow_example.war"</span> /&#62;<p class="paragraph"></p>Modify file config/<span class="java&#45;keyword">default</span>&#45;web&#45;site.xml and add the following line in:<p class="paragraph"></p>	&#60;web&#45;app application=<span class="java&#45;quote">"<span class="java&#45;keyword">default</span>"</span> load&#45;on&#45;startup=<span class="java&#45;quote">"<span class="java&#45;keyword">true</span>"</span> name=<span class="java&#45;quote">"oswf"</span> root=<span class="java&#45;quote">"/oswf"</span> /&#62;<p class="paragraph"></p>Finally go to <span class="nobr"></img><a href="http://localhost/oswf">&#104;ttp://localhost/oswf</a></span> to access the sample application.</pre></div>
-<h3 class="heading-1">JRun <a name="jrun"></a><a href="Running_the_Example_App#jrun.html" title="Permalink to jrun"></img></a> <span class="nobr"></img><a href="#top">top</a></span>
-&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;
-This is a quick stab on how to deploy osworkflow_example.war on JRun4.<p class="paragraph"></p>
-Setting up persistence
-&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;
-It is important to properly configure pooled datasource <span class="java&#45;keyword">for</span> good performance.<p class="paragraph"></p><p class="paragraph"></p>For JRun4, it is pretty easy to configure pooled datasource when defining JDBC
-resources using the JMC. Startup the admin server and the <span class="java&#45;keyword">default</span> server and
-then use JMC to define a JDBC datasource <span class="java&#45;keyword">for</span> your database within the <span class="java&#45;keyword">default</span>
-server(port 8100). Keep the checkbox clicked <span class="java&#45;keyword">for</span> pool connection when adding
-in the datasource. Make sure to verify the datasource after adding it in.<p class="paragraph"></p>JNDI Name		jdbc/DefaultDS
-Driver <span class="java&#45;object">Class</span> Name	org.postgresql.Driver
-URL			jdbc:postgresql://hostname:port/dbName
-Description		OSWorkflow example Postgresql database. 
-Pool Connections	X
-Pool Statements		X
-Native Results		X
-User Name		user
-Password		pass
-Verify Password	pass	pass<p class="paragraph"></p>JNDI Name		jdbc/DefaultDS
-Driver <span class="java&#45;object">Class</span> Name	oracle.jdbc.pool.OracleDataSource
-URL			jdbc:oracle:thin:@hostname:port:SID
-Description		OSWorkflow example Oracle database. 
-Pool Connections	X
-Pool Statements		X
-Native Results		X
-User Name		user
-Password		pass
-Verify Password	pass	pass<p class="paragraph"></p>In addition, modify the osworkflow.xml to reflect how to access sequence
-objects <span class="java&#45;keyword">for</span> your database.<p class="paragraph"></p>To use postgresql as the backend database, execute the file tables_postgres.sql
-against the database and make sure the following is defined in the file
-osworkflow.xml:<p class="paragraph"></p>        &#60;!&#45;&#45; Postgresql sequence access &#45;&#45;&#62;
-        &#60;property key=<span class="java&#45;quote">"entry.sequence"</span> value=<span class="java&#45;quote">"SELECT nextVal('seq_os_wfentry')"</span>/&#62;
-        &#60;property key=<span class="java&#45;quote">"step.sequence"</span> value=<span class="java&#45;quote">"SELECT nextVal('seq_os_currentsteps')"</span>/&#62;<p class="paragraph"></p>To use oracle as the backend database, execute the file tables_oracle.sql
-against the database and make sure the following is defined in the
-osworkflow.xml:<p class="paragraph"></p>        &#60;!&#45;&#45; Oracle sequence access &#45;&#45;&#62;
-        &#60;property key=<span class="java&#45;quote">"entry.sequence"</span> value=<span class="java&#45;quote">"SELECT seq_os_wfentry.nextval FROM dual"</span>/&#62;
-        &#60;property key=<span class="java&#45;quote">"step.sequence"</span> value=<span class="java&#45;quote">"SELECT seq_os_currentsteps.nextval FROM dual"</span>/&#62;<p class="paragraph"></p>
-WAR Deployment
-&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;
-To deploy osworkflow_example.war, place the file under the directory
-servers/<span class="java&#45;keyword">default</span> after setting up the persistence mechanism outlined above.
-Restart the <span class="java&#45;keyword">default</span> server (port 8100).<p class="paragraph"></p>Finally, go to <span class="nobr"></img><a href="http://localhost:8100/osworkflow_example">&#104;ttp://localhost:8100/osworkflow_example</a></span> to access the sample application.</pre></div>
-<h3 class="heading-1">Tomcat 4.0.x <a name="tomcat40"></a><a href="Running_the_Example_App#tomcat40.html" title="Permalink to tomcat40"></img></a> <span class="nobr"></img><a href="#top">top</a></span>
+<h3 class="heading-1">Orion <a name="orion"></a><a href="Running_the_Example_App#orion.html" title="Permalink to orion"></img></a> <span class="nobr"></img><a href="#top">top</a></span>
+</h3><p class="paragraph"></p><div class="wikicode"><pre>This is a quick stab on how to deploy osworkflow_example.war on Orion 1.5.4 or later.<p class="paragraph"></p>Setting up persistence
+&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;
+It is important to properly configure pooled datasource <span class="java&#45;keyword">for</span> good performance.<p class="paragraph"></p>For Orion 1.5.4+, the add the following to file config/data&#45;sources.xml
+to properly configure pooled datasource required by OSWorkflow:<p class="paragraph"></p>	&#60;!&#45;&#45; Postgresql Pooled Datasource &#45;&#45;&#62;
+	&#60;data&#45;source
+                    class=<span class="java&#45;quote">"com.evermind.sql.DriverManagerDataSource"</span>
+                    name=<span class="java&#45;quote">"NoPoolPostgresql"</span>
+                    location=<span class="java&#45;quote">"jdbc/NoPoolDefaultDS"</span>
+                    xa&#45;location=<span class="java&#45;quote">"jdbc/xa/NoPoolDefaultXADS"</span>
+                    connection&#45;driver=<span class="java&#45;quote">"org.postgresql.Driver"</span>
+                    username=<span class="java&#45;quote">"name"</span>
+                    password=<span class="java&#45;quote">"pass"</span>
+                    url=<span class="java&#45;quote">"jdbc:postgresql://hostname:port/dbname"</span>
+                    inactivity&#45;timeout=<span class="java&#45;quote">"30"</span>
+        /&#62;
+	&#60;data&#45;source
+                    class=<span class="java&#45;quote">"com.evermind.sql.OrionPooledDataSource"</span>
+                    name=<span class="java&#45;quote">"PooledPostgresql"</span>
+                    location=<span class="java&#45;quote">"jdbc/DefaultDS"</span>
+                    pooled&#45;location=<span class="java&#45;quote">"jdbc/DefaultDS"</span>
+                    xa&#45;location=<span class="java&#45;quote">"jdbc/xa/DefaultXADS"</span>
+                    source&#45;location=<span class="java&#45;quote">"jdbc/NoPoolDefaultDS"</span>
+                    connection&#45;driver=<span class="java&#45;quote">"org.postgresql.Driver"</span>
+                    username=<span class="java&#45;quote">"name"</span>
+                    password=<span class="java&#45;quote">"pass"</span>
+                    url=<span class="java&#45;quote">"jdbc:postgresql://hostname:port/dbname"</span>
+                    inactivity&#45;timeout=<span class="java&#45;quote">"30"</span>
+        /&#62;<p class="paragraph"></p>	&#60;!&#45;&#45; Oracle Pooled Datasource &#45;&#45;&#62;
+	&#60;data&#45;source
+                    class=<span class="java&#45;quote">"oracle.jdbc.pool.OracleDataSource"</span>
+                    name=<span class="java&#45;quote">"Default"</span>
+                    location=<span class="java&#45;quote">"jdbc/DefaultDS"</span>
+                    xa&#45;location=<span class="java&#45;quote">"jdbc/xa/DefaultXADS"</span>
+                    ejb&#45;location=<span class="java&#45;quote">"jdbc/DefaultDS"</span>
+                    connection&#45;driver=<span class="java&#45;quote">"oracle.jdbc.driver.OracleDriver"</span>
+                    username=<span class="java&#45;quote">"name"</span>
+                    password=<span class="java&#45;quote">"pass"</span>
+                    url=<span class="java&#45;quote">"jdbc:oracle:thin:@hostname:port:SID"</span>
+                    inactivity&#45;timeout=<span class="java&#45;quote">"30"</span>
+        /&#62;<p class="paragraph"></p>
+In addition, modify the osworkflow.xml to reflect how to access sequence
+objects <span class="java&#45;keyword">for</span> your database.<p class="paragraph"></p>To use postgresql as the backend database, execute the file tables_postgres.sql
+against the database and make sure the following is defined in the file
+osworkflow.xml:<p class="paragraph"></p>        &#60;!&#45;&#45; Postgresql sequence access &#45;&#45;&#62;
+        &#60;property key=<span class="java&#45;quote">"entry.sequence"</span> value=<span class="java&#45;quote">"SELECT nextVal('seq_os_wfentry')"</span>/&#62;
+        &#60;property key=<span class="java&#45;quote">"step.sequence"</span> value=<span class="java&#45;quote">"SELECT nextVal('seq_os_currentsteps')"</span>/&#62;<p class="paragraph"></p>To use oracle as the backend database, execute the file tables_oracle.sql
+against the database and make sure the following is defined in the
+osworkflow.xml:<p class="paragraph"></p>        &#60;!&#45;&#45; Oracle sequence access &#45;&#45;&#62;
+        &#60;property key=<span class="java&#45;quote">"entry.sequence"</span> 
+                  value=<span class="java&#45;quote">"SELECT seq_os_wfentry.nextval FROM dual"</span>/&#62;
+        &#60;property key=<span class="java&#45;quote">"step.sequence"</span> 
+                  value=<span class="java&#45;quote">"SELECT seq_os_currentsteps.nextval FROM dual"</span>/&#62;<p class="paragraph"></p>
+WAR Deployment
+&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;
+Make a directory under the server home (e.g. C:&#111;rion&#111;swf), pleace the file
+osworkflow_example.war file under it.<p class="paragraph"></p>Modify file config/application.xml and add the following line in:<p class="paragraph"></p>	&#60;web&#45;module id=<span class="java&#45;quote">"oswf"</span> path=<span class="java&#45;quote">"../oswf/osworkflow_example.war"</span> /&#62;<p class="paragraph"></p>Modify file config/<span class="java&#45;keyword">default</span>&#45;web&#45;site.xml and add the following line in:<p class="paragraph"></p>	&#60;web&#45;app application=<span class="java&#45;quote">"<span class="java&#45;keyword">default</span>"</span> load&#45;on&#45;startup=<span class="java&#45;quote">"<span class="java&#45;keyword">true</span>"</span> 
+                 name=<span class="java&#45;quote">"oswf"</span> root=<span class="java&#45;quote">"/oswf"</span> /&#62;<p class="paragraph"></p>Finally go to <span class="nobr"></img><a href="http://localhost/oswf">&#104;ttp://localhost/oswf</a></span> to access the sample application.<p class="paragraph"></p>You can also deploy the ear example application, which uses EJB persistence 
+rather than the in&#45;memory persistence that the example war webapp uses.</pre></div>
+<h3 class="heading-1">JRun <a name="jrun"></a><a href="Running_the_Example_App#jrun.html" title="Permalink to jrun"></img></a> <span class="nobr"></img><a href="#top">top</a></span>
+</h3><p class="paragraph"></p><div class="wikicode"><pre>This is a quick stab on how to deploy osworkflow_example.war on JRun4.<p class="paragraph"></p>
+Setting up persistence
+&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;
+It is important to properly configure pooled datasource <span class="java&#45;keyword">for</span> good performance.<p class="paragraph"></p>For JRun4, it is pretty easy to configure pooled datasource when defining JDBC
+resources using the JMC. Startup the admin server and the <span class="java&#45;keyword">default</span> server and
+then use JMC to define a JDBC datasource <span class="java&#45;keyword">for</span> your database within the <span class="java&#45;keyword">default</span>
+server(port 8100). Keep the checkbox clicked <span class="java&#45;keyword">for</span> pool connection when adding
+in the datasource. Make sure to verify the datasource after adding it in.<p class="paragraph"></p>JNDI Name		jdbc/DefaultDS
+Driver <span class="java&#45;object">Class</span> Name	org.postgresql.Driver
+URL			jdbc:postgresql://hostname:port/dbName
+Description		OSWorkflow example Postgresql database. 
+Pool Connections	X
+Pool Statements		X
+Native Results		X
+User Name		user
+Password		pass
+Verify Password	pass	pass<p class="paragraph"></p>JNDI Name		jdbc/DefaultDS
+Driver <span class="java&#45;object">Class</span> Name	oracle.jdbc.pool.OracleDataSource
+URL			jdbc:oracle:thin:@hostname:port:SID
+Description		OSWorkflow example Oracle database. 
+Pool Connections	X
+Pool Statements		X
+Native Results		X
+User Name		user
+Password		pass
+Verify Password	pass	pass<p class="paragraph"></p>In addition, modify the osworkflow.xml to reflect how to access sequence
+objects <span class="java&#45;keyword">for</span> your database.<p class="paragraph"></p>To use postgresql as the backend database, execute the file tables_postgres.sql
+against the database and make sure the following is defined in the file
+osworkflow.xml:<p class="paragraph"></p>        &#60;!&#45;&#45; Postgresql sequence access &#45;&#45;&#62;
+        &#60;property key=<span class="java&#45;quote">"entry.sequence"</span> value=<span class="java&#45;quote">"SELECT nextVal('seq_os_wfentry')"</span>/&#62;
+        &#60;property key=<span class="java&#45;quote">"step.sequence"</span> value=<span class="java&#45;quote">"SELECT nextVal('seq_os_currentsteps')"</span>/&#62;<p class="paragraph"></p>To use oracle as the backend database, execute the file tables_oracle.sql
+against the database and make sure the following is defined in the
+osworkflow.xml:<p class="paragraph"></p>        &#60;!&#45;&#45; Oracle sequence access &#45;&#45;&#62;
+        &#60;property key=<span class="java&#45;quote">"entry.sequence"</span> 
+                  value=<span class="java&#45;quote">"SELECT seq_os_wfentry.nextval FROM dual"</span>/&#62;
+        &#60;property key=<span class="java&#45;quote">"step.sequence"</span> 
+                  value=<span class="java&#45;quote">"SELECT seq_os_currentsteps.nextval FROM dual"</span>/&#62;<p class="paragraph"></p>
+WAR Deployment
+&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;
+To deploy osworkflow_example.war, place the file under the directory
+servers/<span class="java&#45;keyword">default</span> after setting up the persistence mechanism outlined above.
+Restart the <span class="java&#45;keyword">default</span> server (port 8100).<p class="paragraph"></p>Finally, go to <span class="nobr"></img><a href="http://localhost:8100/osworkflow_example">&#104;ttp://localhost:8100/osworkflow_example</a></span> to 
+access the sample application.</pre></div>
+<h3 class="heading-1">Tomcat 4.0.x <a name="tomcat40"></a><a href="Running_the_Example_App#tomcat40.html" title="Permalink to tomcat40"></img></a> <span class="nobr"></img><a href="#top">top</a></span>
+</h3>
 <ul class="star">
 <li><span class="nobr"></img><a href="#tomcat41">Tomcat 4.1.x</a></span></li>
 </ul>
-<div class="wikicode"><pre>README&#45;Tomcat.txt
-&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;
-This is a quick stab on how to deploy osworkflow_example.war on Tomcat 4.0.X.<p class="paragraph"></p>
-Setting up persistence
-&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;
-It is important to properly configure pooled datasource <span class="java&#45;keyword">for</span> good performance.<p class="paragraph"></p>Unfortunately, there is no good documentation on how to setup Tyrex in Tomcat
-4.0 and compounded by the fact that Tyrex will be deprecated begining in Tomcat
-version 4.1, there is no good way to improve performance under Tomcat 4.0.
-Nonetheless, there are documentation on how to configure Oracle pooled
-datasource factory in Tomcat 4.0.X. Refer to the urls
-<span class="nobr"></img><a href="http://www.apachelabs.org/tomcat&amp;#45;user/20020&amp;#91;3&amp;#45;7&amp;#93;.mbox/threads.html,">&#104;ttp://www.apachelabs.org/tomcat&amp;#45;user/20020&amp;#91;3&amp;#45;7&amp;#93;.mbox/threads.html,</a></span>
-<span class="java&#45;keyword">try</span> it out and let me know <span class="java&#45;keyword">if</span> you are successful. I've also attempted to
-use the LE version of Tomcat 4.0.4 (jakarta&#45;tomcat&#45;4.0.4&#45;LE&#45;jdk14.&#42;) without
-any luck (NPE), whereas the full version works fine <span class="java&#45;keyword">for</span> me.<p class="paragraph"></p>Please read the WAR Deployment section below and then come back here.<p class="paragraph"></p>It is important to copy the osworkflow_example.war into TOMCAT_HOME/webapps
-and startup and shutdown the server before making the modifications to
-TOMCAT_HOME/conf/server.xml to include:<p class="paragraph"></p>.
-.
-.
-        &#60;!&#45;&#45; OSWorkflow Example Context &#45;&#45;&#62;
-        &#60;Context path=<span class="java&#45;quote">"/osworkflow_example"</span> docBase=<span class="java&#45;quote">"osworkflow_example"</span> debug=<span class="java&#45;quote">"0"</span>
-                 reloadable=<span class="java&#45;quote">"<span class="java&#45;keyword">true</span>"</span> crossContext=<span class="java&#45;quote">"<span class="java&#45;keyword">true</span>"</span>&#62;
-	  &#60;Resource name=<span class="java&#45;quote">"jdbc/DefaultDS"</span> auth=<span class="java&#45;quote">"Container"</span>
-            type=<span class="java&#45;quote">"javax.sql.DataSource"</span>/&#62;
-	  &#60;ResourceParams name=<span class="java&#45;quote">"jdbc/DefaultDS"</span>&#62;
-            &#60;parameter&#62;&#60;name&#62;user&#60;/name&#62;&#60;value&#62;user&#60;/value&#62;&#60;/parameter&#62;
-            &#60;parameter&#62;&#60;name&#62;password&#60;/name&#62;&#60;value&#62;pass&#60;/value&#62;&#60;/parameter&#62;
-	    &#60;parameter&#62;
-	      &#60;name&#62;driverClassName&#60;/name&#62;<p class="paragraph"></p>	      &#60;!&#45;&#45; Oracle &#45;&#45;&#62;
-              &#60;value&#62;oracle.jdbc.driver.OracleDriver&#60;/value&#62;<p class="paragraph"></p>	      &#60;!&#45;&#45; Postgresql
-	      &#60;value&#62;org.postgresql.Driver&#60;/value&#62;
-	      &#45;&#45;&#62;<p class="paragraph"></p>	    &#60;/parameter&#62;
-	    &#60;parameter&#62;
-	      &#60;name&#62;driverName&#60;/name&#62;<p class="paragraph"></p>	      &#60;!&#45;&#45; Oracle &#45;&#45;&#62;
-	      &#60;value&#62;jdbc:oracle:thin:@hostname:port:SID&#60;/value&#62;<p class="paragraph"></p>	      &#60;!&#45;&#45; Postgresql
-	      &#60;value&#62;jdbc:postgresql://hostname:port/dbName&#60;/value&#62;
-	      &#45;&#45;&#62;<p class="paragraph"></p>	    &#60;/parameter&#62;
-	  &#60;/ResourceParams&#62;
-	&#60;/Context&#62;<p class="paragraph"></p>      &#60;/Host&#62;<p class="paragraph"></p>    &#60;/Engine&#62;<p class="paragraph"></p>  &#60;/Service&#62;
-.
-.
-.<p class="paragraph"></p>Make sure your JDBC driver is in TOMCAT_HOME/common/lib. For oracle, you may
-need to rename classes12.zip into classes12.jar <span class="java&#45;keyword">for</span> it to work.<p class="paragraph"></p>In addition, modify the osworkflow.xml to reflect how to access sequence
-objects <span class="java&#45;keyword">for</span> your database.<p class="paragraph"></p>To use postgresql as the backend database, execute the file tables_postgres.sql
-against the database and make sure the following is defined in the file
-osworkflow.xml:<p class="paragraph"></p>        &#60;!&#45;&#45; Postgresql sequence access &#45;&#45;&#62;
-        &#60;property key=<span class="java&#45;quote">"entry.sequence"</span> value=<span class="java&#45;quote">"SELECT nextVal('seq_os_wfentry')"</span>/&#62;
-        &#60;property key=<span class="java&#45;quote">"step.sequence"</span> value=<span class="java&#45;quote">"SELECT nextVal('seq_os_currentsteps')"</span>/&#62;<p class="paragraph"></p>To use oracle as the backend database, execute the file tables_oracle.sql
-against the database and make sure the following is defined in the
-osworkflow.xml:<p class="paragraph"></p>        &#60;!&#45;&#45; Oracle sequence access &#45;&#45;&#62;
-        &#60;property key=<span class="java&#45;quote">"entry.sequence"</span> value=<span class="java&#45;quote">"SELECT seq_os_wfentry.nextval FROM dual"</span>/&#62;
-        &#60;property key=<span class="java&#45;quote">"step.sequence"</span> value=<span class="java&#45;quote">"SELECT seq_os_currentsteps.nextval FROM dual"</span>/&#62;<p class="paragraph"></p>
-WAR Deployment
-&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;
-To deploy osworkflow_example.war, place it under the directory
-TOMCAT_HOME/webapps, startup and shutdown the server. Then set up the
-persistence mechanism as outlined above. Next, modify the server.xml file to
-configure the data source as outlined above.<p class="paragraph"></p>Finally, restart the server. Then, go to <span class="nobr"></img><a href="http://localhost:8080/osworkflow_example">&#104;ttp://localhost:8080/osworkflow_example</a></span> to access the sample application.</pre></div><p class="paragraph"></p><hr class="line"></hr>
-<h3 class="heading-1">Tomcat 4.1.x <a name="tomcat41"></a><a href="Running_the_Example_App#tomcat41.html" title="Permalink to tomcat41"></img></a>  <span class="nobr"></img><a href="#top">top</a></span>
-&#60;Egor Kobylkin egor.kobylkin@o2.com&#62;
-This is a quick stab on how to deploy osworkflow_example.war on Tomcat 4.1.x. (tested on 4.1.27)<p class="paragraph"></p>To deploy osworkflow_example.war, place it under the directory
-TOMCAT_HOME/webapps, startup and shutdown the server. (Ignore if you have already done it)<p class="paragraph"></p><i class="italic">Note that to run the demonstration there is no necessity to create a persistent store - the demonstration will run without it provided that the Tomcat server is not shut down</i><p class="paragraph"></p><b class="bold">Setting up persistence</b><p class="paragraph"></p>Put jboss-j2ee.jar into TOMCAT_HOME/common/endorsed (get it from JBoss.org) to enable EJB lookup.<p class="paragraph"></p>Next you have to make modifications to
-TOMCAT_HOME/conf/server.xml to include:
-<div class="wikicode"><pre>&#60;!&#45;&#45; OSWorkflow JNDI JDBC Data Source Example. egor.kobylkin@o2.com &#45;&#45;&#62;<p class="paragraph"></p>&#60;Context path=<span class="java&#45;quote">"/osworkflow_example"</span> docBase=<span class="java&#45;quote">"osworkflow&#45;2.6.0&#45;dev&#45;example"</span> debug= <span class="java&#45;quote">"99"</span> reloadable=<span class="java&#45;quote">"<span class="java&#45;keyword">true</span>"</span> crossContext=<span class="java&#45;quote">"<span class="java&#45;keyword">true</span>"</span><p class="paragraph"></p>verbosity=<span class="java&#45;quote">"DEBUG"</span>&#62;
-&#60;!&#45;&#45; debug level is set to paranoid, to know what is happening, turn it off once you <span class="java&#45;keyword">do</span> not need it &#45;&#45;&#62;<p class="paragraph"></p>&#60;Logger className=<span class="java&#45;quote">"org.apache.catalina.logger.FileLogger"</span> prefix=<span class="java&#45;quote">"OSWorkflow."</span> suffix=<span class="java&#45;quote">".log"</span> timestamp=<span class="java&#45;quote">"<span class="java&#45;keyword">true</span>"</span>/&#62;
-&#60;!&#45;&#45; put log4j.jar into TOMCAT_ROOT/webapp/osworkflow&#45;2.6.0&#45;dev&#45;example/WEB&#45;INF/lib <span class="java&#45;keyword">if</span> you want to use it <span class="java&#45;keyword">for</span> logging &#45;&#45;&#62;<p class="paragraph"></p>&#60;Resource name=<span class="java&#45;quote">"jdbc/DefaultDS"</span> auth=<span class="java&#45;quote">"Container"</span> type=<span class="java&#45;quote">"javax.sql.DataSource"</span>/&#62;
-&#60;!&#45;&#45; name=<span class="java&#45;quote">"jdbc/DefaultDS"</span> is used in other components of the Example App, <span class="java&#45;keyword">do</span> not change it here! &#45;&#45;&#62;<p class="paragraph"></p>&#60;ResourceParams name=<span class="java&#45;quote">"jdbc/DefaultDS"</span>&#62;
-  &#60;parameter&#62;
-    &#60;name&#62;factory&#60;/name&#62;
-    &#60;value&#62;org.apache.commons.dbcp.BasicDataSourceFactory&#60;/value&#62;
-  &#60;/parameter&#62;
-  &#60;parameter&#62;
-    &#60;name&#62;driverClassName&#60;/name&#62;
-    &#60;value&#62;oracle.jdbc.driver.OracleDriver&#60;/value&#62;
-  &#60;/parameter&#62;
-  &#60;parameter&#62;
-    &#60;name&#62;url&#60;/name&#62;
-    &#60;value&#62;jdbc:oracle:thin:@yourserver.com:port:SID&#60;/value&#62;
-  &#60;/parameter&#62;
-  &#60;parameter&#62;
-    &#60;name&#62;username&#60;/name&#62;
-    &#60;value&#62;your_database_user_name_here&#60;/value&#62;
-  &#60;/parameter&#62;
-  &#60;parameter&#62;
-    &#60;name&#62;password&#60;/name&#62;
-    &#60;value&#62;your_password_here&#60;/value&#62;
-  &#60;/parameter&#62;
-  &#60;parameter&#62;
-    &#60;name&#62;maxActive&#60;/name&#62;
-    &#60;value&#62;20&#60;/value&#62;
-  &#60;/parameter&#62;
-  &#60;parameter&#62;
-    &#60;name&#62;maxIdle&#60;/name&#62;
-    &#60;value&#62;10&#60;/value&#62;
-  &#60;/parameter&#62;
-  &#60;parameter&#62;
-    &#60;name&#62;maxWait&#60;/name&#62;
-    &#60;value&#62;&#45;1&#60;/value&#62;
-  &#60;/parameter&#62;
-&#60;/ResourceParams&#62;
-&#60;/Context&#62;<p class="paragraph"></p>&#60;!&#45;&#45; OSWorkflow JNDI Data Source &#45;&#45;&#62;</pre></div><p class="paragraph"></p>Some documentation on how to configure JNDI / JDBC data sources: 
+<div class="wikicode"><pre>README&#45;Tomcat.txt
+&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;
+This is a quick stab on how to deploy osworkflow_example.war on Tomcat 4.0.X.<p class="paragraph"></p>
+Setting up persistence
+&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;
+It is important to properly configure pooled datasource <span class="java&#45;keyword">for</span> good performance.<p class="paragraph"></p>Unfortunately, there is no good documentation on how to setup Tyrex in Tomcat
+4.0 and compounded by the fact that Tyrex will be deprecated begining in Tomcat
+version 4.1, there is no good way to improve performance under Tomcat 4.0.
+Nonetheless, there are documentation on how to configure Oracle pooled
+datasource factory in Tomcat 4.0.X. Refer to the urls
+<span class="nobr"></img><a href="http://www.apachelabs.org/tomcat&amp;#45;user/20020&amp;#91;3&amp;#45;7&amp;#93;.mbox/threads.html,">&#104;ttp://www.apachelabs.org/tomcat&amp;#45;user/20020&amp;#91;3&amp;#45;7&amp;#93;.mbox/threads.html,</a></span>
+<span class="java&#45;keyword">try</span> it out and let me know <span class="java&#45;keyword">if</span> you are successful. I've also attempted to
+use the LE version of Tomcat 4.0.4 (jakarta&#45;tomcat&#45;4.0.4&#45;LE&#45;jdk14.&#42;) without
+any luck (NPE), whereas the full version works fine <span class="java&#45;keyword">for</span> me.<p class="paragraph"></p>Please read the WAR Deployment section below and then come back here.<p class="paragraph"></p>It is important to copy the osworkflow_example.war into TOMCAT_HOME/webapps
+and startup and shutdown the server before making the modifications to
+TOMCAT_HOME/conf/server.xml to include:<p class="paragraph"></p>        &#60;!&#45;&#45; OSWorkflow Example Context &#45;&#45;&#62;
+        &#60;Context path=<span class="java&#45;quote">"/osworkflow_example"</span> 
+                 docBase=<span class="java&#45;quote">"osworkflow_example"</span> debug=<span class="java&#45;quote">"0"</span>
+                 reloadable=<span class="java&#45;quote">"<span class="java&#45;keyword">true</span>"</span> crossContext=<span class="java&#45;quote">"<span class="java&#45;keyword">true</span>"</span>&#62;
+	  &#60;Resource name=<span class="java&#45;quote">"jdbc/DefaultDS"</span> auth=<span class="java&#45;quote">"Container"</span>
+            type=<span class="java&#45;quote">"javax.sql.DataSource"</span>/&#62;
+	  &#60;ResourceParams name=<span class="java&#45;quote">"jdbc/DefaultDS"</span>&#62;
+            &#60;parameter&#62;&#60;name&#62;user&#60;/name&#62;&#60;value&#62;user&#60;/value&#62;&#60;/parameter&#62;
+            &#60;parameter&#62;&#60;name&#62;password&#60;/name&#62;&#60;value&#62;pass&#60;/value&#62;&#60;/parameter&#62;
+	    &#60;parameter&#62;
+	      &#60;name&#62;driverClassName&#60;/name&#62;
+	      &#60;!&#45;&#45; Oracle &#45;&#45;&#62;
+              &#60;value&#62;oracle.jdbc.driver.OracleDriver&#60;/value&#62;<p class="paragraph"></p>	      &#60;!&#45;&#45; Postgresql
+	      &#60;value&#62;org.postgresql.Driver&#60;/value&#62;
+	      &#45;&#45;&#62;
+	    &#60;/parameter&#62;
+	    &#60;parameter&#62;
+	      &#60;name&#62;driverName&#60;/name&#62;
+	      &#60;!&#45;&#45; Oracle &#45;&#45;&#62;
+	      &#60;value&#62;jdbc:oracle:thin:@hostname:port:SID&#60;/value&#62;<p class="paragraph"></p>	      &#60;!&#45;&#45; Postgresql
+	      &#60;value&#62;jdbc:postgresql://hostname:port/dbName&#60;/value&#62;
+	      &#45;&#45;&#62;
+	    &#60;/parameter&#62;
+	  &#60;/ResourceParams&#62;
+	&#60;/Context&#62;
+      &#60;/Host&#62;
+    &#60;/Engine&#62;
+  &#60;/Service&#62;<p class="paragraph"></p>Make sure your JDBC driver is in TOMCAT_HOME/common/lib. For oracle, you may
+need to rename classes12.zip into classes12.jar <span class="java&#45;keyword">for</span> it to work.<p class="paragraph"></p>In addition, modify the osworkflow.xml to reflect how to access sequence
+objects <span class="java&#45;keyword">for</span> your database.<p class="paragraph"></p>To use postgresql as the backend database, execute the file tables_postgres.sql
+against the database and make sure the following is defined in the file
+osworkflow.xml:<p class="paragraph"></p>        &#60;!&#45;&#45; Postgresql sequence access &#45;&#45;&#62;
+        &#60;property key=<span class="java&#45;quote">"entry.sequence"</span> value=<span class="java&#45;quote">"SELECT nextVal('seq_os_wfentry')"</span>/&#62;
+        &#60;property key=<span class="java&#45;quote">"step.sequence"</span> value=<span class="java&#45;quote">"SELECT nextVal('seq_os_currentsteps')"</span>/&#62;<p class="paragraph"></p>To use oracle as the backend database, execute the file tables_oracle.sql
+against the database and make sure the following is defined in the
+osworkflow.xml:<p class="paragraph"></p>        &#60;!&#45;&#45; Oracle sequence access &#45;&#45;&#62;
+        &#60;property key=<span class="java&#45;quote">"entry.sequence"</span> 
+                  value=<span class="java&#45;quote">"SELECT seq_os_wfentry.nextval FROM dual"</span>/&#62;
+        &#60;property key=<span class="java&#45;quote">"step.sequence"</span> 
+                  value=<span class="java&#45;quote">"SELECT seq_os_currentsteps.nextval FROM dual"</span>/&#62;<p class="paragraph"></p>
+WAR Deployment
+&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;
+To deploy osworkflow_example.war, place it under the directory
+TOMCAT_HOME/webapps, startup and shutdown the server. Then set up the
+persistence mechanism as outlined above. Next, modify the server.xml file to
+configure the data source as outlined above.<p class="paragraph"></p>Finally, restart the server. Then, go to <span class="nobr"></img><a href="http://localhost:8080/osworkflow_example">&#104;ttp://localhost:8080/osworkflow_example</a></span> 
+to access the sample application.</pre></div><p class="paragraph"></p><hr class="line"></hr>
+<h3 class="heading-1">Tomcat 4.1.x <a name="tomcat41"></a><a href="Running_the_Example_App#tomcat41.html" title="Permalink to tomcat41"></img></a>  <span class="nobr"></img><a href="#top">top</a></span>
+</h3>
+&#60;Egor Kobylkin egor.kobylkin@o2.com&#62;
+This is a quick stab on how to deploy osworkflow_example.war on Tomcat 4.1.x. (tested on 4.1.27)<p class="paragraph"></p>To deploy osworkflow_example.war, place it under the directory
+TOMCAT_HOME/webapps, startup and shutdown the server. (Ignore if you have already done it)<p class="paragraph"></p><i class="italic">Note that to run the demonstration there is no necessity to create a persistent store - the demonstration will run without it provided that the Tomcat server is not shut down</i><p class="paragraph"></p><b class="bold">Setting up persistence</b><p class="paragraph"></p>Put jboss-j2ee.jar into TOMCAT_HOME/common/endorsed (get it from JBoss.org) to enable EJB lookup.<p class="paragraph"></p>Next you have to make modifications to
+TOMCAT_HOME/conf/server.xml to include:
+<div class="wikicode"><pre>&#60;!&#45;&#45; OSWorkflow JNDI JDBC Data Source Example. egor.kobylkin@o2.com &#45;&#45;&#62;<p class="paragraph"></p>&#60;Context path=<span class="java&#45;quote">"/osworkflow_example"</span> docBase=<span class="java&#45;quote">"osworkflow&#45;2.6.0&#45;dev&#45;example"</span> 
+         debug= <span class="java&#45;quote">"99"</span> reloadable=<span class="java&#45;quote">"<span class="java&#45;keyword">true</span>"</span> crossContext=<span class="java&#45;quote">"<span class="java&#45;keyword">true</span>"</span><p class="paragraph"></p>verbosity=<span class="java&#45;quote">"DEBUG"</span>&#62;
+&#60;!&#45;&#45; debug level is set to paranoid, to know what is happening, 
+     turn it off once you <span class="java&#45;keyword">do</span> not need it &#45;&#45;&#62;<p class="paragraph"></p>&#60;Logger className=<span class="java&#45;quote">"org.apache.catalina.logger.FileLogger"</span>
+        prefix=<span class="java&#45;quote">"OSWorkflow."</span> suffix=<span class="java&#45;quote">".log"</span> timestamp=<span class="java&#45;quote">"<span class="java&#45;keyword">true</span>"</span>/&#62;
+&#60;!&#45;&#45; 
+    put log4j.jar into TOMCAT_ROOT/webapp/osworkflow&#45;2.6.0&#45;dev&#45;example/WEB&#45;INF/lib 
+    <span class="java&#45;keyword">if</span> you want to use it <span class="java&#45;keyword">for</span> logging 
+&#45;&#45;&#62;<p class="paragraph"></p>&#60;Resource name=<span class="java&#45;quote">"jdbc/DefaultDS"</span> auth=<span class="java&#45;quote">"Container"</span> type=<span class="java&#45;quote">"javax.sql.DataSource"</span>/&#62;
+&#60;!&#45;&#45; name=<span class="java&#45;quote">"jdbc/DefaultDS"</span> is used in other components of the 
+     Example App, <span class="java&#45;keyword">do</span> not change it here! &#45;&#45;&#62;<p class="paragraph"></p>&#60;ResourceParams name=<span class="java&#45;quote">"jdbc/DefaultDS"</span>&#62;
+  &#60;parameter&#62;
+    &#60;name&#62;factory&#60;/name&#62;
+    &#60;value&#62;org.apache.commons.dbcp.BasicDataSourceFactory&#60;/value&#62;
+  &#60;/parameter&#62;
+  &#60;parameter&#62;
+    &#60;name&#62;driverClassName&#60;/name&#62;
+    &#60;value&#62;oracle.jdbc.driver.OracleDriver&#60;/value&#62;
+  &#60;/parameter&#62;
+  &#60;parameter&#62;
+    &#60;name&#62;url&#60;/name&#62;
+    &#60;value&#62;jdbc:oracle:thin:@yourserver.com:port:SID&#60;/value&#62;
+  &#60;/parameter&#62;
+  &#60;parameter&#62;
+    &#60;name&#62;username&#60;/name&#62;
+    &#60;value&#62;your_database_user_name_here&#60;/value&#62;
+  &#60;/parameter&#62;
+  &#60;parameter&#62;
+    &#60;name&#62;password&#60;/name&#62;
+    &#60;value&#62;your_password_here&#60;/value&#62;
+  &#60;/parameter&#62;
+  &#60;parameter&#62;
+    &#60;name&#62;maxActive&#60;/name&#62;
+    &#60;value&#62;20&#60;/value&#62;
+  &#60;/parameter&#62;
+  &#60;parameter&#62;
+    &#60;name&#62;maxIdle&#60;/name&#62;
+    &#60;value&#62;10&#60;/value&#62;
+  &#60;/parameter&#62;
+  &#60;parameter&#62;
+    &#60;name&#62;maxWait&#60;/name&#62;
+    &#60;value&#62;&#45;1&#60;/value&#62;
+  &#60;/parameter&#62;
+&#60;/ResourceParams&#62;
+&#60;/Context&#62;<p class="paragraph"></p>&#60;!&#45;&#45; OSWorkflow JNDI Data Source &#45;&#45;&#62;</pre></div><p class="paragraph"></p>Some documentation on how to configure JNDI / JDBC data sources: 
 <ul class="star">
 <li><span class="nobr"></img><a href="http://jakarta.apache.org/tomcat/tomcat-4.1-doc/jndi-datasource-examples-howto.html">&#104;ttp://jakarta.apache.org/tomcat/tomcat-4.1-doc/jndi-datasource-examples-howto.html</a></span></li>
 <li><span class="nobr"></img><a href="http://jakarta.apache.org/tomcat/tomcat-4.1-doc/jndi-resources-howto.html">&#104;ttp://jakarta.apache.org/tomcat/tomcat-4.1-doc/jndi-resources-howto.html</a></span></li>
-</ul><p class="paragraph"></p>Make sure your JDBC driver is in TOMCAT_HOME/common/lib. For oracle, you may
-need to rename classes12.zip into classes12.jar for it to work. 
-For Oracle9 DB use only the JDBC thin driver of version 9 or higher.<p class="paragraph"></p>In addition, modify the osworkflow.xml to reflect how to access sequence
-objects for your database. <a href="Persistence_Options.html">Persistence Options</a> 
-Description of the entries in osworkflow.xml: <span class="nobr"></img><a href="http://www.opensymphony.com/osworkflow/api/com/opensymphony/workflow/spi/jdbc/JDBCWorkflowStore.html">&#104;ttp://www.opensymphony.com/osworkflow/api/com/opensymphony/workflow/spi/jdbc/JDBCWorkflowStore.html</a></span><p class="paragraph"></p>To use postgresql as the backend database, execute the file tables_postgres.sql
-against the database and make sure the following is defined in the file
-osworkflow.xml:
-<div class="wikicode"><pre>&#60;!&#45;&#45; Postgresql sequence access &#45;&#45;&#62;
-        &#60;property key=<span class="java&#45;quote">"entry.sequence"</span> value=<span class="java&#45;quote">"SELECT nextVal('seq_os_wfentry')"</span>/&#62;
-        &#60;property key=<span class="java&#45;quote">"step.sequence"</span> value=<span class="java&#45;quote">"SELECT nextVal('seq_os_currentsteps')"</span>/&#62;</pre></div>
-To use oracle as the backend database, execute the file tables_oracle.sql
-against the database (watch out for the missing comma in the file) and make sure the following is defined in the
-osworkflow.xml:
-<div class="wikicode"><pre>&#60;!&#45;&#45; Oracle sequence access &#45;&#45;&#62;
-        &#60;property key=<span class="java&#45;quote">"entry.sequence"</span> value=<span class="java&#45;quote">"SELECT seq_os_wfentry.nextval FROM dual"</span>/&#62;
-        &#60;property key=<span class="java&#45;quote">"step.sequence"</span> value=<span class="java&#45;quote">"SELECT seq_os_currentsteps.nextval FROM dual"</span>/&#62;</pre></div><p class="paragraph"></p>Finally, restart the server. Then, go to <span class="nobr"></img><a href="http://localhost:your_port/osworkflow_example">&#104;ttp://localhost:your_port/osworkflow_example</a></span> to access the sample application.</body></html>
+</ul><p class="paragraph"></p>Make sure your JDBC driver is in TOMCAT_HOME/common/lib. For oracle, you may
+need to rename classes12.zip into classes12.jar for it to work. 
+For Oracle9 DB use only the JDBC thin driver of version 9 or higher.<p class="paragraph"></p>In addition, modify the osworkflow.xml to reflect how to access sequence
+objects for your database. <a href="Persistence_Options.html">Persistence Options</a> 
+Description of the entries in osworkflow.xml: <span class="nobr"></img><a href="http://www.opensymphony.com/osworkflow/api/com/opensymphony/workflow/spi/jdbc/JDBCWorkflowStore.html">&#104;ttp://www.opensymphony.com/osworkflow/api/com/opensymphony/workflow/spi/jdbc/JDBCWorkflowStore.html</a></span><p class="paragraph"></p>To use postgresql as the backend database, execute the file tables_postgres.sql
+against the database and make sure the following is defined in the file
+osworkflow.xml:
+<div class="wikicode"><pre>&#60;!&#45;&#45; Postgresql sequence access &#45;&#45;&#62;
+        &#60;property key=<span class="java&#45;quote">"entry.sequence"</span> value=<span class="java&#45;quote">"SELECT nextVal('seq_os_wfentry')"</span>/&#62;
+        &#60;property key=<span class="java&#45;quote">"step.sequence"</span> value=<span class="java&#45;quote">"SELECT nextVal('seq_os_currentsteps')"</span>/&#62;</pre></div>
+To use oracle as the backend database, execute the file tables_oracle.sql
+against the database (watch out for the missing comma in the file) and make  sure the following is defined in the osworkflow.xml file:
+<div class="wikicode"><pre>&#60;!&#45;&#45; Oracle sequence access &#45;&#45;&#62;
+        &#60;property key=<span class="java&#45;quote">"entry.sequence"</span> 
+                  value=<span class="java&#45;quote">"SELECT seq_os_wfentry.nextval FROM dual"</span>/&#62;
+        &#60;property key=<span class="java&#45;quote">"step.sequence"</span> 
+                  value=<span class="java&#45;quote">"SELECT seq_os_currentsteps.nextval FROM dual"</span>/&#62;</pre></div><p class="paragraph"></p>Finally, restart the server. Then, go to <span class="nobr"></img><a href="http://localhost:your_port/osworkflow_example">&#104;ttp://localhost:your_port/osworkflow_example</a></span> to access 
+the sample application.</body></html>

docs/SOAP_Support.html

 <ul class="star">
 <li>Up to <a href="Documentation.html">Documentation</a></li>
 <li>Back to <a href="Conditions.html">Conditions</a></li>
-<li>Forward to <a href="Interface_choices.html">Interface choices</a></li>
-</ul><p class="paragraph"></p>OSWorkflow comes with support for remote invocation using SOAP. This is accomplished using the Glue SOAP implementation from <span class="nobr"></img><a href="http://www.themindelectric.com/">TheMindElectric</a></span>. It has not been tested with any other SOAP implementations, but getting C# to integrate in with OSWorkflow should be a fairly trivial task. We hope to include C# sample code in the near future. <b class="bold">If you wish to use an alternate SOAP implementation, such as Apache Axis, you are free to write your own wrappers to speak with OSWorkflow -- it should be very simple. However, we recommend GLUE as your SOAP provider of choice.</b><p class="paragraph"></p>GLUE does <b class="bold">not</b> come with OSWorkflow and must be downloaded separately from <span class="nobr"></img><a href="http://www.themindelectric.com/">TheMindElectric</a></span>. . GLUE is generally free for most usage. You can find the license agreement when you download GLUE. <b class="bold">Again, SOAP and Job Scheduling support will not be available if you do not download GLUE 2.1 or later and include GLUE-STD.jar in your classpath.</b><p class="paragraph"></p>SOAP support is optional and can only be enabled by including the Glue servlet in your web application, as detailed in the GLUE documentation. SOAP support <b class="bold">must</b> be enabled for scheduled jobs to occur, using the Quartz job scheduler. Here is some example code that uses Glue to talk to OSWorkflow:<p class="paragraph"></p><div class="wikicode"><pre><span class="java&#45;keyword">import</span> electric.util.Context;
-<span class="java&#45;keyword">import</span> electric.registry.Registry;
-<span class="java&#45;keyword">import</span> electric.registry.RegistryException;<p class="paragraph"></p>...<p class="paragraph"></p>Context context = <span class="java&#45;keyword">new</span> Context();
-context.setProperty( <span class="java&#45;quote">"authUser"</span>, username );
-context.setProperty( <span class="java&#45;quote">"authPassword"</span>, password );
-Workflow wf = (Workflow) Registry.bind(
+<li>Forward to <a href="Designer_Installation.html">Designer Installation</a></li>
+</ul><p class="paragraph"></p>OSWorkflow comes with support for remote invocation using SOAP. This is accomplished using the Glue SOAP implementation from <span class="nobr"></img><a href="http://www.themindelectric.com/">TheMindElectric</a></span>. It has not been tested with any other SOAP implementations, but getting C# to integrate in with OSWorkflow should be a fairly trivial task. We hope to include C# sample code in the near future. <b class="bold">If you wish to use an alternate SOAP implementation, such as Apache Axis, you are free to write your own wrappers to speak with OSWorkflow -- it should be very simple. However, we recommend GLUE as your SOAP provider of choice.</b><p class="paragraph"></p>GLUE does <b class="bold">not</b> come with OSWorkflow and must be downloaded separately from <span class="nobr"></img><a href="http://www.themindelectric.com/">TheMindElectric</a></span>. . GLUE is generally free for most usage. You can find the license agreement when you download GLUE. <b class="bold">Again, SOAP and Job Scheduling support will not be available if you do not download GLUE 2.1 or later and include GLUE-STD.jar in your classpath.</b><p class="paragraph"></p>SOAP support is optional and can only be enabled by including the Glue servlet in your web application, as detailed in the GLUE documentation. SOAP support <b class="bold">must</b> be enabled for scheduled jobs to occur, using the Quartz job scheduler. Here is some example code that uses Glue to talk to OSWorkflow:<p class="paragraph"></p><div class="wikicode"><pre><span class="java&#45;keyword">import</span> electric.util.Context;
+<span class="java&#45;keyword">import</span> electric.registry.Registry;
+<span class="java&#45;keyword">import</span> electric.registry.RegistryException;<p class="paragraph"></p>...<p class="paragraph"></p>Context context = <span class="java&#45;keyword">new</span> Context();
+context.setProperty( <span class="java&#45;quote">"authUser"</span>, username );
+context.setProperty( <span class="java&#45;quote">"authPassword"</span>, password );
+Workflow wf = (Workflow) Registry.bind(
   <span class="java&#45;quote">"http://localhost/osworkflow/glue/oswf.wsdl"</span>, Workflow.class, context);</pre></div><p class="paragraph"></p>From this point onward, you can use the Workflow interface just as you normally would.</body></html>

docs/Utility_Functions.html

 <li>Up to <a href="Documentation.html">Documentation</a></li>
 <li>Back to <a href="BSF_Functions.html">BSF Functions</a></li>
 <li>Forward to <a href="Validators.html">Validators</a></li>
-</ul><p class="paragraph"></p>OSWorkflow comes with several very useful utility functions, all implementing the interface <i class="italic">com.opensymphony.workflow.FunctionProvider</i>. For more detailed information, please see the javadocs for these utility functions. Below is only a brief description of each utility function. All classes are found in the <i class="italic">com.opensymphony.workflow.util</i> package. 
-<h3 class="heading-1">Caller
-<h3 class="heading-1">WebWorkExecutor
-<h3 class="heading-1">EJBInvoker
-<h3 class="heading-1">JMSMessage
-<h3 class="heading-1">MostRecentOwner
-<h3 class="heading-1">ScheduleJob
-<h3 class="heading-1">UnschduleJob
-<h3 class="heading-1">SendEmail
+</ul><p class="paragraph"></p>OSWorkflow comes with several very useful utility functions, all implementing the interface <i class="italic">com.opensymphony.workflow.FunctionProvider</i>. For more detailed information, please see the javadocs for these utility functions. Below is only a brief description of each utility function. All classes are found in the <i class="italic">com.opensymphony.workflow.util</i> package. 
+<h3 class="heading-1">Caller
+</h3><p class="paragraph"></p>Sets the persistent variable caller with the username of the person doing the current action.
+<h3 class="heading-1">WebWorkExecutor
+</h3><p class="paragraph"></p>Executes a WebWork function and restores the old ActionContext when finished.
+<h3 class="heading-1">EJBInvoker
+</h3><p class="paragraph"></p>Invokes an EJB session bean method. Please see the javadocs for more information about expected arguments and EJB restrictions.
+<h3 class="heading-1">JMSMessage
+</h3><p class="paragraph"></p>Sends a TextMessage to a JMS topic or queue.
+<h3 class="heading-1">MostRecentOwner
+</h3><p class="paragraph"></p>Sets the persistent variable <b class="bold">mostRecentOwner</b> with the username of the owner of the most recent step specified. Optional features allow for the variable be set to nothing if no owner is found, or to return with an internal error.
+<h3 class="heading-1">ScheduleJob
+</h3><p class="paragraph"></p>Schedules a <a href="trigger_function.html">trigger function</a> to be executed at some time later. Supports both <b class="bold">cron expressions</b> and <b class="bold">simple repeat/delay counts</b>. 
+<h3 class="heading-1">UnschduleJob
+</h3><p class="paragraph"></p>Deletes a scheduled job and all triggers associated with that job. This is useful in the case where the workflow state has changed such that you no longer wish for scheduled jobs to occur.
+<h3 class="heading-1">SendEmail
+</h3><p class="paragraph"></p>Sends out an email to one or more users.</body></html>

docs/Validators.html

 <li>Up to <a href="Documentation.html">Documentation</a></li>
 <li>Back to <a href="Utility_Functions.html">Utility Functions</a></li>
 <li>Forward to <a href="Registers.html">Registers</a></li>
-</ul><p class="paragraph"></p>Just like <a href="Functions.html">Functions</a>, OSWorkflow allows for validators in three different forms: <b class="bold">Java-based</b>, <b class="bold">BeanShell</b>, and <b class="bold">BSF</b>. Java-based validators must implement the <b class="bold">com.opensymphony.workflow.Validator</b> interface (or in the case of <b class="bold">remote-ejb</b>'s, the <b class="bold">com.opensymphony.workflow.ValidatorRemote</b> interface). With Java-based validators, throwing an InvalidInputException is all that is needed to mark an input as invalid and stop the workflow action from occuring.<p class="paragraph"></p>But in BeanShell and BSF, things are a little different, since exceptions thrown in the scripts can't propogate out to the Java runtime environment. To get around this, any value returned in a BeanShell or BSF script will be used as the error message(s). The logic is as follows:
+</ul><p class="paragraph"></p>Just like <a href="Functions.html">Functions</a>, OSWorkflow allows for validators in three different forms: <b class="bold">Java-based</b>, <b class="bold">BeanShell</b>, and <b class="bold">BSF</b>. Java-based validators must implement the <b class="bold">com.opensymphony.workflow.Validator</b> interface (or in the case of <b class="bold">remote-ejb</b>'s, the <b class="bold">com.opensymphony.workflow.ValidatorRemote</b> interface). With Java-based validators, throwing an InvalidInputException is all that is needed to mark an input as invalid and stop the workflow action from occuring.<p class="paragraph"></p>But in BeanShell and BSF, things are a little different, since exceptions thrown in the scripts can't propogate out to the Java runtime environment. To get around this, any value returned in a BeanShell or BSF script will be used as the error message(s). The logic is as follows:
 <ul class="minus">
 <li>If the value returned is an InvalidInputException object, that object is immediately thrown to the client</li>
 <li>If the value returned is a Map, that Map is used for the error/errorMessage pairs in the InvalidInputException</li>

docs/Workflow_Concepts.html

 <li>Up to <a href="Documentation.html">Documentation</a></li>
 <li>Back to <a href="Workflow_Definition.html">Workflow Definition</a></li>
 <li>Forward to <a href="Functions.html">Functions</a></li>
-</ul><p class="paragraph"></p>OSWorkflow is very unique compared to other workflow engines one might be familiar with. In order to completely grasp OSWorkflow and properly harness the features available, it is important that one understand the core concepts that form the foundation for OSWorkflow.
-<h3 class="heading-1">Steps, Status, and Actions
-<h3 class="heading-1">Results, Joins, and Splits
+</ul><p class="paragraph"></p>OSWorkflow is very unique compared to other workflow engines one might be familiar with. In order to completely grasp OSWorkflow and properly harness the features available, it is important that one understand the core concepts that form the foundation for OSWorkflow.
+<h3 class="heading-1">Steps, Status, and Actions
+</h3><p class="paragraph"></p>Any particular <i class="italic">workflow instance</i> can have one or more <i class="italic">current steps</i> at any given moment. Every current step has a <i class="italic">status value</i> associated to it. Status values of the current steps constitute <i class="italic">workflow status</i> for that workflow instance. <b class="bold">The actual status values are entirely up to the application developer and/or project manager</b>. A status value can be, for example "Underway", or "Queued".<p class="paragraph"></p>For the workflow to progress, a <i class="italic">transition</i> must take place in the finite state machine that represents a workflow instance. Once a step is completed it can not be current anymore. Usually a new current step is created immediately thereafter, which keeps the workflow going. The final status value of the completed step is set by the <b class="bold">old-status</b> attribute. It happens just before the transition to another step. <i class="italic">Old-status</i> must already be defined when a new transition takes place in the workflow. <i class="italic">It can be any value you please, but "Finished" usually works fine for most applications</i>.<p class="paragraph"></p><i class="italic">Transition</i> itself is a result of an <i class="italic">action</i>. A step may have many actions connected to it. Which particular action will be launched is determined by the end user, external event or automatically by a trigger. Depending on the action accomplished, a certain transition takes place. Actions can be restricted to particular groups and users or current state of the workflow. Each action must have one <i class="italic">unconditional result</i> (default) and zero or more <i class="italic">conditional results</i>.<p class="paragraph"></p>So, to summarize, a workflow consists of a number of Steps. A step has a current status (for example, Queued, Underway, or Finished). A step has a number of Actions that can be performed in it. An action has Conditions under which it is available, as well as Functions that are executed. Actions have results that change the state and current step of the workflow.
+<h3 class="heading-1">Results, Joins, and Splits
+</h3><p class="paragraph"></p>1.1. Unconditional Result<p class="paragraph"></p>For every action, it is required that there exist one result, called the unconditional-result. A result is nothing more than a series of directives that tell OSWorkflow what the next task to do is. This involves making a transition from one state to the next state(s) in the state machine that makes up a given workflow.<p class="paragraph"></p>1.2. Conditional Results<p class="paragraph"></p>A conditional result is an extension of an unconditional result. It is identical, except for the fact that it requires one or more additional sub-elements: <b class="bold">condition</b>. The first conditional result that evaluates to true (using the types <b class="bold">AND</b> or <b class="bold">OR</b>) will dictate the transition that takes place due to the result of any given action taken by the user. Additional information regarding conditions can be found below.<p class="paragraph"></p>1.3. There are three different results (conditional or unconditional) that can occur:
 <ul class="star">
 <li>A new single step/status combo</li>
 <li>A split in to two or more step/status combos</li>
 <li>A join that joins together this transition as well as others to a new single step/status combo</li>
-</ul><p class="paragraph"></p>Depending on what kind of behavior you are looking for, your XML workflow descriptor will look different. Please read the DTD (which provides documentation as well) in <span class="nobr"></img><a href="http://www.opensymphony.com/osworkflow/workflow_2_5.dtd">Appendix A</a></span> for more information. <b class="bold">One caveat: currently a split or a join cannot result in an immediate split or join again</b>.<p class="paragraph"></p>1.3.1. A single step/status result can be specified simply by:<p class="paragraph"></p><div class="wikicode"><pre>&#60;unconditional&#45;result old&#45;status=<span class="java&#45;quote">"Finished"</span> step=<span class="java&#45;quote">"2"</span> status=<span class="java&#45;quote">"Underway"</span> owner=<span class="java&#45;quote">"$&#123;someOwner&#125;"</span>/&#62;</pre></div><p class="paragraph"></p>If the status is not Queued, then a third requirement is the owner of the new step. Besides specifying information about the next state, results also can specify <i class="italic">validators</i> and <i class="italic">post-functions</i>. These will be discussed below.<p class="paragraph"></p>1.3.2. Splitting from one state to multiple states can be achieved by:<p class="paragraph"></p><div class="wikicode"><pre>&#60;unconditional&#45;result split=<span class="java&#45;quote">"1"</span>/&#62;
-...
-&#60;splits&#62;
-  &#60;split id=<span class="java&#45;quote">"1"</span>&#62;
-    &#60;unconditional&#45;result old&#45;status=<span class="java&#45;quote">"Finished"</span> step=<span class="java&#45;quote">"2"</span> status=<span class="java&#45;quote">"Underway"</span> owner=<span class="java&#45;quote">"$&#123;someOwner&#125;"</span>/&#62;
-    &#60;unconditional&#45;result old&#45;status=<span class="java&#45;quote">"Finished"</span> step=<span class="java&#45;quote">"2"</span> status=<span class="java&#45;quote">"Underway"</span> owner=<span class="java&#45;quote">"$&#123;someOtherOwner&#125;"</span>/&#62;
-  &#60;/split&#62;
-&#60;/splits&#62;</pre></div><p class="paragraph"></p>1.3.3. Joins are the most complex cases. A typical join might look like:<p class="paragraph"></p><div class="wikicode"><pre>&#60;!&#45;&#45; <span class="java&#45;keyword">for</span> step id 6 &#45;&#45;&#62;
-&#60;unconditional&#45;result join=<span class="java&#45;quote">"1"</span>/&#62;
-...
-&#60;!&#45;&#45; <span class="java&#45;keyword">for</span> step id 8 &#45;&#45;&#62;
-&#60;unconditional&#45;result join=<span class="java&#45;quote">"1"</span>/&#62;
-...
-&#60;joins&#62;
-	&#60;join id=<span class="java&#45;quote">"1"</span>&#62;
-		&#60;join id=<span class="java&#45;quote">"1"</span>&#62;
-			&#60;conditions type=<span class="java&#45;quote">"AND"</span>&#62;
-				&#60;condition type=<span class="java&#45;quote">"beanshell"</span>&#62;
-					&#60;arg name=<span class="java&#45;quote">"script"</span>&#62;
-					<span class="java&#45;quote">"Finished"</span>.equals(jn.getStep(6).getStatus() 
-					&& <span class="java&#45;quote">"Finished"</span>.equals(jn.getStep(8).getStatus())
-					&#60;/arg&#62;
-				&#60;/condition&#62;
-			&#60;/conditions&#62;
-		&#60;/join&#62;
-		&#60;unconditional&#45;result old&#45;status=<span class="java&#45;quote">"Finished"</span> status=<span class="java&#45;quote">"Underway"</span> owner=<span class="java&#45;quote">"test"</span> step=<span class="java&#45;quote">"2"</span>/&#62;
-	&#60;/join&#62;
-&#60;/joins&#62;</pre></div><p class="paragraph"></p>The above might seem somewhat cryptic, but the main thing to notice is that the <b class="bold">condition element</b> uses a special variable <b class="bold">"jn"</b> that can be used to make up expressions that determine when the join actually occurs. Essentially, this expression statement says <b class="bold">"proceed with the join when the steps with IDs 6 and 8 that are transitioning to this join have a status of Finished".</b> 
-<h3 class="heading-1">External Functions
-<h3 class="heading-1">Trigger Functions
-<h3 class="heading-1">Validators
-<h3 class="heading-1">Registers
-	&#60;register name=<span class="java&#45;quote">"doc"</span> class=<span class="java&#45;quote">"com.acme.DocumentRegister"</span>/&#62;
-&#60;/registers&#62;
-...
-&#60;results&#62;
-	&#60;result condition=<span class="java&#45;quote">"doc.priority == 1"</span> step=<span class="java&#45;quote">"1"</span> status=<span class="java&#45;quote">"Underway"</span> owner=<span class="java&#45;quote">"$&#123;someManager&#125;"</span>/&#62;
-	&#60;unconditional&#45;result step=<span class="java&#45;quote">"1"</span> status=<span class="java&#45;quote">"Queued"</span>/&#62;
-&#60;/results&#62;
-...</pre></div>
-<h3 class="heading-1">Conditions
-<h3 class="heading-1">Variable Interpolation
-&#60;arg name=<span class="java&#45;quote">"bar"</span>&#62; $&#123;someDate&#125; &#60;/arg&#62; &#60;!&#45;&#45; note the extra spaces &#45;&#45;&#62;</pre></div>
-<h3 class="heading-1">Permissions and Restrictions
-<h3 class="heading-1">Auto actions
-<h3 class="heading-1">Integrating with Abstract Entities
-<h3 class="heading-1">Workflow Instance State (Available in OSWorkflow 2.6+)
+</ul><p class="paragraph"></p>Depending on what kind of behavior you are looking for, your XML workflow descriptor will look different. Please read the DTD (which provides documentation as well) in <span class="nobr"></img><a href="http://www.opensymphony.com/osworkflow/workflow_2_6.dtd">Appendix A</a></span> for more information. <b class="bold">One caveat: currently a split or a join cannot result in an immediate split or join again</b>.<p class="paragraph"></p>1.3.1. A single step/status result can be specified simply by:<p class="paragraph"></p><div class="wikicode"><pre>&#60;unconditional&#45;result old&#45;status=<span class="java&#45;quote">"Finished"</span> step=<span class="java&#45;quote">"2"</span> 
+                      status=<span class="java&#45;quote">"Underway"</span> owner=<span class="java&#45;quote">"$&#123;someOwner&#125;"</span>/&#62;</pre></div><p class="paragraph"></p>If the status is not Queued, then a third requirement is the owner of the new step. Besides specifying information about the next state, results also can specify <i class="italic">validators</i> and <i class="italic">post-functions</i>. These will be discussed below.<p class="paragraph"></p>1.3.2. Splitting from one state to multiple states can be achieved by:<p class="paragraph"></p><div class="wikicode"><pre>&#60;unconditional&#45;result split=<span class="java&#45;quote">"1"</span>/&#62;
+...
+&#60;splits&#62;
+  &#60;split id=<span class="java&#45;quote">"1"</span>&#62;
+    &#60;unconditional&#45;result old&#45;status=<span class="java&#45;quote">"Finished"</span> step=<span class="java&#45;quote">"2"</span> 
+                          status=<span class="java&#45;quote">"Underway"</span> owner=<span class="java&#45;quote">"$&#123;someOwner&#125;"</span>/&#62;
+    &#60;unconditional&#45;result old&#45;status=<span class="java&#45;quote">"Finished"</span> step=<span class="java&#45;quote">"2"</span> 
+                          status=<span class="java&#45;quote">"Underway"</span> owner=<span class="java&#45;quote">"$&#123;someOtherOwner&#125;"</span>/&#62;
+  &#60;/split&#62;
+&#60;/splits&#62;</pre></div><p class="paragraph"></p>1.3.3. Joins are the most complex cases. A typical join might look like:<p class="paragraph"></p><div class="wikicode"><pre>&#60;!&#45;&#45; <span class="java&#45;keyword">for</span> step id 6 &#45;&#45;&#62;
+&#60;unconditional&#45;result join=<span class="java&#45;quote">"1"</span>/&#62;
+...
+&#60;!&#45;&#45; <span class="java&#45;keyword">for</span> step id 8 &#45;&#45;&#62;
+&#60;unconditional&#45;result join=<span class="java&#45;quote">"1"</span>/&#62;
+...
+&#60;joins&#62;
+  &#60;join id=<span class="java&#45;quote">"1"</span>&#62;
+    &#60;join id=<span class="java&#45;quote">"1"</span>&#62;
+    &#60;conditions type=<span class="java&#45;quote">"AND"</span>&#62;
+      &#60;condition type=<span class="java&#45;quote">"beanshell"</span>&#62;
+        &#60;arg name=<span class="java&#45;quote">"script"</span>&#62;
+          <span class="java&#45;quote">"Finished"</span>.equals(jn.getStep(6).getStatus() 
+          && <span class="java&#45;quote">"Finished"</span>.equals(jn.getStep(8).getStatus())
+        &#60;/arg&#62;
+      &#60;/condition&#62;
+    &#60;/conditions&#62;
+  &#60;/join&#62;
+  &#60;unconditional&#45;result old&#45;status=<span class="java&#45;quote">"Finished"</span> status=<span class="java&#45;quote">"Underway"</span> owner=<span class="java&#45;quote">"test"</span> step=<span class="java&#45;quote">"2"</span>/&#62;
+  &#60;/join&#62;
+&#60;/joins&#62;</pre></div><p class="paragraph"></p>The above might seem somewhat cryptic, but the main thing to notice is that the <b class="bold">condition element</b> uses a special variable <b class="bold">"jn"</b> that can be used to make up expressions that determine when the join actually occurs. Essentially, this expression statement says <b class="bold">"proceed with the join when the steps with IDs 6 and 8 that are transitioning to this join have a status of Finished".</b> 
+<h3 class="heading-1">External Functions
+</h3><p class="paragraph"></p>OSWorkflow defines a standard way for external business logic and services to be defined and executed. This is accomplished by using "functions". A function usually encapsulates functionality that is external to the workflow instance itself, perhaps related to updating an external entity or system with workflow information, or notifying an external system regarding a change in workflow status.<p class="paragraph"></p><i class="italic">There are two types of functions: pre and post step functions.</i><p class="paragraph"></p>Pre functions are functions that are executed before the workflow makes a particular transition. An example is a pre function that sets up the name of the caller to use as the result for the state change that is about to take place. Another example of a pre-function is a function that updates the most recent caller of an action. Both of these are provided as standard utility functions that are very useful for practical workflows.<p class="paragraph"></p>Post functions have the same range of applicability as pre functions, except that they are executed after the state change has taken place. An example of a post function is one that sends out an email to interested parties that the workflow has had a particular action performed on it. For example, when a document in the 'research' step has a 'markReadyForReview' action taken, the reviewers group is emailed.<p class="paragraph"></p>There are many reasons for including pre and post functions. One is that if the user were to click the "done" button twice and to send out two "execute action" calls, and that action had a pre function that took a long time to finish, then it is possible the long function could get called multiple times, because the transition hasn't been made yet, and OSWorkflow thinks the second call to perform the action is valid. So changing that function to be a post function is what has to happen. <i class="italic">Generally pre functions are for simple, quick executions, and post are where the "meat" goes.</i><p class="paragraph"></p>You can find more information on <a href="Functions.html">Functions</a>.
+<h3 class="heading-1">Trigger Functions
+</h3><p class="paragraph"></p>Trigger functions are just like any other function, except that they aren't associated with only one action. They are also identified with a unique ID that is used at a later time (when a trigger is fired) to be executed by the Quartz job scheduler (or any other job scheduler). These functions usually run under the context of a system user and not a regular user working in the workflow. Trigger functions are invoked by using the OSWorkflow API from an outside source, such as a job scheduler like Quartz.<p class="paragraph"></p>You can find more information on <a href="trigger_function.html">trigger function</a>.
+<h3 class="heading-1">Validators
+</h3><p class="paragraph"></p>A validator is nothing more than some code that validates the input that can be paired with an action. If the input is deemed to be valid, according to the validator, the action will be executed. If the input is invalid, the <i class="italic">InvalidInputException</i> will be thrown back to the calling client -- usually a JSP or servlet.<p class="paragraph"></p>Validators follow many of the same rules as Functions. You can find out more about <a href="Validators.html">Validators</a>.
+<h3 class="heading-1">Registers
+</h3><p class="paragraph"></p>A register is a helper function that returns an object that can be used in Functions for easy access to common objects, especially entities that revolve around the workflow. The object being registered can be any kind of object. Typical examples of objects being registered are: Document, Metadata, Issue, and Task. This is strictly for convenience and does not add any extra benefit to OSWorkflow besides making the developer's life much simpler. Here is an example of a register:<p class="paragraph"></p><div class="wikicode"><pre>&#60;registers&#62;
+	&#60;register name=<span class="java&#45;quote">"doc"</span> class=<span class="java&#45;quote">"com.acme.DocumentRegister"</span>/&#62;
+&#60;/registers&#62;
+...
+&#60;results&#62;
+	&#60;result condition=<span class="java&#45;quote">"doc.priority == 1"</span> step=<span class="java&#45;quote">"1"</span> status=<span class="java&#45;quote">"Underway"</span> owner=<span class="java&#45;quote">"$&#123;someManager&#125;"</span>/&#62;
+	&#60;unconditional&#45;result step=<span class="java&#45;quote">"1"</span> status=<span class="java&#45;quote">"Queued"</span>/&#62;
+&#60;/results&#62;
+...</pre></div>
+<h3 class="heading-1">Conditions
+</h3><p class="paragraph"></p>Conditions, just like validators, registers, and functions, can be implemented in a variety of languages and technologies. Conditions can be grouped together using <b class="bold">AND</b> or <b class="bold">OR</b> logic. Any other kind of complex login must be implemented by the workflow developer. Conditions usually associated with conditional results, where a result is executed based on the conditions imposed on it being satisfied.<p class="paragraph"></p>Conditions are very similar to functions except that they return <b class="bold">boolean</b> instead of <b class="bold">void</b>. You can find out more about <a href="Conditions.html">Conditions</a>.
+<h3 class="heading-1">Variable Interpolation
+</h3><p class="paragraph"></p>In all functions, conditions, validators, and registers it is possible to provide a set of <b class="bold">args</b> to the code of choice. These args are translated to the <b class="bold">args Map</b> that is discussed in further detail later on. Likewise the <b class="bold">status, old-status, and owner elements</b> in the workflow descriptor are also all parsed for variables to be dynamically converted. A variable is identified when it looks like <b class="bold">${foo}</b>. OSWorkflow recognizes this form and first looks in the <b class="bold">transientVars</b> for the key foo. If the key does not exist as a transient variable, then then  <b class="bold">propertySet</b> is searched. If the propertyset does not contain the specified key either, then the entire variable is converted to an empty String.<p class="paragraph"></p>One thing of particular importance is that in the case of <b class="bold">args</b>, if the variable is the only argument, the argument will not be of type String, but instead whatever the variable type is. However, if the arg is a mix of characters and variables, the entire argument is converted to String no matter what. That means the two arguments below are very different in that foo is a Date object and bar is a String:<p class="paragraph"></p><div class="wikicode"><pre>&#60;arg name=<span class="java&#45;quote">"foo"</span>&#62;$&#123;someDate&#125;&#60;/arg&#62;
+&#60;arg name=<span class="java&#45;quote">"bar"</span>&#62; $&#123;someDate&#125; &#60;/arg&#62; &#60;!&#45;&#45; note the extra spaces &#45;&#45;&#62;</pre></div>
+<h3 class="heading-1">Permissions and Restrictions
+</h3><p class="paragraph"></p><i class="italic">Permissions</i> can be assigned to users and/or groups based on the state of the workflow instance. These permissions are unrelated to the functionality of the workflow engine, but they are useful to have for applications that implement OSWorkflow. For example, a document management system might have the permission name "file-write-permission" enabled for a particular group only during the "Document Edit" stage of the workflow. That way your application can use the API to determine if files can be modified or not. This is useful as there could be a number of states within the workflow where the "file-write-permission" is applicable, so instead of checking for specific steps or conditions, the check can simply be made for a particular permission.<p class="paragraph"></p>Permissions and actions both use the concept of <i class="italic">restrictions</i>. <b class="bold">A restriction is nothing more than one or more conditions embedded inside a restrict-to element.</b> 
+<h3 class="heading-1">Auto actions
+</h3><p class="paragraph"></p>Sometimes it is desirable to have an action performed automatically, based on specific conditions. This is useful for example when trying to add automation to a workflow. In order to achieve this, an attribute of <b class="bold">auto="true"</b> will have to be added to the specific action. The workflow engine will then evaluate the conditions and restrictions on the action, and if they are matched and the workflow <b class="bold">could</b> perform the action, then it automatically does so. The auto action executes with the current caller, so the permissions checks and so on are performed against the user who called the action that initiated the auto action.
+<h3 class="heading-1">Integrating with Abstract Entities
+</h3><p class="paragraph"></p>Because OSWorkflow is not an out-of-the-box solution, some development work is required to make your project work correctly with OSWorkflow. It is recommended that your core entity, such as "Document" or "Order", be given a new attribute: <i class="italic">workflowId</i>. That way when a new Document or Order is created, it can be associated with a workflow instance also. Then your code can look up that workflow instance and retrieve workflow information and/or issue workflow actions via the OSWorkflow API.
+<h3 class="heading-1">Workflow Instance State (Available in OSWorkflow 2.6+)
+</h3><p class="paragraph"></p>Sometimes it is helpful to specify a state to the workflow instance as a whole, independent to its progression or its steps. OSWorkflow offers a number of such "meta-states" that a workflow instance can be in. These are <b class="bold">CREATED</b>, <b class="bold">ACTIVATED</b>, <b class="bold">SUSPENDED</b>, <b class="bold">KILLED</b>, and <b class="bold">COMPLETED</b>. When a workflow instance is first created, it is in the <b class="bold">CREATED</b> state. Then as soon as an action is performed on it, it moves automatically to the <b class="bold">ACTIVATED</b> state. If the caller does not explicitly alters the instance state, the workflow will remain in this state until it is unambigiously completed. This is defined to be the case when the workflow cannot possibly perform any further actions. In this case, the workflow will automatically move to the <b class="bold">COMPLETED</b> state.<p class="paragraph"></p>However, while the workflow is in the <b class="bold">ACTIVATED</b> state, a caller can termined or suspend the workflow (set the state to <b class="bold">KILLED</b> or <b class="bold">SUSPENDED</b>). A terminated workflow will not be able to progress any further, and will remain in the state it was in at the time of termination forever. A workflow that has been suspended will be 'frozen' and no actions can be performed on it, until it is explicitly returned back to the <b class="bold">ACTIVATED</b> state.</body></html>

docs/Workflow_Definition.html

 <li>Up to <a href="Documentation.html">Documentation</a></li>
 <li>Back to <a href="Integration_with_Other_Modules.html">Integration with Other Modules</a></li>
 <li>Forward to <a href="Workflow_Concepts.html">Workflow Concepts</a></li>
-</ul><p class="paragraph"></p>At the heart of OSWorkflow is the workflow definition descriptor. The descriptor is an XML file (although it doesn't have to be, but XML is the format supported out of the box).<p class="paragraph"></p>This descriptor describes all the steps, states, transitions, and functionality for a given workflow.
+</ul><p class="paragraph"></p>At the heart of OSWorkflow is the workflow definition descriptor. The descriptor is an XML file (although it doesn't have to be, but XML is the format supported out of the box).<p class="paragraph"></p>This descriptor describes all the steps, states, transitions, and functionality for a given workflow.
 <ul class="minus">
 <li>A workflow consists of multiple steps to represent the flow.</li>
-<li>For the current step, there may be multiple actions. An action may be set to run automatically or be selected to be run programmatically through user interaction.</li>
+<li>For the current step, there may be multiple actions. An action may be set to run automatically or be selected to be run programmatically through user interaction.</li>
 <li>Each action has at least one unconditional result and zero or more conditional results.</li>
 <li>If multiple conditional results are specified, the first result for which all conditions are met is executed. If no conditional results are specified, or if no conditions are satisfied, then the unconditional result is executed.</li>
 <li>A result might remain in the current step, reference a new step, reference a split, or reference a join. In all cases, the state of the workflow can also change (example workflow states are Underway, Queued, and Finished).</li>
-<li>If a result causes a split, the result specifies a split attribute which points to a split element that defines the splits.</li>
+<li>If a result causes a split, the result specifies a split attribute which points to a split element that defines the splits.</li>
 <li>A split may have one or more unconditional results, but no conditional results. The unconditional results reference the steps coming from the split.</li>
+<li>A register is a global variable, that is resolved for every workflow invocation and is always available to all functions and conditions.</li>
+<li>A propertyset is a map of persistent data that is available globally.</li>
+<li>A map called 'transientVars' is a map of transient data that is available to all functions and conditions that includes all registers, user inputs, as well as the current workflow context and state. It exists only during the lifetime of a workflow invocation.</li>
 </ul></body></html>

docs/trigger_function.html

 <html><head><title>trigger function</title></head><body>
-Trigger function(s) are defined in workflow definition xml file. 
+Trigger function(s) are defined in workflow definition xml file. 
 Parent-child relationships are specified in the <span class="nobr"></img><a href="http://www.opensymphony.com/osworkflow/workflow_2_5.dtd">&#104;ttp://www.opensymphony.com/osworkflow/workflow_2_5.dtd</a></span><p class="paragraph"></p>Description of the <i class="italic">trigger function</i> can be found in <a href="Workflow_Concepts.html">Workflow Concepts</a>, and a usage suggestion in <a href="Utility_Functions.html">Utility Functions</a> page. Currently there is no trigger function example included in osworkflow-2.5.0-example workflow definition example.xml file, you have to add it yourself if you want to test it with Quartz scheduler code.</body></html>
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.