Author: julien(a)jboss.com
Date: 2007-01-09 08:41:06 -0500 (Tue, 09 Jan 2007)
New Revision: 5969
Modified:
trunk/core/build.xml
trunk/workflow/build.log
trunk/workflow/build.sh
trunk/workflow/build.xml
trunk/workflow/src/main/org/jboss/portal/workflow/WorkflowException.java
trunk/workflow/src/main/org/jboss/portal/workflow/cms/ApprovePublish.java
trunk/workflow/src/main/org/jboss/portal/workflow/cms/ApprovePublishImpl.java
trunk/workflow/src/main/org/jboss/portal/workflow/cms/ApprovePublishServlet.java
trunk/workflow/src/main/org/jboss/portal/workflow/cms/Content.java
trunk/workflow/src/main/org/jboss/portal/workflow/cms/TaskExceptionHandler.java
trunk/workflow/src/main/org/jboss/portal/workflow/test/Finalize.java
trunk/workflow/src/main/org/jboss/portal/workflow/test/HelloWorldDbTest.java
trunk/workflow/src/main/org/jboss/portal/workflow/test/PortalCMSPublish.java
trunk/workflow/src/main/org/jboss/portal/workflow/test/PublishAssignmentHandler.java
trunk/workflow/src/resources/portal-workflow-sar/META-INF/jboss-service.xml
Log:
added workflow module / make workflow reuse existing JNDI binder and common libraries /
fixes deployment cache issue in core
Modified: trunk/core/build.xml
===================================================================
--- trunk/core/build.xml 2007-01-09 00:35:52 UTC (rev 5968)
+++ trunk/core/build.xml 2007-01-09 13:41:06 UTC (rev 5969)
@@ -134,7 +134,7 @@
<path refid="jboss.portal-theme.classpath"/>
<path refid="jboss.portal-security.classpath"/>
<path refid="jboss.portal-test.classpath"/>
- <path refid="jboss.portal-workflow.classpath"/>
+ <path refid="jboss.portal-workflow.classpath"/>
</path>
<!--+=======================================+-->
Modified: trunk/workflow/build.log
===================================================================
--- trunk/workflow/build.log 2007-01-09 00:35:52 UTC (rev 5968)
+++ trunk/workflow/build.log 2007-01-09 13:41:06 UTC (rev 5969)
@@ -1,72 +1,51 @@
-
-configure:
-Overriding previous definition of reference to apache.ant.classpath
-
-configure-modules:
-
-configure-defaults:
-Overriding previous definition of reference to javac.classpath
-
-configure-tools:
-
-_configure:jbossaop:task:
-
-_configure:xdoclet:task:
-
-_configure:xdoclet:ejbdoclet:
-
-_configure:xdoclet:jmxdoclet:
-
-init:
-
-tests:
- [echo]
-
build.reports=C:\projects\core-portal\jboss-portal-trunk\workflow/output/reports
- test.reports=C:\projects\core-portal\jboss-portal-trunk\workflow/output/tests
- module.output=C:\projects\core-portal\jboss-portal-trunk\workflow/output
-
driver.path=C:\projects\core-portal\jboss-portal-trunk/thirdparty/hsqldb/lib//hsqldb.jar
- junit.printsummary=true
- junit.batchtest.haltonerror=false
- junit.batchtest.haltonfailure=false
- junit.batchtest.fork=true
- junit.timeout=600000
- junit.jvm=java
- junit.jvm.options=-Ddummy
- junit.formatter.usefile=true
-
- [mkdir] Created dir:
C:\projects\core-portal\jboss-portal-trunk\workflow\output\reports
- [mkdir] Created dir:
C:\projects\core-portal\jboss-portal-trunk\workflow\output\tests
- [junit_] Running org.jboss.portal.workflow.test.HelloWorldDbTest
- [junit_] Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 6.11 sec
- [junit_] Testsuite: org.jboss.portal.workflow.test.HelloWorldDbTest
- [junit_] Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 6.11 sec
- [junit_] ------------- Standard Error -----------------
- [junit_] log4j:WARN No appenders could be found for logger
(org.jbpm.JbpmConfiguration).
- [junit_] log4j:WARN Please initialize the log4j system properly.
- [junit_] ------------- ---------------- ---------------
- [junit_]
- [junit_] Testcase: testSimplePersistence took 6.079 sec
- [junit_] Running org.jboss.portal.workflow.test.PortalCMSPublish
- [junit_] Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 6.828 sec
- [junit_] Testsuite: org.jboss.portal.workflow.test.PortalCMSPublish
- [junit_] Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 6.828 sec
- [junit_] ------------- Standard Output ---------------
- [junit_] Assigning this task to the Managers
- [junit_] Assigning this task to the Managers
- [junit_] Manager=Admin(1)
- [junit_] Manager=eric.brown(a)jboss.com(1)
- [junit_] Manager=Admin(2)
- [junit_] Manager=eric.brown(a)jboss.com(2)
- [junit_] Manager=sohil.shah(a)jboss.com(1)
- [junit_] Manager=sohil.shah(a)jboss.com(2)
- [junit_] This publish request was approved...../default/index2.html
- [junit_] This publish request was approved...../default/index.html
- [junit_] ------------- ---------------- ---------------
- [junit_] ------------- Standard Error -----------------
- [junit_] log4j:WARN No appenders could be found for logger
(org.jbpm.JbpmConfiguration).
- [junit_] log4j:WARN Please initialize the log4j system properly.
- [junit_] ------------- ---------------- ---------------
- [junit_]
- [junit_] Testcase: testCMSPublish took 6.812 sec
-
-BUILD SUCCESSFUL
+
+configure:
+Overriding previous definition of reference to apache.ant.classpath
+
+configure-modules:
+
+configure-defaults:
+Overriding previous definition of reference to javac.classpath
+
+configure-tools:
+
+_configure:jbossaop:task:
+
+_configure:xdoclet:task:
+
+_configure:xdoclet:ejbdoclet:
+
+_configure:xdoclet:jmxdoclet:
+
+_default:compile-classes:
+ [mkdir] Created dir: /Users/julien/java/jboss-portal-2.6/workflow/output/classes
+ [mkdir] Created dir: /Users/julien/java/jboss-portal-2.6/workflow/output/gen/classes
+ [javac] Compiling 12 source files to
/Users/julien/java/jboss-portal-2.6/workflow/output/classes
+
+_default:check-exists-etc:
+
+_default:compile-etc:
+ [mkdir] Created dir: /Users/julien/java/jboss-portal-2.6/workflow/output/etc
+ [copy] Copying 1 file to /Users/julien/java/jboss-portal-2.6/workflow/output/etc
+
+_default:check-exists-resources:
+
+_default:compile-resources:
+ [mkdir] Created dir: /Users/julien/java/jboss-portal-2.6/workflow/output/resources
+ [copy] Copying 6 files to
/Users/julien/java/jboss-portal-2.6/workflow/output/resources
+ [copy] Copied 10 empty directories to 1 empty directory under
/Users/julien/java/jboss-portal-2.6/workflow/output/resources
+
+compile:
+
+output:
+ [mkdir] Created dir: /Users/julien/java/jboss-portal-2.6/workflow/output/lib
+ [jar] Building jar:
/Users/julien/java/jboss-portal-2.6/workflow/output/lib/portal-workflow-lib.jar
+ [copy] Copying 2 files to
/Users/julien/java/jboss-portal-2.6/workflow/output/lib/portal-workflow.war
+
+_default:most:
+
+most:
+
+main:
+
+BUILD SUCCESSFUL
Modified: trunk/workflow/build.sh
===================================================================
--- trunk/workflow/build.sh 2007-01-09 00:35:52 UTC (rev 5968)
+++ trunk/workflow/build.sh 2007-01-09 13:41:06 UTC (rev 5969)
@@ -1,49 +1,49 @@
-#!/bin/sh
-##
-## Invokes a script of the same name in the 'tools' module.
-##
-## The 'tools' module is expected to be a peer directory of the directory
-## in which this script lives.
-##
-## @author Jason Dillon <jason(a)planet57.com>
-##
-
-# $Id: build.sh 2 2005-01-14 23:01:32Z vietj $
-
-PROGNAME=`basename $0`
-DIRNAME=`dirname $0`
-
-# Buss it yo
-main() {
- if [ "x$TOOLS_ROOT" = "x" ]; then
- TOOLS_ROOT=`cd $DIRNAME/../tools && pwd`
- fi
-
- MODULE_ROOT=`cd $DIRNAME; pwd`
- export TOOLS_ROOT MODULE_ROOT DEBUG TRACE
-
- # Where is the target script?
- target="$TOOLS_ROOT/bin/$PROGNAME"
- if [ ! -f "$target" ]; then
- echo "${PROGNAME}: *ERROR* The target executable does not exist:"
- echo "${PROGNAME}:"
- echo "${PROGNAME}: $target"
- echo "${PROGNAME}:"
- echo "${PROGNAME}: Please make sure you have checked out the 'tools'
module"
- echo "${PROGNAME}: and make sure it is up to date."
- exit 2
- fi
-
- # Get busy yo!
- if [ "x$DEBUG" != "x" ]; then
- echo "${PROGNAME}: Executing: /bin/sh $target $@"
- fi
- if [ "x$TRACE" = "x" ]; then
- exec /bin/sh $target "$@"
- else
- exec /bin/sh -x $target "$@"
- fi
-}
-
-# Lets get ready to rumble!
-main "$@"
+#!/bin/sh
+##
+## Invokes a script of the same name in the 'tools' module.
+##
+## The 'tools' module is expected to be a peer directory of the directory
+## in which this script lives.
+##
+## @author Jason Dillon <jason(a)planet57.com>
+##
+
+# $Id: build.sh 1015 2005-11-04 20:15:13Z mholzner $
+
+PROGNAME=`basename $0`
+DIRNAME=`dirname $0`
+
+# Buss it yo
+main() {
+ if [ "x$TOOLS_ROOT" = "x" ]; then
+ TOOLS_ROOT=`cd $DIRNAME/../tools && pwd`
+ fi
+
+ MODULE_ROOT=`cd $DIRNAME; pwd`
+ export TOOLS_ROOT MODULE_ROOT DEBUG TRACE
+
+ # Where is the target script?
+ target="$TOOLS_ROOT/bin/$PROGNAME"
+ if [ ! -f "$target" ]; then
+ echo "${PROGNAME}: *ERROR* The target executable does not exist:"
+ echo "${PROGNAME}:"
+ echo "${PROGNAME}: $target"
+ echo "${PROGNAME}:"
+ echo "${PROGNAME}: Please make sure you have checked out the 'tools'
module"
+ echo "${PROGNAME}: and make sure it is up to date."
+ exit 2
+ fi
+
+ # Get busy yo!
+ if [ "x$DEBUG" != "x" ]; then
+ echo "${PROGNAME}: Executing: /bin/sh $target $@"
+ fi
+ if [ "x$TRACE" = "x" ]; then
+ exec /bin/sh $target "$@"
+ else
+ exec /bin/sh -x $target "$@"
+ fi
+}
+
+# Lets get ready to rumble!
+main "$@"
Modified: trunk/workflow/build.xml
===================================================================
--- trunk/workflow/build.xml 2007-01-09 00:35:52 UTC (rev 5968)
+++ trunk/workflow/build.xml 2007-01-09 13:41:06 UTC (rev 5969)
@@ -116,6 +116,7 @@
<!-- Configure modules -->
<call target="configure-modules"/>
<path id="dependentmodule.classpath">
+ <path refid="jboss.portal-common.classpath"/>
<path refid="jboss.portal-jems.classpath"/>
</path>
Modified: trunk/workflow/src/main/org/jboss/portal/workflow/WorkflowException.java
===================================================================
--- trunk/workflow/src/main/org/jboss/portal/workflow/WorkflowException.java 2007-01-09
00:35:52 UTC (rev 5968)
+++ trunk/workflow/src/main/org/jboss/portal/workflow/WorkflowException.java 2007-01-09
13:41:06 UTC (rev 5969)
@@ -24,35 +24,32 @@
/**
* Created on : Dec 21, 2006
- * @author Sohil Shah - sohil.shah(a)jboss.com
*
+ * @author Sohil Shah - sohil.shah(a)jboss.com
*/
public class WorkflowException extends Exception
{
- /**
- *
- *
- */
- public WorkflowException()
- {
- this("");
+ /**
+ *
+ */
+ public WorkflowException()
+ {
+ this("");
+ }
+
+ /**
+ * @param e
+ */
+ public WorkflowException(Exception e)
+ {
+ super(e);
+ }
+
+ /**
+ * @param e
+ */
+ public WorkflowException(String e)
+ {
+ super(e);
}
-
- /**
- *
- * @param e
- */
- public WorkflowException(Exception e)
- {
- super(e);
- }
-
- /**
- *
- * @param e
- */
- public WorkflowException(String e)
- {
- super(e);
- }
}
Modified: trunk/workflow/src/main/org/jboss/portal/workflow/cms/ApprovePublish.java
===================================================================
--- trunk/workflow/src/main/org/jboss/portal/workflow/cms/ApprovePublish.java 2007-01-09
00:35:52 UTC (rev 5968)
+++ trunk/workflow/src/main/org/jboss/portal/workflow/cms/ApprovePublish.java 2007-01-09
13:41:06 UTC (rev 5969)
@@ -23,40 +23,41 @@
package org.jboss.portal.workflow.cms;
import java.util.Collection;
+
import org.jboss.portal.workflow.WorkflowException;
/**
* Created on : Dec 19, 2006
+ *
* @author Sohil Shah - sohil.shah(a)jboss.com
- *
*/
public interface ApprovePublish
{
- /**
- * Called when content is added to the CMS, and needs to be approved by the managers
- * before it can be published to go live
- *
- * @param content
- * @return returns the process id of the workflow process set in motion
- */
- public long requestApproval(Content content) throws WorkflowException;
-
- /**
- * Called when a manager either approves or rejects the publishing of a specific content
to
- * go live
- *
- * @param processId
- * @param manager userId of the manager
- * @param approved true if approved, false if rejected
- */
- public void processManagerResponse(long processId,String manager,boolean approved)
throws WorkflowException;
-
- /**
- * Retrieves a queue of unapproved content associated with the specified file in the
CMS
- *
- * @param filePath
- * @return
- * @throws WorkflowException
- */
- public Collection getPendingQueue(String filePath) throws WorkflowException;
+ /**
+ * Called when content is added to the CMS, and needs to be approved by the managers
+ * before it can be published to go live
+ *
+ * @param content
+ * @return returns the process id of the workflow process set in motion
+ */
+ public long requestApproval(Content content) throws WorkflowException;
+
+ /**
+ * Called when a manager either approves or rejects the publishing of a specific
content to
+ * go live
+ *
+ * @param processId
+ * @param manager userId of the manager
+ * @param approved true if approved, false if rejected
+ */
+ public void processManagerResponse(long processId, String manager, boolean approved)
throws WorkflowException;
+
+ /**
+ * Retrieves a queue of unapproved content associated with the specified file in the
CMS
+ *
+ * @param filePath
+ * @return
+ * @throws WorkflowException
+ */
+ public Collection getPendingQueue(String filePath) throws WorkflowException;
}
Modified: trunk/workflow/src/main/org/jboss/portal/workflow/cms/ApprovePublishImpl.java
===================================================================
---
trunk/workflow/src/main/org/jboss/portal/workflow/cms/ApprovePublishImpl.java 2007-01-09
00:35:52 UTC (rev 5968)
+++
trunk/workflow/src/main/org/jboss/portal/workflow/cms/ApprovePublishImpl.java 2007-01-09
13:41:06 UTC (rev 5969)
@@ -30,16 +30,16 @@
import java.util.StringTokenizer;
import java.util.List;
-import javax.naming.CompositeName;
import javax.xml.parsers.DocumentBuilderFactory;
import org.apache.log4j.Logger;
-import org.jboss.naming.NonSerializableFactory;
import org.jboss.portal.workflow.service.WorkflowService;
import org.jboss.portal.workflow.WorkflowException;
import org.jboss.portal.jems.as.system.AbstractJBossService;
+import org.jboss.portal.common.util.JNDI;
+import org.jboss.portal.common.util.Tools;
import org.jbpm.JbpmContext;
import org.jbpm.graph.def.ProcessDefinition;
@@ -53,451 +53,432 @@
/**
* Created on : Dec 19, 2006
- * @author Sohil Shah - sohil.shah(a)jboss.com
*
+ * @author Sohil Shah - sohil.shah(a)jboss.com
*/
public class ApprovePublishImpl extends AbstractJBossService implements ApprovePublish
{
- /**
- *
- */
- private static final Logger log = Logger.getLogger(ApprovePublishImpl.class);
-
- /**
- *
- */
- private WorkflowService workflowService = null;
- private String process = null;
- private String processName = null;
- private String managerEmails = null;
- private String[] managers = null;
- private boolean overwrite = false;
- private String from = null;
- private String subject = null;
- private String body = null;
-
- private String jndiName = null;
-
- /**
- *
- *
- */
- public ApprovePublishImpl()
- {
-
- }
-
- /**
- *
- */
- public void startService() throws Exception
- {
- super.startService();
-
- if (this.jndiName != null)
- {
- NonSerializableFactory.rebind(new CompositeName(this.jndiName), this, true);
- }
-
- InputStream is = null;
- JbpmContext jbpmContext = null;
- try
- {
- is = new ByteArrayInputStream(this.process.getBytes());
- jbpmContext = this.workflowService.getJbpmConfiguration().createJbpmContext();
-
- Document document = DocumentBuilderFactory.newInstance().
- newDocumentBuilder().parse(is);
-
- Element root = document.getDocumentElement();
- this.processName = root.getAttribute("name");
- ProcessDefinition processDefinition = jbpmContext.getGraphSession().
- findLatestProcessDefinition(this.processName);
- if(processDefinition == null)
- {
- processDefinition = ProcessDefinition.
- parseXmlString(this.process);
- jbpmContext.deployProcessDefinition(processDefinition);
- }
- else
- {
- //a process definition already exists....should deploy a new version
- //of the definition if overwrite is true
- ProcessDefinition fromConfig = ProcessDefinition.parseXmlString(this.process);
- if(this.overwrite)
- {
- //if the two of them are not same, create a new version
- //of this process definition
- jbpmContext.deployProcessDefinition(fromConfig);
- }
- }
- }
- catch(Exception e)
- {
- this.stopService();
- throw new RuntimeException(e);
- }
- finally
- {
- if(is!=null)
- {
- try{is.close();}catch(Exception e){}
- }
- if(jbpmContext!=null)
- {
- jbpmContext.close();
- }
- }
-
- //process managers that can serve as approvers/rejecters
- StringTokenizer st = new StringTokenizer(this.managerEmails,",");
- this.managers = new String[st.countTokens()];
- for(int i=0;i<managers.length;i++)
- {
- this.managers[i] = st.nextToken();
- }
- }
-
- /**
- *
- */
- public void stopService() throws Exception
- {
- super.stopService();
-
- if (this.jndiName != null)
- {
- NonSerializableFactory.unbind(this.jndiName);
- }
- }
-
- /**
- *
- * @return
- */
- public WorkflowService getWorkflowService()
- {
- return this.workflowService;
- }
-
- /**
- *
- * @param workflowService
- */
- public void setWorkflowService(WorkflowService workflowService)
- {
- this.workflowService = workflowService;
- }
-
- /**
- *
- * @return
- */
- public String getProcess()
- {
- return this.process;
- }
-
- /**
- *
- * @param process
- */
- public void setProcess(String process)
- {
- this.process = process;
- }
-
-
- /**
- * @return the managerRoles
- */
- public String getManagerEmails()
- {
- return managerEmails;
- }
+ /**
+ *
+ */
+ private static final Logger log = Logger.getLogger(ApprovePublishImpl.class);
- /**
- * @param managerRoles the managerRoles to set
- */
- public void setManagerEmails(String managerEmails)
- {
- this.managerEmails = managerEmails;
- }
-
-
+ /**
+ *
+ */
+ private WorkflowService workflowService = null;
+ private String process = null;
+ private String processName = null;
+ private String managerEmails = null;
+ private String[] managers = null;
+ private boolean overwrite = false;
+ private String from = null;
+ private String subject = null;
+ private String body = null;
+ private JNDI.Binding jndiBinding;
- /**
- * @return the overwrite
- */
- public boolean isOverwrite()
- {
- return overwrite;
- }
+ private String jndiName = null;
- /**
- * @param overwrite the overwrite to set
- */
- public void setOverwrite(boolean overwrite)
- {
- this.overwrite = overwrite;
- }
-
- /**
- *
- * @return
- */
- public String getJNDIName()
- {
- return this.jndiName;
- }
-
- /**
- *
- * @param jndiName
- */
- public void setJNDIName(String jndiName)
- {
- this.jndiName = jndiName;
- }
-
-
- /**
- * @return the body
- */
- public String getBody()
- {
- return body;
- }
+ /**
+ *
+ *
+ */
+ public ApprovePublishImpl()
+ {
- /**
- * @param body the body to set
- */
- public void setBody(String body)
- {
- this.body = body;
- }
+ }
- /**
- * @return the from
- */
- public String getFrom()
- {
- return from;
- }
+ /**
+ *
+ */
+ public void startService() throws Exception
+ {
+ super.startService();
- /**
- * @param from the from to set
- */
- public void setFrom(String from)
- {
- this.from = from;
- }
+ if (this.jndiName != null)
+ {
+ jndiBinding = new JNDI.Binding(jndiName, this);
+ jndiBinding.bind();
+ }
- /**
- * @return the subject
- */
- public String getSubject()
- {
- return subject;
- }
+ InputStream is = null;
+ JbpmContext jbpmContext = null;
+ try
+ {
+ is = new ByteArrayInputStream(this.process.getBytes());
+ jbpmContext = this.workflowService.getJbpmConfiguration().createJbpmContext();
- /**
- * @param subject the subject to set
- */
- public void setSubject(String subject)
- {
- this.subject = subject;
- }
+ Document document =
DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(is);
- //----------ApprovePublish
Implementation------------------------------------------------------------------
- /**
- * Called when content is added to the CMS, and needs to be approved by the managers
- * before it can be published to go live
- *
- * @param content
- * @return returns the process id of the workflow process set in motion
- */
- public long requestApproval(Content content) throws WorkflowException
- {
- long processId = 0;
- JbpmContext jbpmContext = null;
- ProcessInstance processInstance = null;
- boolean success = false;
- try
- {
- jbpmContext = this.workflowService.getJbpmConfiguration().createJbpmContext();
-
- //The next line creates one execution of the process definition.
- // After construction, the process execution has one main path
- // of execution (=the root token) that is positioned in the
- // start-state.
- processInstance = jbpmContext.newProcessInstance(this.processName);
-
- //After construction, the process execution has one main path
- // of execution (=the root token).
- Token token = processInstance.getRootToken();
-
- //set the process variables
- processInstance.getContextInstance().setVariable("content",content);
- processInstance.getContextInstance().setVariable("managers",
this.managers);
- processInstance.getContextInstance().setVariable("from", this.from);
- processInstance.getContextInstance().setVariable("subject",
this.subject);
- processInstance.getContextInstance().setVariable("body", this.body);
-
- //start the workflow, starts the cms publish approval workflow
- //this creates a task to approve/reject a cms publish for the Admins
- token.signal();
-
- //mark as a successfull process initiation
- success = true;
- }
- catch(Exception e)
- {
- success = false;
- throw new WorkflowException(e);
- }
- finally
- {
- if(processInstance!=null && success)
- {
- jbpmContext.save(processInstance);
- processId = processInstance.getId();
- }
- if(jbpmContext!=null)
- {
- jbpmContext.close();
- }
- }
- return processId;
- }
-
- /**
- * Called when a manager either approves or rejects the publishing of a specific content
to
- * go live
- *
- * @param processId
- * @param manager userId of the manager
- * @param approved true if approved, false if rejected
- */
- public void processManagerResponse(long processId, String manager, boolean approved)
throws WorkflowException
- {
- JbpmContext jbpmContext = null;
- ProcessInstance processInstance = null;
- try
- {
- jbpmContext = this.workflowService.getJbpmConfiguration().createJbpmContext();
-
- //Now, we search for all process instances of this process definition.
- processInstance = jbpmContext.loadProcessInstance(processId);
-
- if(processInstance.hasEnded())
- {
- log.debug("This process has already ended...");
- return;
- }
-
- processInstance.getContextInstance().setVariable("approved", new
Boolean(approved));
-
- Collection allTasks = processInstance.getTaskMgmtInstance().getTaskInstances();
- if(allTasks != null)
- {
- for(Iterator itr=allTasks.iterator();itr.hasNext();)
- {
- TaskInstance cour = (TaskInstance)itr.next();
- if(cour.getActorId().equals(manager))
- {
-
log.debug("Manager="+cour.getActorId()+"("+processId+")");
-
- //check and make sure this task instance is not marked for deletion
- if(cour.getVariable(processInstance.getId()+":"+cour.getId())!=null)
- {
- continue;
- }
-
- if(!approved)
- {
- cour.start();
- cour.end("rejection");
- break;
- }
- else
- {
- cour.start();
- cour.end("approval");
- break;
- }
- }
- }
- }
- }
- catch(Exception e)
- {
- throw new WorkflowException(e);
- }
- finally
- {
- if(processInstance!=null)
- {
- jbpmContext.save(processInstance);
- }
- if(jbpmContext!=null)
- {
- jbpmContext.close();
- }
- }
- }
-
- /**
- * Retrieves a queue of unapproved content associated with the specified file in the
CMS
- *
- * @param filePath
- * @return
- * @throws WorkflowException
- */
- public Collection getPendingQueue(String filePath) throws WorkflowException
- {
- Collection pendingQueue = new ArrayList();
- JbpmContext jbpmContext = null;
- try
- {
- jbpmContext = this.workflowService.getJbpmConfiguration().createJbpmContext();
-
- GraphSession graphSession = jbpmContext.getGraphSession();
- ProcessDefinition processDef =
graphSession.findLatestProcessDefinition(this.processName);
- List processInstances = graphSession.findProcessInstances(processDef.getId());
-
- if(processInstances != null)
- {
- for(int i=0;i<processInstances.size();i++)
- {
- ProcessInstance cour = (ProcessInstance)processInstances.get(i);
- //iterate through a list of currently pending approval tasks
- if(!cour.hasEnded())
- {
- Content content =
(Content)cour.getContextInstance().getVariable("content");
-
- //apply proper criteria to extract pending content only for the specified file
- if(content!=null)
- {
- int lastIndex = content.getPath().lastIndexOf('/');
- String criteriaPath = content.getPath().substring(0,lastIndex);
-
- if(criteriaPath.trim().equals(filePath.trim()))
- {
- pendingQueue.add(content);
- }
- }
- }
- }
- }
- }
- finally
- {
- if(jbpmContext!=null)
- {
- jbpmContext.close();
- }
- }
- return pendingQueue;
- }
+ Element root = document.getDocumentElement();
+ this.processName = root.getAttribute("name");
+ ProcessDefinition processDefinition =
jbpmContext.getGraphSession().findLatestProcessDefinition(this.processName);
+ if (processDefinition == null)
+ {
+ processDefinition = ProcessDefinition.parseXmlString(this.process);
+ jbpmContext.deployProcessDefinition(processDefinition);
+ }
+ else
+ {
+ // A process definition already exists....should deploy a new version
+ // of the definition if overwrite is true
+ ProcessDefinition fromConfig =
ProcessDefinition.parseXmlString(this.process);
+ if (this.overwrite)
+ {
+ // If the two of them are not same, create a new version
+ // of this process definition
+ jbpmContext.deployProcessDefinition(fromConfig);
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ //
+ this.stopService();
+
+ //
+ throw e;
+ }
+ finally
+ {
+ Tools.safeClose(is);
+ Tools.safeClose(jbpmContext);
+ }
+
+ //process managers that can serve as approvers/rejecters
+ StringTokenizer st = new StringTokenizer(this.managerEmails, ",");
+ this.managers = new String[st.countTokens()];
+ for (int i = 0; i < managers.length; i++)
+ {
+ this.managers[i] = st.nextToken();
+ }
+ }
+
+ /**
+ *
+ */
+ public void stopService() throws Exception
+ {
+ super.stopService();
+
+ if (jndiBinding != null)
+ {
+ jndiBinding.unbind();
+ jndiBinding = null;
+ }
+ }
+
+ /**
+ * @return
+ */
+ public WorkflowService getWorkflowService()
+ {
+ return this.workflowService;
+ }
+
+ /**
+ * @param workflowService
+ */
+ public void setWorkflowService(WorkflowService workflowService)
+ {
+ this.workflowService = workflowService;
+ }
+
+ /**
+ * @return
+ */
+ public String getProcess()
+ {
+ return this.process;
+ }
+
+ /**
+ * @param process
+ */
+ public void setProcess(String process)
+ {
+ this.process = process;
+ }
+
+
+ /**
+ * @return the managerRoles
+ */
+ public String getManagerEmails()
+ {
+ return managerEmails;
+ }
+
+ /**
+ * @param managerEmails the manager emails to set
+ */
+ public void setManagerEmails(String managerEmails)
+ {
+ this.managerEmails = managerEmails;
+ }
+
+
+ /**
+ * @return the overwrite
+ */
+ public boolean isOverwrite()
+ {
+ return overwrite;
+ }
+
+ /**
+ * @param overwrite the overwrite to set
+ */
+ public void setOverwrite(boolean overwrite)
+ {
+ this.overwrite = overwrite;
+ }
+
+ /**
+ * @return
+ */
+ public String getJNDIName()
+ {
+ return this.jndiName;
+ }
+
+ /**
+ * @param jndiName
+ */
+ public void setJNDIName(String jndiName)
+ {
+ this.jndiName = jndiName;
+ }
+
+
+ /**
+ * @return the body
+ */
+ public String getBody()
+ {
+ return body;
+ }
+
+ /**
+ * @param body the body to set
+ */
+ public void setBody(String body)
+ {
+ this.body = body;
+ }
+
+ /**
+ * @return the from
+ */
+ public String getFrom()
+ {
+ return from;
+ }
+
+ /**
+ * @param from the from to set
+ */
+ public void setFrom(String from)
+ {
+ this.from = from;
+ }
+
+ /**
+ * @return the subject
+ */
+ public String getSubject()
+ {
+ return subject;
+ }
+
+ /**
+ * @param subject the subject to set
+ */
+ public void setSubject(String subject)
+ {
+ this.subject = subject;
+ }
+
+ //----------ApprovePublish
Implementation------------------------------------------------------------------
+ /**
+ * Called when content is added to the CMS, and needs to be approved by the managers
+ * before it can be published to go live
+ *
+ * @param content
+ * @return returns the process id of the workflow process set in motion
+ */
+ public long requestApproval(Content content) throws WorkflowException
+ {
+ long processId = 0;
+ JbpmContext jbpmContext = null;
+ ProcessInstance processInstance = null;
+ boolean success = false;
+ try
+ {
+ jbpmContext = this.workflowService.getJbpmConfiguration().createJbpmContext();
+
+ //The next line creates one execution of the process definition.
+ // After construction, the process execution has one main path
+ // of execution (=the root token) that is positioned in the
+ // start-state.
+ processInstance = jbpmContext.newProcessInstance(this.processName);
+
+ //After construction, the process execution has one main path
+ // of execution (=the root token).
+ Token token = processInstance.getRootToken();
+
+ //set the process variables
+ processInstance.getContextInstance().setVariable("content", content);
+ processInstance.getContextInstance().setVariable("managers",
this.managers);
+ processInstance.getContextInstance().setVariable("from", this.from);
+ processInstance.getContextInstance().setVariable("subject",
this.subject);
+ processInstance.getContextInstance().setVariable("body", this.body);
+
+ //start the workflow, starts the cms publish approval workflow
+ //this creates a task to approve/reject a cms publish for the Admins
+ token.signal();
+
+ //mark as a successfull process initiation
+ success = true;
+ }
+ catch (Exception e)
+ {
+ success = false;
+ throw new WorkflowException(e);
+ }
+ finally
+ {
+ if (processInstance != null && success)
+ {
+ jbpmContext.save(processInstance);
+ processId = processInstance.getId();
+ }
+ Tools.safeClose(jbpmContext);
+ }
+ return processId;
+ }
+
+ /**
+ * Called when a manager either approves or rejects the publishing of a specific
content to
+ * go live
+ *
+ * @param processId
+ * @param manager userId of the manager
+ * @param approved true if approved, false if rejected
+ */
+ public void processManagerResponse(long processId, String manager, boolean approved)
throws WorkflowException
+ {
+ JbpmContext jbpmContext = null;
+ ProcessInstance processInstance = null;
+ try
+ {
+ jbpmContext = this.workflowService.getJbpmConfiguration().createJbpmContext();
+
+ //Now, we search for all process instances of this process definition.
+ processInstance = jbpmContext.loadProcessInstance(processId);
+
+ if (processInstance.hasEnded())
+ {
+ log.debug("This process has already ended...");
+ return;
+ }
+
+ processInstance.getContextInstance().setVariable("approved", new
Boolean(approved));
+
+ Collection allTasks = processInstance.getTaskMgmtInstance().getTaskInstances();
+ if (allTasks != null)
+ {
+ for (Iterator itr = allTasks.iterator(); itr.hasNext();)
+ {
+ TaskInstance cour = (TaskInstance)itr.next();
+ if (cour.getActorId().equals(manager))
+ {
+ log.debug("Manager=" + cour.getActorId() + "(" +
processId + ")");
+
+ //check and make sure this task instance is not marked for deletion
+ if (cour.getVariable(processInstance.getId() + ":" +
cour.getId()) != null)
+ {
+ continue;
+ }
+
+ if (!approved)
+ {
+ cour.start();
+ cour.end("rejection");
+ break;
+ }
+ else
+ {
+ cour.start();
+ cour.end("approval");
+ break;
+ }
+ }
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ throw new WorkflowException(e);
+ }
+ finally
+ {
+ if (processInstance != null)
+ {
+ jbpmContext.save(processInstance);
+ }
+ Tools.safeClose(jbpmContext);
+ }
+ }
+
+ /**
+ * Retrieves a queue of unapproved content associated with the specified file in the
CMS
+ *
+ * @param filePath
+ * @return
+ * @throws WorkflowException
+ */
+ public Collection getPendingQueue(String filePath) throws WorkflowException
+ {
+ Collection pendingQueue = new ArrayList();
+ JbpmContext jbpmContext = null;
+ try
+ {
+ jbpmContext = this.workflowService.getJbpmConfiguration().createJbpmContext();
+
+ GraphSession graphSession = jbpmContext.getGraphSession();
+ ProcessDefinition processDef =
graphSession.findLatestProcessDefinition(this.processName);
+ List processInstances = graphSession.findProcessInstances(processDef.getId());
+
+ if (processInstances != null)
+ {
+ for (int i = 0; i < processInstances.size(); i++)
+ {
+ ProcessInstance cour = (ProcessInstance)processInstances.get(i);
+ //iterate through a list of currently pending approval tasks
+ if (!cour.hasEnded())
+ {
+ Content content =
(Content)cour.getContextInstance().getVariable("content");
+
+ //apply proper criteria to extract pending content only for the
specified file
+ if (content != null)
+ {
+ int lastIndex = content.getPath().lastIndexOf('/');
+ String criteriaPath = content.getPath().substring(0, lastIndex);
+
+ if (criteriaPath.trim().equals(filePath.trim()))
+ {
+ pendingQueue.add(content);
+ }
+ }
+ }
+ }
+ }
+ }
+ finally
+ {
+ Tools.safeClose(jbpmContext);
+ }
+ return pendingQueue;
+ }
}
Modified:
trunk/workflow/src/main/org/jboss/portal/workflow/cms/ApprovePublishServlet.java
===================================================================
---
trunk/workflow/src/main/org/jboss/portal/workflow/cms/ApprovePublishServlet.java 2007-01-09
00:35:52 UTC (rev 5968)
+++
trunk/workflow/src/main/org/jboss/portal/workflow/cms/ApprovePublishServlet.java 2007-01-09
13:41:06 UTC (rev 5969)
@@ -31,82 +31,80 @@
import javax.servlet.UnavailableException;
import javax.naming.InitialContext;
+
import org.jboss.portal.workflow.cms.ApprovePublish;
/**
* Created on : Dec 20, 2006
- * @author Sohil Shah - sohil.shah(a)jboss.com
*
+ * @author Sohil Shah - sohil.shah(a)jboss.com
*/
public class ApprovePublishServlet extends HttpServlet
{
- private ApprovePublish approvePublishWorkflow = null;
- /**
- *
- */
- public void init() throws ServletException
- {
- try
- {
- super.init();
- InitialContext context = new InitialContext();
- approvePublishWorkflow =
(ApprovePublish)context.lookup("java:portal/ApprovePublishWorkflow");
- }
- catch(Exception e)
- {
- throw new UnavailableException(e.toString());
- }
- }
+ private ApprovePublish approvePublishWorkflow = null;
- /**
- *
- */
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException
- {
- this.doPost(request, response);
- }
+ /**
+ *
+ */
+ public void init() throws ServletException
+ {
+ try
+ {
+ super.init();
+ InitialContext context = new InitialContext();
+ approvePublishWorkflow =
(ApprovePublish)context.lookup("java:portal/ApprovePublishWorkflow");
+ }
+ catch (Exception e)
+ {
+ throw new UnavailableException(e.toString());
+ }
+ }
- /**
- *
- */
- protected void doPost(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException
- {
- try
- {
- String processId = request.getParameter("pId");
- String manager = request.getParameter("manager");
- boolean approve = false;
- if(request.getRequestURI().indexOf("approve")!=-1)
- {
- approve = true;
- }
-
- this.approvePublishWorkflow.processManagerResponse(
- Long.parseLong(processId),manager,approve
- );
-
- /**
- * TODO: this is a hack job until a decent GUI is integrated
- * with this workflow..Yes Yes, this will be based on JSP then
- */
- StringBuffer buffer = new StringBuffer();
- buffer.append("<html>\n");
- if(approve)
- {
- buffer.append("<span>The content was successfully
published</span>\n");
- }
- else
- {
- buffer.append("<span>The content publish request was
rejected</span>\n");
- }
- buffer.append("</html>\n");
-
- response.getWriter().write(buffer.toString());
- response.getWriter().flush();
- }
- catch(Exception e)
- {
- response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,e.toString());
- }
- }
+ /**
+ *
+ */
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException
+ {
+ this.doPost(request, response);
+ }
+
+ /**
+ *
+ */
+ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException
+ {
+ try
+ {
+ String processId = request.getParameter("pId");
+ String manager = request.getParameter("manager");
+ boolean approve = request.getRequestURI().indexOf("approve") != -1;
+
+ this.approvePublishWorkflow.processManagerResponse(
+ Long.parseLong(processId), manager, approve
+ );
+
+ /**
+ * TODO: this is a hack job until a decent GUI is integrated
+ * with this workflow..Yes Yes, this will be based on JSP then
+ */
+ StringBuffer buffer = new StringBuffer();
+ buffer.append("<html>\n");
+ if (approve)
+ {
+ buffer.append("<span>The content was successfully
published</span>\n");
+ }
+ else
+ {
+ buffer.append("<span>The content publish request was
rejected</span>\n");
+ }
+ buffer.append("</html>\n");
+
+ response.getWriter().write(buffer.toString());
+ response.getWriter().flush();
+ }
+ catch (Exception e)
+ {
+ response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.toString());
+ }
+ }
}
Modified: trunk/workflow/src/main/org/jboss/portal/workflow/cms/Content.java
===================================================================
--- trunk/workflow/src/main/org/jboss/portal/workflow/cms/Content.java 2007-01-09 00:35:52
UTC (rev 5968)
+++ trunk/workflow/src/main/org/jboss/portal/workflow/cms/Content.java 2007-01-09 13:41:06
UTC (rev 5969)
@@ -29,119 +29,120 @@
/**
* Created on : Dec 20, 2006
+ *
* @author Sohil Shah - sohil.shah(a)jboss.com
- *
*/
public class Content implements Serializable
{
- private String path = null;
- private String userName = null;
- private String mimeType = null;
- private int size = 0;
- private Date creationDate = null;
-
- /**
- *
- *
- */
- public Content()
- {
-
- }
- /**
- * @return the path
- */
- public String getPath()
- {
- return path;
- }
+ private String path = null;
+ private String userName = null;
+ private String mimeType = null;
+ private int size = 0;
+ private Date creationDate = null;
- /**
- * @param path the path to set
- */
- public void setPath(String path)
- {
- this.path = path;
- }
+ /**
+ *
+ *
+ */
+ public Content()
+ {
- /**
- * @return the userName
- */
- public String getUserName()
- {
- return userName;
- }
+ }
- /**
- * @param userName the userName to set
- */
- public void setUserName(String userName)
- {
- this.userName = userName;
- }
+ /**
+ * @return the path
+ */
+ public String getPath()
+ {
+ return path;
+ }
- /**
- * @return the mimeType
- */
- public String getMimeType()
- {
- return mimeType;
- }
+ /**
+ * @param path the path to set
+ */
+ public void setPath(String path)
+ {
+ this.path = path;
+ }
- /**
- * @param mimeType the mimeType to set
- */
- public void setMimeType(String mimeType)
- {
- this.mimeType = mimeType;
- }
+ /**
+ * @return the userName
+ */
+ public String getUserName()
+ {
+ return userName;
+ }
- /**
- * @return the size
- */
- public int getSize()
- {
- return size;
- }
+ /**
+ * @param userName the userName to set
+ */
+ public void setUserName(String userName)
+ {
+ this.userName = userName;
+ }
- /**
- * @param size the size to set
- */
- public void setSize(int size)
- {
- this.size = size;
- }
-
- public String getSizeStr()
- {
- return String.valueOf((this.size / 1024))+"kb";
- }
+ /**
+ * @return the mimeType
+ */
+ public String getMimeType()
+ {
+ return mimeType;
+ }
- /**
- * @return the creationDate
- */
- public Date getCreationDate()
- {
- return creationDate;
- }
+ /**
+ * @param mimeType the mimeType to set
+ */
+ public void setMimeType(String mimeType)
+ {
+ this.mimeType = mimeType;
+ }
- /**
- * @param creationDate the creationDate to set
- */
- public void setCreationDate(Date creationDate)
- {
- this.creationDate = creationDate;
- }
-
- public String getCreationDateStr()
- {
- String date = "";
- if (this.creationDate != null)
- {
- Format formatter = new SimpleDateFormat("MM/dd/yy HH:mm");
- date = formatter.format(this.creationDate);
- }
- return date;
- }
+ /**
+ * @return the size
+ */
+ public int getSize()
+ {
+ return size;
+ }
+
+ /**
+ * @param size the size to set
+ */
+ public void setSize(int size)
+ {
+ this.size = size;
+ }
+
+ public String getSizeStr()
+ {
+ return String.valueOf((this.size / 1024)) + "kb";
+ }
+
+ /**
+ * @return the creationDate
+ */
+ public Date getCreationDate()
+ {
+ return creationDate;
+ }
+
+ /**
+ * @param creationDate the creationDate to set
+ */
+ public void setCreationDate(Date creationDate)
+ {
+ this.creationDate = creationDate;
+ }
+
+ public String getCreationDateStr()
+ {
+ String date = "";
+ if (this.creationDate != null)
+ {
+ Format formatter = new SimpleDateFormat("MM/dd/yy HH:mm");
+ date = formatter.format(this.creationDate);
+ }
+ return date;
+ }
}
Modified: trunk/workflow/src/main/org/jboss/portal/workflow/cms/TaskExceptionHandler.java
===================================================================
---
trunk/workflow/src/main/org/jboss/portal/workflow/cms/TaskExceptionHandler.java 2007-01-09
00:35:52 UTC (rev 5968)
+++
trunk/workflow/src/main/org/jboss/portal/workflow/cms/TaskExceptionHandler.java 2007-01-09
13:41:06 UTC (rev 5969)
@@ -27,28 +27,27 @@
import org.jbpm.taskmgmt.exe.TaskInstance;
-
/**
- *
* Created on : Dec 21, 2006
- * @author Sohil Shah - sohil.shah(a)jboss.com
*
+ * @author Sohil Shah - sohil.shah(a)jboss.com
*/
-public class TaskExceptionHandler implements ActionHandler
+public class TaskExceptionHandler implements ActionHandler
{
- /**
- *
- */
- public void execute(ExecutionContext executionContext)
- {
- TaskInstance current = executionContext.getTaskInstance();
-
- TaskInstance t = executionContext.getTaskMgmtInstance().
- createTaskInstance(executionContext.getTask(),executionContext);
- t.setActorId(current.getActorId());
-
-
current.setVariable(executionContext.getProcessInstance().getId()+":"+current.getId(),
"markAsDeleted");
-
- throw new RuntimeException(executionContext.getException());
- }
+
+ /**
+ *
+ */
+ public void execute(ExecutionContext executionContext)
+ {
+ TaskInstance current = executionContext.getTaskInstance();
+
+ TaskInstance t = executionContext.getTaskMgmtInstance().
+ createTaskInstance(executionContext.getTask(), executionContext);
+ t.setActorId(current.getActorId());
+
+ current.setVariable(executionContext.getProcessInstance().getId() + ":" +
current.getId(), "markAsDeleted");
+
+ throw new RuntimeException(executionContext.getException());
+ }
}
Modified: trunk/workflow/src/main/org/jboss/portal/workflow/test/Finalize.java
===================================================================
--- trunk/workflow/src/main/org/jboss/portal/workflow/test/Finalize.java 2007-01-09
00:35:52 UTC (rev 5968)
+++ trunk/workflow/src/main/org/jboss/portal/workflow/test/Finalize.java 2007-01-09
13:41:06 UTC (rev 5969)
@@ -26,38 +26,39 @@
import org.jbpm.graph.exe.*;
// MyActionHandler represents a class that could execute
+
// some user code during the execution of a jBPM process.
/**
* @author sohil.shah(a)jboss.com
*/
-public class Finalize implements ActionHandler
+public class Finalize implements ActionHandler
{
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
- // Before each test (in the setUp), the isExecuted member
- // will be set to false.
- public static boolean isExecuted = false;
+ // Before each test (in the setUp), the isExecuted member
+ // will be set to false.
+ public static boolean isExecuted = false;
- // The action will set the isExecuted to true so the
- // unit test will be able to show when the action
- // is being executed.
- public void execute(ExecutionContext executionContext)
- {
- String path =
(String)executionContext.getContextInstance().getVariable("path");
-
- Object rejection =
executionContext.getContextInstance().getVariable("rejection");
-
- if(rejection!=null)
- {
- System.out.println("This publish request was rejected....."+path);
- }
- else
- {
- System.out.println("This publish request was approved....."+path);
- }
-
-
- isExecuted = true;
- }
+ // The action will set the isExecuted to true so the
+ // unit test will be able to show when the action
+ // is being executed.
+ public void execute(ExecutionContext executionContext)
+ {
+ String path =
(String)executionContext.getContextInstance().getVariable("path");
+
+ Object rejection =
executionContext.getContextInstance().getVariable("rejection");
+
+ if (rejection != null)
+ {
+ System.out.println("This publish request was rejected....." + path);
+ }
+ else
+ {
+ System.out.println("This publish request was approved....." + path);
+ }
+
+
+ isExecuted = true;
+ }
}
Modified: trunk/workflow/src/main/org/jboss/portal/workflow/test/HelloWorldDbTest.java
===================================================================
---
trunk/workflow/src/main/org/jboss/portal/workflow/test/HelloWorldDbTest.java 2007-01-09
00:35:52 UTC (rev 5968)
+++
trunk/workflow/src/main/org/jboss/portal/workflow/test/HelloWorldDbTest.java 2007-01-09
13:41:06 UTC (rev 5969)
@@ -34,199 +34,214 @@
import org.jbpm.graph.exe.Token;
/**
- *
* @author sohil.shah(a)jboss.com
- *
*/
-public class HelloWorldDbTest extends TestCase {
-
- static JbpmConfiguration jbpmConfiguration = null;
+public class HelloWorldDbTest extends TestCase
+{
- static {
- // An example configuration file such as this can be found in
- // 'src/config.files'. Typically the configuration information is in the
- // resource file 'jbpm.cfg.xml', but here we pass in the configuration
- // information as an XML string.
-
- // First we create a JbpmConfiguration statically. One JbpmConfiguration
- // can be used for all threads in the system, that is why we can safely
- // make it static.
+ static JbpmConfiguration jbpmConfiguration = null;
- jbpmConfiguration = JbpmConfiguration.parseXmlString(
- "<jbpm-configuration>" +
-
- // A jbpm-context mechanism separates the jbpm core
- // engine from the services that jbpm uses from
- // the environment.
-
- " <jbpm-context>" +
- " <service name='persistence' " +
- "
factory='org.jbpm.persistence.db.DbPersistenceServiceFactory' />" +
- " </jbpm-context>" +
-
- // Also all the resource files that are used by jbpm are
- // referenced from the jbpm.cfg.xml
-
- " <string name='resource.hibernate.cfg.xml' " +
- " value='conf/hibernate.cfg.xml' />" +
- " <string name='resource.business.calendar' " +
- " value='org/jbpm/calendar/jbpm.business.calendar.properties'
/>" +
- " <string name='resource.default.modules' " +
- " value='org/jbpm/graph/def/jbpm.default.modules.properties'
/>" +
- " <string name='resource.converter' " +
- " value='org/jbpm/db/hibernate/jbpm.converter.properties'
/>" +
- " <string name='resource.action.types' " +
- " value='org/jbpm/graph/action/action.types.xml' />"
+
- " <string name='resource.node.types' " +
- " value='org/jbpm/graph/node/node.types.xml' />" +
- " <string name='resource.varmapping' " +
- " value='org/jbpm/context/exe/jbpm.varmapping.xml'
/>" +
- "</jbpm-configuration>"
- );
- }
-
- public void setUp() {
- jbpmConfiguration.createSchema();
- }
-
- public void tearDown() {
- jbpmConfiguration.dropSchema();
- }
+ static
+ {
+ // An example configuration file such as this can be found in
+ // 'src/config.files'. Typically the configuration information is in the
+ // resource file 'jbpm.cfg.xml', but here we pass in the configuration
+ // information as an XML string.
- public void testSimplePersistence() {
- // Between the 3 method calls below, all data is passed via the
- // database. Here, in this unit test, these 3 methods are executed
- // right after each other because we want to test a complete process
- // scenario. But in reality, these methods represent different
- // requests to a server.
-
- // Since we start with a clean, empty in-memory database, we have to
- // deploy the process first. In reality, this is done once by the
- // process developer.
- deployProcessDefinition();
+ // First we create a JbpmConfiguration statically. One JbpmConfiguration
+ // can be used for all threads in the system, that is why we can safely
+ // make it static.
- // Suppose we want to start a process instance (=process execution)
- // when a user submits a form in a web application...
- processInstanceIsCreatedWhenUserSubmitsWebappForm();
+ jbpmConfiguration = JbpmConfiguration.parseXmlString(
+ "<jbpm-configuration>" +
- // Then, later, upon the arrival of an asynchronous message the
- // execution must continue.
- theProcessInstanceContinuesWhenAnAsyncMessageIsReceived();
- }
+ // A jbpm-context mechanism separates the jbpm core
+ // engine from the services that jbpm uses from
+ // the environment.
- public void deployProcessDefinition() {
- // This test shows a process definition and one execution
- // of the process definition. The process definition has
- // 3 nodes: an unnamed start-state, a state 's' and an
- // end-state named 'end'.
- ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
- "<process-definition name='hello_world'>" +
- " <start-state name='start'>" +
- " <transition to='s' />" +
- " </start-state>" +
- " <state name='s'>" +
- " <transition to='end' />" +
- " </state>" +
- " <end-state name='end' />" +
- "</process-definition>"
- );
+ " <jbpm-context>" +
+ " <service name='persistence' " +
+ "
factory='org.jbpm.persistence.db.DbPersistenceServiceFactory' />" +
+ " </jbpm-context>" +
- // Lookup the pojo persistence context-builder that is configured above
- JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
- try {
- // Deploy the process definition in the database
- jbpmContext.deployProcessDefinition(processDefinition);
+ // Also all the resource files that are used by jbpm are
+ // referenced from the jbpm.cfg.xml
- } finally {
- // Tear down the pojo persistence context.
- // This includes flush the SQL for inserting the process definition
- // to the database.
- jbpmContext.close();
- }
- }
+ " <string name='resource.hibernate.cfg.xml' " +
+ " value='conf/hibernate.cfg.xml' />" +
+ " <string name='resource.business.calendar' " +
+ "
value='org/jbpm/calendar/jbpm.business.calendar.properties' />" +
+ " <string name='resource.default.modules' " +
+ "
value='org/jbpm/graph/def/jbpm.default.modules.properties' />" +
+ " <string name='resource.converter' " +
+ "
value='org/jbpm/db/hibernate/jbpm.converter.properties' />" +
+ " <string name='resource.action.types' " +
+ " value='org/jbpm/graph/action/action.types.xml'
/>" +
+ " <string name='resource.node.types' " +
+ " value='org/jbpm/graph/node/node.types.xml'
/>" +
+ " <string name='resource.varmapping' " +
+ " value='org/jbpm/context/exe/jbpm.varmapping.xml'
/>" +
+ "</jbpm-configuration>"
+ );
+ }
- public void processInstanceIsCreatedWhenUserSubmitsWebappForm() {
- // The code in this method could be inside a struts-action
- // or a JSF managed bean.
+ public void setUp()
+ {
+ jbpmConfiguration.createSchema();
+ }
- // Lookup the pojo persistence context-builder that is configured above
- JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
- try {
+ public void tearDown()
+ {
+ jbpmConfiguration.dropSchema();
+ }
- GraphSession graphSession = jbpmContext.getGraphSession();
-
- ProcessDefinition processDefinition =
- graphSession.findLatestProcessDefinition("hello_world");
-
- // With the processDefinition that we retrieved from the database, we
- // can create an execution of the process definition just like in the
- // hello_world example (which was without persistence).
- ProcessInstance processInstance =
- new ProcessInstance(processDefinition);
-
- Token token = processInstance.getRootToken();
- assertEquals("start", token.getNode().getName());
- // Let's start the process execution
- token.signal();
- // Now the process is in the state 's'.
- assertEquals("s", token.getNode().getName());
-
- // Now the processInstance is saved in the database. So the
- // current state of the execution of the process is stored in the
- // database.
- jbpmContext.save(processInstance);
- // The method below will get the process instance back out
- // of the database and resume execution by providing another
- // external signal.
+ public void testSimplePersistence()
+ {
+ // Between the 3 method calls below, all data is passed via the
+ // database. Here, in this unit test, these 3 methods are executed
+ // right after each other because we want to test a complete process
+ // scenario. But in reality, these methods represent different
+ // requests to a server.
- } finally {
- // Tear down the pojo persistence context.
- jbpmContext.close();
- }
- }
+ // Since we start with a clean, empty in-memory database, we have to
+ // deploy the process first. In reality, this is done once by the
+ // process developer.
+ deployProcessDefinition();
- public void theProcessInstanceContinuesWhenAnAsyncMessageIsReceived() {
- // The code in this method could be the content of a message driven bean.
-
- // Lookup the pojo persistence context-builder that is configured above
- JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
- try {
+ // Suppose we want to start a process instance (=process execution)
+ // when a user submits a form in a web application...
+ processInstanceIsCreatedWhenUserSubmitsWebappForm();
- GraphSession graphSession = jbpmContext.getGraphSession();
- // First, we need to get the process instance back out of the database.
- // There are several options to know what process instance we are dealing
- // with here. The easiest in this simple test case is just to look for
- // the full list of process instances. That should give us only one
- // result. So let's look up the process definition.
-
- ProcessDefinition processDefinition =
- graphSession.findLatestProcessDefinition("hello_world");
+ // Then, later, upon the arrival of an asynchronous message the
+ // execution must continue.
+ theProcessInstanceContinuesWhenAnAsyncMessageIsReceived();
+ }
- // Now, we search for all process instances of this process definition.
- List processInstances =
- graphSession.findProcessInstances(processDefinition.getId());
-
- // Because we know that in the context of this unit test, there is
- // only one execution. In real life, the processInstanceId can be
- // extracted from the content of the message that arrived or from
- // the user making a choice.
- ProcessInstance processInstance =
- (ProcessInstance) processInstances.get(0);
-
- // Now we can continue the execution. Note that the processInstance
- // delegates signals to the main path of execution (=the root token).
- processInstance.signal();
+ public void deployProcessDefinition()
+ {
+ // This test shows a process definition and one execution
+ // of the process definition. The process definition has
+ // 3 nodes: an unnamed start-state, a state 's' and an
+ // end-state named 'end'.
+ ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
+ "<process-definition name='hello_world'>" +
+ " <start-state name='start'>" +
+ " <transition to='s' />" +
+ " </start-state>" +
+ " <state name='s'>" +
+ " <transition to='end' />" +
+ " </state>" +
+ " <end-state name='end' />" +
+ "</process-definition>"
+ );
- // After this signal, we know the process execution should have
- // arrived in the end-state.
- assertTrue(processInstance.hasEnded());
-
- // Now we can update the state of the execution in the database
- jbpmContext.save(processInstance);
+ // Lookup the pojo persistence context-builder that is configured above
+ JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
+ try
+ {
+ // Deploy the process definition in the database
+ jbpmContext.deployProcessDefinition(processDefinition);
- } finally {
- // Tear down the pojo persistence context.
- jbpmContext.close();
- }
- }
+ }
+ finally
+ {
+ // Tear down the pojo persistence context.
+ // This includes flush the SQL for inserting the process definition
+ // to the database.
+ jbpmContext.close();
+ }
+ }
+
+ public void processInstanceIsCreatedWhenUserSubmitsWebappForm()
+ {
+ // The code in this method could be inside a struts-action
+ // or a JSF managed bean.
+
+ // Lookup the pojo persistence context-builder that is configured above
+ JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
+ try
+ {
+
+ GraphSession graphSession = jbpmContext.getGraphSession();
+
+ ProcessDefinition processDefinition =
+ graphSession.findLatestProcessDefinition("hello_world");
+
+ // With the processDefinition that we retrieved from the database, we
+ // can create an execution of the process definition just like in the
+ // hello_world example (which was without persistence).
+ ProcessInstance processInstance =
+ new ProcessInstance(processDefinition);
+
+ Token token = processInstance.getRootToken();
+ assertEquals("start", token.getNode().getName());
+ // Let's start the process execution
+ token.signal();
+ // Now the process is in the state 's'.
+ assertEquals("s", token.getNode().getName());
+
+ // Now the processInstance is saved in the database. So the
+ // current state of the execution of the process is stored in the
+ // database.
+ jbpmContext.save(processInstance);
+ // The method below will get the process instance back out
+ // of the database and resume execution by providing another
+ // external signal.
+
+ }
+ finally
+ {
+ // Tear down the pojo persistence context.
+ jbpmContext.close();
+ }
+ }
+
+ public void theProcessInstanceContinuesWhenAnAsyncMessageIsReceived()
+ {
+ // The code in this method could be the content of a message driven bean.
+
+ // Lookup the pojo persistence context-builder that is configured above
+ JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
+ try
+ {
+
+ GraphSession graphSession = jbpmContext.getGraphSession();
+ // First, we need to get the process instance back out of the database.
+ // There are several options to know what process instance we are dealing
+ // with here. The easiest in this simple test case is just to look for
+ // the full list of process instances. That should give us only one
+ // result. So let's look up the process definition.
+
+ ProcessDefinition processDefinition =
+ graphSession.findLatestProcessDefinition("hello_world");
+
+ // Now, we search for all process instances of this process definition.
+ List processInstances =
+ graphSession.findProcessInstances(processDefinition.getId());
+
+ // Because we know that in the context of this unit test, there is
+ // only one execution. In real life, the processInstanceId can be
+ // extracted from the content of the message that arrived or from
+ // the user making a choice.
+ ProcessInstance processInstance =
+ (ProcessInstance)processInstances.get(0);
+
+ // Now we can continue the execution. Note that the processInstance
+ // delegates signals to the main path of execution (=the root token).
+ processInstance.signal();
+
+ // After this signal, we know the process execution should have
+ // arrived in the end-state.
+ assertTrue(processInstance.hasEnded());
+
+ // Now we can update the state of the execution in the database
+ jbpmContext.save(processInstance);
+
+ }
+ finally
+ {
+ // Tear down the pojo persistence context.
+ jbpmContext.close();
+ }
+ }
}
Modified: trunk/workflow/src/main/org/jboss/portal/workflow/test/PortalCMSPublish.java
===================================================================
---
trunk/workflow/src/main/org/jboss/portal/workflow/test/PortalCMSPublish.java 2007-01-09
00:35:52 UTC (rev 5968)
+++
trunk/workflow/src/main/org/jboss/portal/workflow/test/PortalCMSPublish.java 2007-01-09
13:41:06 UTC (rev 5969)
@@ -35,275 +35,270 @@
import junit.framework.TestCase;
/**
- *
* @author sohil.shah(a)jboss.com
- *
*/
-public class PortalCMSPublish extends TestCase
+public class PortalCMSPublish extends TestCase
{
- static JbpmConfiguration jbpmConfiguration = null;
- static ProcessDefinition processDefinition = null;
+ static JbpmConfiguration jbpmConfiguration = null;
+ static ProcessDefinition processDefinition = null;
- static
- {
- // An example configuration file such as this can be found in
- // 'src/config.files'. Typically the configuration information is in the
- // resource file 'jbpm.cfg.xml', but here we pass in the configuration
- // information as an XML string.
-
- // First we create a JbpmConfiguration statically. One JbpmConfiguration
- // can be used for all threads in the system, that is why we can safely
- // make it static.
+ static
+ {
+ // An example configuration file such as this can be found in
+ // 'src/config.files'. Typically the configuration information is in the
+ // resource file 'jbpm.cfg.xml', but here we pass in the configuration
+ // information as an XML string.
- jbpmConfiguration = JbpmConfiguration.parseXmlString(
- "<jbpm-configuration>" +
-
- // A jbpm-context mechanism separates the jbpm core
- // engine from the services that jbpm uses from
- // the environment.
-
- " <jbpm-context>" +
- " <service name='persistence' " +
- "
factory='org.jbpm.persistence.db.DbPersistenceServiceFactory' />" +
- " </jbpm-context>" +
-
- // Also all the resource files that are used by jbpm are
- // referenced from the jbpm.cfg.xml
-
- " <string name='resource.hibernate.cfg.xml' " +
- " value='conf/hibernate.cfg.xml' />" +
- " <string name='resource.business.calendar' " +
- "
value='org/jbpm/calendar/jbpm.business.calendar.properties' />" +
- " <string name='resource.default.modules' " +
- " value='org/jbpm/graph/def/jbpm.default.modules.properties'
/>" +
- " <string name='resource.converter' " +
- " value='org/jbpm/db/hibernate/jbpm.converter.properties'
/>" +
- " <string name='resource.action.types' " +
- " value='org/jbpm/graph/action/action.types.xml' />"
+
- " <string name='resource.node.types' " +
- " value='org/jbpm/graph/node/node.types.xml' />" +
- " <string name='resource.varmapping' " +
- " value='org/jbpm/context/exe/jbpm.varmapping.xml'
/>" +
- "</jbpm-configuration>"
- );
-
- processDefinition = ProcessDefinition.parseXmlString(
- "<process-definition name='approval_workflow'>" +
- " <start-state>" +
- " <transition to='request_approval'/>" +
- " </start-state>" +
- " <task-node name='request_approval'>"+
- " <task name='approve_publish'>" +
- " <assignment
class='org.jboss.portal.workflow.test.PublishAssignmentHandler'/>" +
- " </task>" +
- " <controller>" +
- " <variable name='path'
access='read'/>"+
- " </controller>"+
- " <transition name='approval' to='end'/>" +
- " <transition name='rejection' to='end'>"
+
- " <script name='signalRejection'>"+
- " <variable name='rejection'/>"+
- " <expression>"+
- " System.out.println(\"Running the rejection
script....\");rejection=true;"+
- " </expression>"+
- " </script>"+
- " </transition>"+
- " </task-node>"+
- " <end-state name='end'>" +
- " <event type='node-enter'>"+
- " <action
class='org.jboss.portal.workflow.test.Finalize'/>"+
- " </event>"+
- " </end-state>"+
- "</process-definition>"
- );
- }
-
- /**
- *
- */
- public void setUp()
- {
- jbpmConfiguration.createSchema();
- JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
- try
- {
- jbpmContext.deployProcessDefinition(processDefinition);
- }
- finally
- {
- jbpmContext.close();
- }
- }
+ // First we create a JbpmConfiguration statically. One JbpmConfiguration
+ // can be used for all threads in the system, that is why we can safely
+ // make it static.
- /**
- *
- */
- protected void tearDown() throws Exception
- {
- jbpmConfiguration.dropSchema();
- }
-
- public void testCMSPublish() throws Exception
- {
- long processId1 = this.createTask("/default/index.html");
- long processId2 = this.createTask("/default/index2.html");
-
- ApprovalThread t1 = new
ApprovalThread(processId1,"/default/index.html",true);
- ApprovalThread t2 = new
ApprovalThread(processId2,"/default/index2.html",false);
- Thread thread1 = new Thread(t1);
- Thread thread2 = new Thread(t2);
-
- thread1.start();
- thread2.start();
-
- while(!t1.done || !t2.done)
- {
- //busy wait here
- }
- }
-
- /**
- *
- * @param path
- * @return
- */
- private long createTask(String path)
- {
- long processId = 0;
- JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
- ProcessInstance processInstance = null;
- try
- {
- //The next line creates one execution of the process definition.
- // After construction, the process execution has one main path
- // of execution (=the root token) that is positioned in the
- // start-state.
- processInstance = jbpmContext.newProcessInstance("approval_workflow");
-
- //After construction, the process execution has one main path
- // of execution (=the root token).
- Token token = processInstance.getRootToken();
-
- //set the process variables
- processInstance.getContextInstance().setVariable("path",path);
-
- //start the workflow, starts the cms publish approval workflow
- //this creates a task to approve/reject a cms publish for the Admins
- token.signal();
- }
- finally
- {
- if(processInstance!=null)
- {
- jbpmContext.save(processInstance);
- processId = processInstance.getId();
+ jbpmConfiguration = JbpmConfiguration.parseXmlString(
+ "<jbpm-configuration>" +
+
+ // A jbpm-context mechanism separates the jbpm core
+ // engine from the services that jbpm uses from
+ // the environment.
+
+ " <jbpm-context>" +
+ " <service name='persistence' " +
+ "
factory='org.jbpm.persistence.db.DbPersistenceServiceFactory' />" +
+ " </jbpm-context>" +
+
+ // Also all the resource files that are used by jbpm are
+ // referenced from the jbpm.cfg.xml
+
+ " <string name='resource.hibernate.cfg.xml' " +
+ " value='conf/hibernate.cfg.xml' />" +
+ " <string name='resource.business.calendar' " +
+ "
value='org/jbpm/calendar/jbpm.business.calendar.properties' />" +
+ " <string name='resource.default.modules' " +
+ "
value='org/jbpm/graph/def/jbpm.default.modules.properties' />" +
+ " <string name='resource.converter' " +
+ "
value='org/jbpm/db/hibernate/jbpm.converter.properties' />" +
+ " <string name='resource.action.types' " +
+ " value='org/jbpm/graph/action/action.types.xml'
/>" +
+ " <string name='resource.node.types' " +
+ " value='org/jbpm/graph/node/node.types.xml'
/>" +
+ " <string name='resource.varmapping' " +
+ " value='org/jbpm/context/exe/jbpm.varmapping.xml'
/>" +
+ "</jbpm-configuration>"
+ );
+
+ processDefinition = ProcessDefinition.parseXmlString(
+ "<process-definition name='approval_workflow'>" +
+ " <start-state>" +
+ " <transition to='request_approval'/>" +
+ " </start-state>" +
+ " <task-node name='request_approval'>" +
+ " <task name='approve_publish'>" +
+ " <assignment
class='org.jboss.portal.workflow.test.PublishAssignmentHandler'/>" +
+ " </task>" +
+ " <controller>" +
+ " <variable name='path' access='read'/>"
+
+ " </controller>" +
+ " <transition name='approval' to='end'/>"
+
+ " <transition name='rejection' to='end'>"
+
+ " <script name='signalRejection'>" +
+ " <variable name='rejection'/>" +
+ " <expression>" +
+ " System.out.println(\"Running the rejection
script....\");rejection=true;" +
+ " </expression>" +
+ " </script>" +
+ " </transition>" +
+ " </task-node>" +
+ " <end-state name='end'>" +
+ " <event type='node-enter'>" +
+ " <action
class='org.jboss.portal.workflow.test.Finalize'/>" +
+ " </event>" +
+ " </end-state>" +
+ "</process-definition>"
+ );
+ }
+
+ /**
+ *
+ */
+ public void setUp()
+ {
+ jbpmConfiguration.createSchema();
+ JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
+ try
+ {
+ jbpmContext.deployProcessDefinition(processDefinition);
+ }
+ finally
+ {
+ jbpmContext.close();
+ }
+ }
+
+ /**
+ *
+ */
+ protected void tearDown() throws Exception
+ {
+ jbpmConfiguration.dropSchema();
+ }
+
+ public void testCMSPublish() throws Exception
+ {
+ long processId1 = this.createTask("/default/index.html");
+ long processId2 = this.createTask("/default/index2.html");
+
+ ApprovalThread t1 = new ApprovalThread(processId1, "/default/index.html",
true);
+ ApprovalThread t2 = new ApprovalThread(processId2,
"/default/index2.html", false);
+ Thread thread1 = new Thread(t1);
+ Thread thread2 = new Thread(t2);
+
+ thread1.start();
+ thread2.start();
+
+ while (!t1.done || !t2.done)
+ {
+ //busy wait here
+ }
+ }
+
+ /**
+ * @param path
+ * @return
+ */
+ private long createTask(String path)
+ {
+ long processId = 0;
+ JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
+ ProcessInstance processInstance = null;
+ try
+ {
+ //The next line creates one execution of the process definition.
+ // After construction, the process execution has one main path
+ // of execution (=the root token) that is positioned in the
+ // start-state.
+ processInstance =
jbpmContext.newProcessInstance("approval_workflow");
+
+ //After construction, the process execution has one main path
+ // of execution (=the root token).
+ Token token = processInstance.getRootToken();
+
+ //set the process variables
+ processInstance.getContextInstance().setVariable("path", path);
+
+ //start the workflow, starts the cms publish approval workflow
+ //this creates a task to approve/reject a cms publish for the Admins
+ token.signal();
+ }
+ finally
+ {
+ if (processInstance != null)
+ {
+ jbpmContext.save(processInstance);
+ processId = processInstance.getId();
+ }
+ jbpmContext.close();
+ }
+ return processId;
+ }
+
+ /**
+ * @param path
+ * @param processId
+ * @param manager
+ * @param reject
+ * @throws Exception
+ */
+ private void executeTask(String path, long processId, String manager, boolean reject)
throws Exception
+ {
+ JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
+ ProcessInstance processInstance = null;
+ try
+ {
+ // Now, we search for all process instances of this process definition.
+ processInstance = jbpmContext.loadProcessInstance(processId);
+
+ if (processInstance.hasEnded())
+ {
+ System.out.println("This process has already ended...");
+ return;
+ }
+
+ //here act as an Admin and approve/reject one of the tasks
+ Collection allTasks = processInstance.getTaskMgmtInstance().getTaskInstances();
+ String[] transitions = {"approval", "rejection"};
+ java.util.Random random = new java.util.Random(12343);
+ boolean markedForRejection = false;
+ for (Iterator itr = allTasks.iterator(); itr.hasNext();)
+ {
+ TaskInstance cour = (TaskInstance)itr.next();
+ if (markedForRejection)
+ {
+ cour.end(transitions[1]);
+ continue;
+ }
+ if (cour.getActorId().equals(manager))
+ {
+ System.out.println("Manager=" + cour.getActorId() +
"(" + processId + ")");
+ int randomIndex = Math.abs(random.nextInt() % 2);
+ if (randomIndex == 1)
+ {
+ //kill this task
+ markedForRejection = true;
+ cour.end(transitions[randomIndex]);
+ }
+ else
+ {
+ cour.end(transitions[randomIndex]);
+ break;
+ }
+ }
+ }
+ }
+ finally
+ {
+ if (processInstance != null)
+ {
+ jbpmContext.save(processInstance);
+ }
+ jbpmContext.close();
+ }
+ }
+
+
+ /**
+ * @author sshah
+ */
+ private class ApprovalThread implements Runnable
+ {
+ long processId = 0;
+ String path = null;
+ boolean reject = false;
+ boolean done = false;
+
+ private ApprovalThread(long processId, String path, boolean reject)
+ {
+ this.processId = processId;
+ this.path = path;
+ this.reject = reject;
+ }
+
+ public void run()
+ {
+ try
+ {
+ String[] managers = {"Admin", "eric.brown(a)jboss.com",
"sohil.shah(a)jboss.com"};
+ for (int i = 0; i < managers.length; i++)
+ {
+ executeTask(this.path, this.processId, managers[i], this.reject);
+ }
+ }
+ catch (Exception e)
+ {
+ throw new RuntimeException(e);
+ }
+ finally
+ {
+ done = true;
}
- jbpmContext.close();
}
- return processId;
}
-
- /**
- *
- * @param path
- * @param processId
- * @param manager
- * @param reject
- * @throws Exception
- */
- private void executeTask(String path,long processId,String manager,boolean reject)
throws Exception
- {
- JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
- ProcessInstance processInstance = null;
- try
- {
- // Now, we search for all process instances of this process definition.
- processInstance = jbpmContext.loadProcessInstance(processId);
-
- if(processInstance.hasEnded())
- {
- System.out.println("This process has already ended...");
- return;
- }
-
- //here act as an Admin and approve/reject one of the tasks
- Collection allTasks = processInstance.getTaskMgmtInstance().getTaskInstances();
- String[] transitions = {"approval","rejection"};
- java.util.Random random = new java.util.Random(12343);
- boolean markedForRejection = false;
- for(Iterator itr=allTasks.iterator();itr.hasNext();)
- {
- TaskInstance cour = (TaskInstance)itr.next();
- if(markedForRejection)
- {
- cour.end(transitions[1]);
- continue;
- }
- if(cour.getActorId().equals(manager))
- {
-
System.out.println("Manager="+cour.getActorId()+"("+processId+")");
- int randomIndex = Math.abs(random.nextInt()%2);
- if(randomIndex == 1)
- {
- //kill this task
- markedForRejection = true;
- cour.end(transitions[randomIndex]);
- }
- else
- {
- cour.end(transitions[randomIndex]);
- break;
- }
- }
- }
- }
- finally
- {
- if(processInstance!=null)
- {
- jbpmContext.save(processInstance);
- }
- jbpmContext.close();
- }
- }
-
-
- /**
- *
- * @author sshah
- *
- */
- private class ApprovalThread implements Runnable
- {
- long processId = 0;
- String path = null;
- boolean reject = false;
- boolean done = false;
- private ApprovalThread(long processId,String path,boolean reject)
- {
- this.processId = processId;
- this.path = path;
- this.reject = reject;
- }
-
- public void run()
- {
- try
- {
- String[] managers =
{"Admin","eric.brown@jboss.com","sohil.shah(a)jboss.com"};
- for(int i=0;i<managers.length;i++)
- {
- executeTask(this.path,this.processId,managers[i],this.reject);
- }
- }
- catch(Exception e)
- {
- throw new RuntimeException(e);
- }
- finally
- {
- done = true;
- }
- }
- }
}
Modified:
trunk/workflow/src/main/org/jboss/portal/workflow/test/PublishAssignmentHandler.java
===================================================================
---
trunk/workflow/src/main/org/jboss/portal/workflow/test/PublishAssignmentHandler.java 2007-01-09
00:35:52 UTC (rev 5968)
+++
trunk/workflow/src/main/org/jboss/portal/workflow/test/PublishAssignmentHandler.java 2007-01-09
13:41:06 UTC (rev 5969)
@@ -30,37 +30,36 @@
import org.jbpm.taskmgmt.exe.TaskInstance;
/**
- *
* @author sohil.shah(a)jboss.com
- *
*/
-public class PublishAssignmentHandler implements AssignmentHandler {
+public class PublishAssignmentHandler implements AssignmentHandler
+{
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
- /**
- *
- */
- public void assign(Assignable assignable,ExecutionContext executionContext)
- {
- int taskInstances = 0;
- Collection assignedTasks = executionContext.getTaskMgmtInstance().getTaskInstances();
- if(assignedTasks!=null)
- {
- taskInstances = assignedTasks.size();
- }
-
- if(taskInstances == 1)
- {
- System.out.println("Assigning this task to the Managers");
- String[] managers =
{"Admin","sohil.shah@jboss.com","eric.brown(a)jboss.com"};
- assignable.setActorId(managers[0]);
- for(int i=1;i<managers.length;i++)
- {
- TaskInstance t = executionContext.getTaskMgmtInstance().
- createTaskInstance(((TaskInstance)assignable).getTask(),executionContext);
- t.setActorId(managers[i]);
- }
- }
- }
+ /**
+ *
+ */
+ public void assign(Assignable assignable, ExecutionContext executionContext)
+ {
+ int taskInstances = 0;
+ Collection assignedTasks =
executionContext.getTaskMgmtInstance().getTaskInstances();
+ if (assignedTasks != null)
+ {
+ taskInstances = assignedTasks.size();
+ }
+
+ if (taskInstances == 1)
+ {
+ System.out.println("Assigning this task to the Managers");
+ String[] managers = {"Admin", "sohil.shah(a)jboss.com",
"eric.brown(a)jboss.com"};
+ assignable.setActorId(managers[0]);
+ for (int i = 1; i < managers.length; i++)
+ {
+ TaskInstance t = executionContext.getTaskMgmtInstance().
+ createTaskInstance(((TaskInstance)assignable).getTask(),
executionContext);
+ t.setActorId(managers[i]);
+ }
+ }
+ }
}
Modified: trunk/workflow/src/resources/portal-workflow-sar/META-INF/jboss-service.xml
===================================================================
--- trunk/workflow/src/resources/portal-workflow-sar/META-INF/jboss-service.xml 2007-01-09
00:35:52 UTC (rev 5968)
+++ trunk/workflow/src/resources/portal-workflow-sar/META-INF/jboss-service.xml 2007-01-09
13:41:06 UTC (rev 5969)
@@ -31,7 +31,7 @@
<xmbean/>
<depends>jboss.jca:service=DataSourceBinding,name=@portal.datasource.name@</depends>
<attribute name="DoChecking">true</attribute>
- <attribute
name="ConfigLocation">conf/hibernate.cfg.xml</attribute>
+ <attribute
name="ConfigLocation">conf/hibernate/workflow/hibernate.cfg.xml</attribute>
<attribute
name="JNDIName">java:/portal/workflow/WorkFlowSessionFactory</attribute>
</mbean>
@@ -49,7 +49,7 @@
<jbpm-context>
<service name="persistence"
factory="org.jbpm.persistence.db.DbPersistenceServiceFactory"/>
</jbpm-context>
- <string name="resource.hibernate.cfg.xml"
value="conf/hibernate.cfg.xml"/>
+ <string name="resource.hibernate.cfg.xml"
value="conf/hibernate/workflow/hibernate.cfg.xml"/>
<string name="resource.business.calendar"
value="org/jbpm/calendar/jbpm.business.calendar.properties"/>
<string name="resource.default.modules"
value="org/jbpm/graph/def/jbpm.default.modules.properties"/>
<string name="resource.converter"
value="org/jbpm/db/hibernate/jbpm.converter.properties"/>