Here is my application.xml (which is auto-generated by our maven build)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE application PUBLIC
"-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN"
"http://java.sun.com/dtd/application_1_3.dtd">
<application>
<display-name>workflow-ear</display-name>
<description>Contract for Consumers of Blackbook Components, defining and
centralizing the dependency management contract</description>
<module>
<ejb>workflow-ejb-2.7.0.jar</ejb>
</module>
<module>
<ejb>usermgmt-ejb-2.7.0.jar</ejb>
</module>
<module>
<web>
<web-uri>usermgmt-war-2.7.0.war</web-uri>
<context-root>usermgmt</context-root>
</web>
</module>
<module>
<web>
<web-uri>workflow-war-2.7.0.war</web-uri>
<context-root>workflow</context-root>
</web>
</module>
</application>
And here is the jboss-app.xml
<jboss-app>
<loader-repository >
dot.com:loader=workflow.ear
<loader-repository-config>
java2ParentDelegaton=true
</loader-repository-config>
</loader-repository>
</jboss-app>
Here is the WorkflowEngine bean class
package workflow.ejb.server;
import java.io.Serializable;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.security.RolesAllowed;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jboss.ejb3.annotation.LocalBinding;
import security.ejb.client.User;
import workflow.ejb.client.ExecutionDetail;
import workflow.ejb.client.ExecutionSummary;
import workflow.ejb.client.ResultingParams;
import workflow.ejb.client.StateDefinition;
import workflow.ejb.client.StepDefinition;
import workflow.ejb.client.TransitionDefinition;
import workflow.ejb.client.TransitionReference;
import workflow.ejb.client.WorkflowEngineLocal;
import workflow.ejb.util.ParamUtil;
import workflow.ejb.util.XPDLUtil;
/**
* Processes workflow. Uses Declaritive Transaction Mgmt for individual methods.
*/
@Stateless
@RolesAllowed( { "UNCLASSIFIED" })
@LocalBinding(jndiBinding = "workflow/WorkflowEngine/local")
@TransactionManagement(value = TransactionManagementType.CONTAINER)
public class WorkflowEngine implements Serializable, WorkflowEngineLocal {
/**
* The class logger
*/
private static Log logger = LogFactory.getLog(WorkflowEngine.class);
/** workflow engine */
@javax.annotation.Resource(mappedName = "workflow/WorkflowEngine/local")
private WorkflowEngineLocal workflowEngineLocal;
/**
* The entity manager
*/
protected @PersistenceContext(unitName = "workflow")
EntityManager em;
/**
* Sets the execution summary id of the execution detail.
*
* @param executionSummaryId
* @param executionDetailCopy
*/
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void addExecutionDetailToExecutionSummary(long executionSummaryId,
ExecutionDetail executionDetailCopy) {
Query updateComplete = em
.createNativeQuery("update EXECUTION_DETAIL set EX_SUMMARY_ID = :first where ID = :second");
updateComplete.setParameter("first", executionSummaryId);
updateComplete.setParameter("second", executionDetailCopy.getId());
updateComplete.executeUpdate();
}
/**
* Make sure that all transition definitions for a join have an associated
* execution detail meaning that the join can proceed.
*
* @param tdList
* @param esId
* @return boolean
*/
@SuppressWarnings("unchecked")
public boolean areAllJoinTransitionsFinished(
List<TransitionDefinition> tdList, long esId) {
if (tdList == null) {
logger.error("No transitions found for fork in execution summary: "
+ esId);
return false;
}
for (TransitionDefinition td : tdList) {
Query query = em
.createQuery("from ExecutionDetail e "
+ " WHERE e.associatedStepId =:first AND e.executionSummaryId =:second AND e.completed =:third");
query.setParameter("first", td.getId());
query.setParameter("second", esId);
query.setParameter("third", Long.parseLong("1"));
List<ExecutionDetail> edList = query.getResultList();
long edSize = edList.size();
if (edSize < 1) {
return false;
}
}
return true;
}
/**
* Checks if an execution detail exists for an execution summary and step
* definition id.
*
* @param executionSummaryId
* @param stepDefinitionId
* @return int
*/
@SuppressWarnings("unchecked")
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public int checkIfExecutionDetailExists(long executionSummaryId,
long stepDefinitionId) {
Query lockQuery = em
.createNativeQuery("SELECT ID FROM EXECUTION_DETAIL WHERE EX_SUMMARY_ID = :first AND STEP_ID= :second ");
lockQuery.setParameter("first", executionSummaryId);
lockQuery.setParameter("second", stepDefinitionId);
List results = lockQuery.getResultList();
int noUpdate = 0;
if (results != null && results.size() != 0) {
noUpdate = 1;
}
return noUpdate;
}
/**
* Creates a result params entry for an execution detail and execution
* summary. This method does not insert the LOB, PARAMS_AS_XML.
*
* @param executionSummaryId
* @param executionDetailId
* @return int - number inserted
*/
@SuppressWarnings("unchecked")
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public int createResultParams(long executionSummaryId,
long executionDetailId) {
// adding execution ids to entry and result param tables.
Query insertRPQuery = em
.createNativeQuery("INSERT INTO RESULTING_PARAMS(EX_DETAIL_ID,EX_SUMMARY_ID) "
+ " VALUES (:first,:second)");
insertRPQuery.setParameter("first", executionDetailId);
insertRPQuery.setParameter("second", executionSummaryId);
int noInsert = insertRPQuery.executeUpdate();
return noInsert;
}
/**
* Get previous steps' execution params add the definition params.
*
* @param eSummaryId
* @param edId
* @param stateDef
* @return params
*/
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public Map<String, Object> getDefinitionParams(long eSummaryId, long edId,
StateDefinition stateDef) {
// get previous steps' execution params
Map<String, Object> params = new HashMap<String, Object>();
// add the definition params.
params.putAll(stateDef.getParams());
return params;
}
/**
* Get Execution Detail based on execution summary and step definition. This
* method is highly nested.
*
* @param executionSummaryId
* The id of an ExecutionSummary
* @param stepDefinitionId
* The id of a StepDefinition
* @return ExecutionDetail the execution detail for the associated
* ExecutionSummary and StepDefinition.
*/
@SuppressWarnings("unchecked")
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public ExecutionDetail getExecutionDetail(long executionSummaryId,
long stepDefinitionId) {
int noUpdate = workflowEngineLocal.checkIfExecutionDetailExists(
executionSummaryId, stepDefinitionId);
if (noUpdate == 0) {
workflowEngineLocal.insertExecutionDetail(executionSummaryId,
stepDefinitionId);
}
Query query = em
.createQuery("from ExecutionDetail e WHERE e.executionSummaryId =:first AND e.associatedStepId =:second");
// get execution detail of previous step.
query.setParameter("first", executionSummaryId);
query.setParameter("second", stepDefinitionId);
// long edqtime = System.currentTimeMillis();
List<ExecutionDetail> edList = query.getResultList();
ExecutionDetail eDetail = null;
// Add in the results in order.
for (ExecutionDetail executionDetailFromQuery : edList) {
eDetail = executionDetailFromQuery;
}
// adding execution ids to entry and result param tables.
if (noUpdate == 0) {
workflowEngineLocal.createResultParams(executionSummaryId, eDetail
.getId());
}
return eDetail;
}
/**
* Get the next TransitionDefinition for a fromState.
*
* @param stateDefId
* @return TransitionDefinition
*/
@SuppressWarnings("unchecked")
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public TransitionDefinition getNextTransitionDefinition(long stateDefId) {
Query query = em
.createQuery("from TransitionDefinition t WHERE t.fromState.id =:first ");
query.setParameter("first", stateDefId);
List<TransitionDefinition> edList = query.getResultList();
TransitionDefinition td = null;
if (edList != null && edList.size() > 0) {
td = edList.get(0);
}
return td;
}
/**
* Gets the resulting params for an execution detail.
*
* @param edId
*
* @param stepDefinition
* a step definition
* @param esId
* Execution summary id
* @return Map containing parameters
*/
@SuppressWarnings("unchecked")
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public Map<String, Object> getPersistedParams(long edId, long esId) {
Query query = em
.createQuery(
"from ResultingParams rp WHERE rp.exSummaryId =:first AND rp.exDetailId =:second")
.setHint("org.hibernate.readOnly", Boolean.TRUE);
// get execution detail of previous step.
query.setParameter("first", esId);
query.setParameter("second", edId);
List<ResultingParams> resultParamList = query.getResultList();
Map<String, Object> params = new HashMap<String, Object>();
if (resultParamList != null) {
// Add in the results in order.
for (ResultingParams resultParam : resultParamList) {
params.putAll(ParamUtil.paramsAsXML(resultParam
.getResultingParamsAsXML(), true));
}
}
return params;
}
/**
* Gets the params from the previous transition definition.
*
* @param eSummaryId
* @param stateDef
* @return runtimeParams
*/
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public Map<String, Object> getRuntimeParams(long eSummaryId,
StateDefinition stateDef) {
Map<String, Object> runtimeParams = new HashMap<String, Object>();
List<TransitionDefinition> transitionDefinitionList = workflowEngineLocal
.getTransitionDefinitionsWithToId(stateDef.getId());
for (TransitionDefinition td : transitionDefinitionList) {
ExecutionDetail prevED = workflowEngineLocal.getExecutionDetail(
eSummaryId, td.getFromState().getId());
runtimeParams.putAll(workflowEngineLocal.getPersistedParams(prevED
.getId(), eSummaryId));
}
return runtimeParams;
}
/**
* Get TransitionDefinitions for a transitionReference id.
*
* @param transitionReferenceId
* @return List of TransitionDefinitionS
*/
@SuppressWarnings("unchecked")
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public List<TransitionDefinition> getTransitionDefinitions(
long transitionReferenceId) {
Query fetchTQuery = em
.createQuery(
"from TransitionDefinition td WHERE td.transitionReference.id =:first")
.setHint("org.hibernate.readOnly", Boolean.TRUE);
fetchTQuery.setParameter("first", transitionReferenceId);
List<TransitionDefinition> transitionDefinitionList = fetchTQuery
.getResultList();
if (transitionDefinitionList != null) {
}
return transitionDefinitionList;
}
/**
* Get TransitionDefinitions for a toState id.
*
* @param toStateDefId
* @return List of TransitionDefinitionS
*/
@SuppressWarnings("unchecked")
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public List<TransitionDefinition> getTransitionDefinitionsWithToId(
long toStateDefId) {
Query fetchTQuery = em.createQuery(
"from TransitionDefinition td WHERE td.toState.id =:first")
.setHint("org.hibernate.readOnly", Boolean.TRUE);
fetchTQuery.setParameter("first", toStateDefId);
List<TransitionDefinition> tdList = new ArrayList<TransitionDefinition>();
try {
List<TransitionDefinition> tempTdList = fetchTQuery.getResultList();
if (tempTdList != null && tempTdList.size() > 0) {
tdList = getTransitionDefinitions(tempTdList.get(0)
.getTransitionReference().getId());
}
} catch (javax.persistence.NoResultException e) {
logger.error("No transition defs found with " + toStateDefId
+ " as a 'To' state.", e);
}
return tdList;
}
/**
* Handle action for a state definition.
*
* @param stateDefinition
* a state Definition
* @param definitionParams
* @param runtimeParams
* @param params
* The state parameters
* @param user
* a User
* @return a Map<String, Object> the results of a action class method
*/
@SuppressWarnings("unchecked")
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public Map<String, Object> handleAction(StateDefinition stateDefinition,
Map<String, Object> definitionParams,
Map<String, Object> runtimeParams, User user) {
Map<String, Object> retmap = null;
try {
definitionParams.put("user", user);
Class c = Class.forName(stateDefinition.getActionClass());
Class[] argClasses = new Class[3];
argClasses[0] = StateDefinition.class;
argClasses[1] = Map.class;
argClasses[2] = Map.class;
Method mymethod = c.getMethod(stateDefinition.getActionMethod(),
argClasses);
Object[] args = new Object[3];
args[0] = stateDefinition;
args[1] = definitionParams;
args[2] = runtimeParams;
Object obj = c.newInstance();
retmap = (Map<String, Object>) mymethod.invoke(obj, args);
} catch (Exception e) {
logger.error("An error occured while running an algorithm", e);
throw new RuntimeException(
"An error occured while running an algorithm");
}
return retmap;
}
/**
* Create execution detail.
*
* @param executionSummaryId
* @param stepDefinitionId
* @return number inserted
*/
@SuppressWarnings("unchecked")
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public int insertExecutionDetail(long executionSummaryId,
long stepDefinitionId) {
Query insertQuery = em
.createNativeQuery("INSERT INTO EXECUTION_DETAIL(EX_SUMMARY_ID, STEP_ID) "
+ " VALUES (:first, :second)");
insertQuery.setParameter("first", executionSummaryId);
insertQuery.setParameter("second", stepDefinitionId);
int noInsert = insertQuery.executeUpdate();
return noInsert;
}
/**
* Send message to queue.
*
* @param eSummaryId
* @param tdId
* @param user
*/
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public void postMessageForNextStep(long eSummaryId, long tdId, User user) {
WorkflowUtil.sendMessage(WorkflowManager.queueName, tdId, user,
eSummaryId);
}
/**
* Get the ExecutionDetail,StepDefinition,ExecutionSummary and process the
* next step.
*
* @param eSummaryId
* @param stepDefId
* @param user
*/
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public void process(long eSummaryId, long stepDefId, User user) {
// get objects by their id.
ExecutionDetail executionDetail = workflowEngineLocal
.getExecutionDetail(eSummaryId, stepDefId);
StepDefinition stepDefinition = em
.find(StepDefinition.class, stepDefId);
ExecutionSummary executionSummary = em.find(ExecutionSummary.class,
eSummaryId);
// if all needed objects were found, process this step
if (executionSummary != null
&& executionSummary.getWhenCompleted() == null
&& stepDefinition != null) {
workflowEngineLocal.processStep(executionSummary, stepDefinition,
executionDetail, user);
}
}
/**
* Process a FORK step.
*
* @param eDetail
* @param tDef
* @param tRef
* @param eSummaryId
* @param user
*/
@SuppressWarnings("unchecked")
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public void processFork(ExecutionDetail eDetail, TransitionDefinition tDef,
TransitionReference tRef, long eSummaryId, User user) {
// place all transitions into queue. Since each will get called
// do the same thing as a
// series. We just don't have a condition.
eDetail.setActionClassCalled("FORK");
List<TransitionDefinition> transitionDefinitionList = workflowEngineLocal
.getTransitionDefinitions(tRef.getId());
for (TransitionDefinition td : transitionDefinitionList) {
workflowEngineLocal.setExecutionDetailCompleted(eDetail);
workflowEngineLocal.postMessageForNextStep(eSummaryId, td
.getToState().getId(), user);
}
}
/**
* Process a JOIN step.
*
* @param eDetail
* @param tDef
* @param tRef
* @param eSummaryId
* @param user
*/
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void processJoin(ExecutionDetail eDetail, TransitionDefinition tDef,
TransitionReference tRef, long eSummaryId, User user) {
List<TransitionDefinition> transitionDefinitionList = workflowEngineLocal
.getTransitionDefinitions(tRef.getId());
workflowEngineLocal.setExecutionDetailCompleted(eDetail);
if (workflowEngineLocal.areAllJoinTransitionsFinished(
transitionDefinitionList, eSummaryId)) {
workflowEngineLocal.postMessageForNextStep(eSummaryId, tDef
.getToState().getId(), user);
}
}
/**
*
* @see workflow.ejb.client.WorkflowEngineLocal#processLoop(long,
* workflow.ejb.client.ExecutionDetail,
* workflow.ejb.client.StateDefinition, security.ejb.client.User)
*/
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public void processLoop(long eSummaryId, ExecutionDetail eDetail,
StateDefinition stateDef, User user) {
String interval = Long.toString(stateDef.getLoopInterval());
if (!interval.contains(".")) {
interval = interval + ".0";
}
try {
if (stateDef.getWhenToTest().equalsIgnoreCase("before")) {
for (; stateDef.getLoopCounter() < stateDef.getLoopMaximum(); stateDef
.setLoopCounter(stateDef.getLoopCounter() + 1)) {
processStateAlgorithm(eSummaryId, eDetail.getId(),
stateDef, user);
Thread.sleep(stateDef.getLoopInterval());
}
}
// whenToTest is assumed to be "after"
else {
do {
processStateAlgorithm(eSummaryId, eDetail.getId(),
stateDef, user);
stateDef.setLoopCounter(stateDef.getLoopCounter() + 1);
Thread.sleep(stateDef.getLoopInterval());
} while (stateDef.getLoopCounter() < stateDef.getLoopMaximum());
}
} catch (InterruptedException e) {
logger.error("Interruption exception received. ", e);
}
}
/**
* Process a SERIES.
*
* @param eSummaryId
* @param tDef
* @param eDetail
* @param user
*/
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public void processSeries(long eSummaryId, TransitionDefinition tDef,
ExecutionDetail eDetail, User user) {
ExecutionDetail prevED = workflowEngineLocal.getExecutionDetail(
eSummaryId, tDef.getFromState().getId());
Map<String, Object> params = workflowEngineLocal.getPersistedParams(
prevED.getId(), eSummaryId);
// evaluate condition to move to next state.
boolean res = tDef.getConditionForEval() == null ? true : XPDLUtil
.evaluateCondition(tDef.getConditionForEval(), params);
if (res) {
// move to the next state.
eDetail = workflowEngineLocal.getExecutionDetail(eSummaryId, tDef
.getId());
workflowEngineLocal.setExecutionDetailCompleted(eDetail);
workflowEngineLocal.postMessageForNextStep(eSummaryId, tDef
.getToState().getId(), user);
}
}
/**
* Runs the algorithm.
*
* @param eSummary
* @param stateDef
* @param eDetail
* @param user
* @param em
*/
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void processStateDefinition(ExecutionSummary eSummary,
StateDefinition stateDef, ExecutionDetail eDetail, User user) {
try {
boolean hasLoop = (stateDef.getLoopMaximum() > 0);
if (hasLoop) {
processLoop(eSummary.getId(), eDetail, stateDef, user);
} else {
processStateAlgorithm(eSummary.getId(), eDetail.getId(),
stateDef, user);
}
TransitionDefinition td = workflowEngineLocal
.getNextTransitionDefinition(stateDef.getId());
// finished state processing
workflowEngineLocal.setExecutionDetailCompleted(eDetail);
if (td != null) {
// follow next transition
workflowEngineLocal.postMessageForNextStep(eSummary.getId(), td
.getId(), user);
return;
} else {
workflowEngineLocal.endWorkflow(eSummary);
}
} catch (Exception e) {
workflowEngineLocal.endWorkflowInError(eSummary, eDetail);
logger.debug(e.toString());
}
}
/**
*
* @see workflow.ejb.client.WorkflowEngineLocal#endWorkflow(workflow.ejb.client.ExecutionSummary)
*/
public void endWorkflow(ExecutionSummary eSummary) {
// end workflow
Date completed = new Date();
eSummary.setWhenCompleted(completed);
Query updateComplete = em
.createNativeQuery("update EXECUTION_SUMMARY set WHEN_COMPLETED = :first where ID = :second");
updateComplete.setParameter("first", completed);
updateComplete.setParameter("second", eSummary.getId());
updateComplete.executeUpdate();
}
/**
*
* @see workflow.ejb.client.WorkflowEngineLocal#endWorkflowInError(workflow.ejb.client.ExecutionSummary,
* workflow.ejb.client.ExecutionDetail)
*/
public void endWorkflowInError(ExecutionSummary eSummary,
ExecutionDetail eDetail) {
workflowEngineLocal.setExecutionDetailCompleted(eDetail);
workflowEngineLocal.endWorkflow(eSummary);
}
/**
* Process the state algorithm
*
* @param eSummaryId
* Summary ID
* @param eDetailId
* Detail ID
* @param stateDef
* State definition
* @param user
* User
*/
private void processStateAlgorithm(long eSummaryId, long eDetailId,
StateDefinition stateDef, User user) {
// get params needed to process step
Map<String, Object> defParams = workflowEngineLocal
.getDefinitionParams(eSummaryId, eDetailId, stateDef);
Map<String, Object> runtimeParams = new HashMap<String, Object>();
List<TransitionDefinition> transitionDefinitionList = workflowEngineLocal
.getTransitionDefinitionsWithToId(stateDef.getId());
for (TransitionDefinition td : transitionDefinitionList) {
ExecutionDetail prevED = workflowEngineLocal.getExecutionDetail(
eSummaryId, td.getFromState().getId());
runtimeParams.putAll(workflowEngineLocal.getPersistedParams(prevED
.getId(), eSummaryId));
}
// run the algorithm
if (stateDef.getActionClass() != null
&& stateDef.getActionClass().length() > 0) {
Map<String, Object> resultMap = workflowEngineLocal.handleAction(
stateDef, defParams, runtimeParams, user);
workflowEngineLocal.updatePersistedResultParams(eDetailId,
eSummaryId, resultMap);
} else // must be a fork or join state
{
workflowEngineLocal.updatePersistedResultParams(eDetailId,
eSummaryId, runtimeParams);
}
}
/**
* Process step.
*
* @param executionSummary
* an ExecutionSummary
* @param stepDefinition
* a StateDefinition
* @param executionDetail
* an executionDetail
* @param user
* a User
* @param params
*/
@SuppressWarnings("unchecked")
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public void processStep(ExecutionSummary executionSummary,
StepDefinition stepDefinition, ExecutionDetail executionDetail,
User user) {
if (stepDefinition instanceof StateDefinition) {
StateDefinition stateDef = (StateDefinition) stepDefinition;
workflowEngineLocal.processStateDefinition(executionSummary,
stateDef, executionDetail, user);
} else if (stepDefinition instanceof TransitionDefinition) {
workflowEngineLocal.processTransitionDefinition(executionSummary,
(TransitionDefinition) stepDefinition, executionDetail,
user);
} else {
logger.error("Cannot understand what to process for step with id="
+ stepDefinition.getId());
throw new RuntimeException(
"Cannot understand what to process for step with id="
+ stepDefinition.getId());
}
workflowEngineLocal.addExecutionDetailToExecutionSummary(
executionSummary.getId(), executionDetail);
}
/**
* Process a TransitionDefinition.
*
* @param eSummary
* @param tDef
* @param eDetail
* @param user
*/
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public void processTransitionDefinition(ExecutionSummary eSummary,
TransitionDefinition tDef, ExecutionDetail eDetail, User user) {
TransitionReference tRef = tDef.getTransitionReference();
if (tRef.getTransitionType() == TransitionReference.FORK) {
workflowEngineLocal.processFork(eDetail, tDef, tRef, eSummary
.getId(), user);
} else if (tRef.getTransitionType() == TransitionReference.JOIN) {
workflowEngineLocal.processJoin(eDetail, tDef, tRef, eSummary
.getId(), user);
} else if (tRef.getTransitionType() == TransitionReference.SERIES) {
workflowEngineLocal.processSeries(eSummary.getId(), tDef, eDetail,
user);
} else {
logger.error("Transition type " + tRef.getTransitionType()
+ "is not understood.");
throw new RuntimeException("Transition type "
+ tRef.getTransitionType() + "is not understood.");
}
}
/**
* Sets an ExecutionDetail as completed.
*
* @param eDetail
* @return number updated
*/
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public int setExecutionDetailCompleted(ExecutionDetail eDetail) {
Query completed = em
.createNativeQuery("UPDATE EXECUTION_DETAIL SET COMPLETED = '1' WHERE ID = :first");
completed.setParameter("first", eDetail.getId());
int numUpdated = completed.executeUpdate();
eDetail.setCompleted(1);
return numUpdated;
}
/**
* Updates the LOB, PARAMS_AS_XML.
*
* @param edId
* @param esId
* @param params
*/
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void updatePersistedResultParams(long edId, long esId,
Map<String, Object> params) {
Query updateResultParamsQuery = em
.createNativeQuery("UPDATE RESULTING_PARAMS SET RESULTING_PARAMS_AS_XML = :first WHERE EX_DETAIL_ID = :second");
updateResultParamsQuery.setParameter("first", ParamUtil.paramsFromMap(
params, true));
updateResultParamsQuery.setParameter("second", edId);
updateResultParamsQuery.executeUpdate();
}
}
And here is the WorkflowEngineLocal interface
package workflow.ejb.client;
import java.util.List;
import java.util.Map;
import javax.ejb.Local;
import security.ejb.client.User;
/**
* The local interface to the Workflow Engine
*/
@Local
public interface WorkflowEngineLocal {
/**
* Sets the execution summary id of the execution detail.
*
* @param executionSummaryId
* @param executionDetailCopy
*/
public void addExecutionDetailToExecutionSummary(long executionSummaryId,
ExecutionDetail executionDetailCopy);
/**
* Make sure that all transition definitions for a join have an associated
* execution detail meaning that the join can proceed.
*
* @param tdList
* @param esId
* @return boolean
*/
public boolean areAllJoinTransitionsFinished(
List<TransitionDefinition> tdList, long esId);
/**
* Checks if an execution detail exists for an execution summary and step
* definition id.
*
* @param executionSummaryId
* @param stepDefinitionId
* @return int
*/
public int checkIfExecutionDetailExists(long executionSummaryId,
long stepDefinitionId);
/**
* Creates a result params entry for an execution detail and execution
* summary. This method does not insert the LOB, PARAMS_AS_XML.
*
* @param executionSummaryId
* @param executionDetailId
* @return int - number inserted
*/
public int createResultParams(long executionSummaryId,
long executionDetailId);
/**
* Get previous steps' execution params add the definition params.
*
* @param eSummaryId
* @param edId
* @param stateDef
* @return params
*/
public Map<String, Object> getDefinitionParams(long eSummaryId, long edId,
StateDefinition stateDef);
/**
* Get Execution Detail based on execution summary and step definition. This
* method is highly nested.
*
* @param executionSummaryId
* The id of an ExecutionSummary
* @param stepDefinitionId
* The id of a StepDefinition
* @return ExecutionDetail the execution detail for the associated
* ExecutionSummary and StepDefinition.
*/
public ExecutionDetail getExecutionDetail(long executionSummaryId,
long stepDefinitionId);
/**
* Get the next TransitionDefinition for a fromState.
*
* @param stateDefId
* @return TransitionDefinition
*/
public TransitionDefinition getNextTransitionDefinition(long stateDefId);
/**
* Gets the resulting params for an execution detail.
*
* @param edId
*
* @param stepDefinition
* a step definition
* @param esId
* Execution summary id
* @return Map containing parameters
*/
public Map<String, Object> getPersistedParams(long edId, long esId);
/**
* Gets the params from the previous transition definition.
*
* @param eSummaryId
* @param stateDef
* @return runtimeParams
*/
public Map<String, Object> getRuntimeParams(long eSummaryId,
StateDefinition stateDef);
/**
* Get TransitionDefinitions for a transitionReference id.
*
* @param transitionReferenceId
* @return List of TransitionDefinitionS
*/
public List<TransitionDefinition> getTransitionDefinitions(
long transitionReferenceId);
/**
* Get TransitionDefinitions for a toState id.
*
* @param toStateDefId
* @return List of TransitionDefinitionS
*/
public List<TransitionDefinition> getTransitionDefinitionsWithToId(
long toStateDefId);
/**
* Handle action for a state definition.
*
* @param stateDefinition
* a state Definition
* @param definitionParams
* @param runtimeParams
* @param params
* The state parameters
* @param user
* a User
* @return a Map<String, Object> the results of a action class method
*/
public Map<String, Object> handleAction(StateDefinition stateDefinition,
Map<String, Object> definitionParams,
Map<String, Object> runtimeParams, User user);
/**
* Create execution detail.
*
* @param executionSummaryId
* @param stepDefinitionId
* @return number inserted
*/
public int insertExecutionDetail(long executionSummaryId,
long stepDefinitionId);
/**
* Send message to queue.
*
* @param eSummaryId
* @param tdId
* @param user
*/
public void postMessageForNextStep(long eSummaryId, long tdId, User user);
/**
* Get the ExecutionDetail,StepDefinition,ExecutionSummary and process the
* next step.
*
* @param eSummaryId
* @param stepDefId
* @param user
*/
public void process(long eSummaryId, long stepDefId, User user);
/**
* Process a FORK step.
*
* @param eDetail
* @param tDef
* @param tRef
* @param eSummaryId
* @param user
*/
public void processFork(ExecutionDetail eDetail, TransitionDefinition tDef,
TransitionReference tRef, long eSummaryId, User user);
/**
* Process a JOIN step.
*
* @param eDetail
* @param tDef
* @param tRef
* @param eSummaryId
* @param user
*/
public void processJoin(ExecutionDetail eDetail, TransitionDefinition tDef,
TransitionReference tRef, long eSummaryId, User user);
/**
* Process a LOOP.
*
*/
public void processLoop(long eSummaryId, ExecutionDetail eDetail,
StateDefinition stateDef, User user);
/**
* Process a SERIES.
*
* @param eSummaryId
* @param tDef
* @param eDetail
* @param user
*/
public void processSeries(long eSummaryId, TransitionDefinition tDef,
ExecutionDetail eDetail, User user);
/**
* Runs the algorithm.
*
* @param eSummary
* @param stateDef
* @param eDetail
* @param user
* @param em
*/
public void processStateDefinition(ExecutionSummary eSummary,
StateDefinition stateDef, ExecutionDetail eDetail, User user);
/**
* Process step.
*
* @param executionSummary
* an ExecutionSummary
* @param stepDefinition
* a StateDefinition
* @param executionDetail
* an executionDetail
* @param user
* a User
* @param params
*/
@SuppressWarnings("unchecked")
public void processStep(ExecutionSummary executionSummary,
StepDefinition stepDefinition, ExecutionDetail executionDetail,
User user);
/**
* Process a TransitionDefinition.
*
* @param eSummary
* @param tDef
* @param eDetail
* @param user
*/
public void processTransitionDefinition(ExecutionSummary eSummary,
TransitionDefinition tDef, ExecutionDetail eDetail, User user);
/**
* Sets an ExecutionDetail as completed.
*
* @param eDetail
* @return number updated
*/
public int setExecutionDetailCompleted(ExecutionDetail eDetail);
/**
* Updates the LOB, PARAMS_AS_XML.
*
* @param edId
* @param esId
* @param params
*/
public void updatePersistedResultParams(long edId, long esId,
Map<String, Object> params);
public void endWorkflow(ExecutionSummary eSummary);
public void endWorkflowInError(ExecutionSummary eSummary, ExecutionDetail eDetail);
}
And finally, here is the complete stack trace, with a couple of additional lines for context.
2008-12-26 16:46:01,811 DEBUG [org.jboss.ejb3.Ejb3Deployment] EJB3 deployment time took: 2065
2008-12-26 16:46:01,815 DEBUG [org.jboss.ejb3.Ejb3Deployment] error trying to stop ejb container
javax.management.InstanceNotFoundException: jboss.j2ee:ear=workflow.ear,jar=workflow-ejb-2.7.0.jar,name=WorkflowEngine,service=EJB3 is not registered.
at org.jboss.mx.server.registry.BasicMBeanRegistry.get(BasicMBeanRegistry.java:529)
at org.jboss.mx.server.MBeanServerImpl.unregisterMBean(MBeanServerImpl.java:383)
at org.jboss.ejb3.Ejb3Deployment.stop(Ejb3Deployment.java:554)
at org.jboss.ejb3.Ejb3Deployment.start(Ejb3Deployment.java:538)
at org.jboss.ejb3.deployers.Ejb3Deployer.deploy(Ejb3Deployer.java:196)
at org.jboss.ejb3.deployers.Ejb3Deployer.deploy(Ejb3Deployer.java:104)
at org.jboss.deployers.vfs.spi.deployer.AbstractVFSRealDeployer.internalDeploy(AbstractVFSRealDeployer.java:45)
at org.jboss.deployers.spi.deployer.helpers.AbstractRealDeployer.deploy(AbstractRealDeployer.java:50)
at org.jboss.deployers.plugins.deployers.DeployerWrapper.deploy(DeployerWrapper.java:171)
at org.jboss.deployers.plugins.deployers.DeployersImpl.doDeploy(DeployersImpl.java:1439)
at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1157)
at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1210)
at org.jboss.deployers.plugins.deployers.DeployersImpl.install(DeployersImpl.java:1098)
at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1598)
at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1062)
at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822)
at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
at org.jboss.deployers.plugins.deployers.DeployersImpl.process(DeployersImpl.java:781)
at org.jboss.deployers.plugins.main.MainDeployerImpl.process(MainDeployerImpl.java:545)
at org.jboss.system.server.profileservice.ProfileServiceBootstrap.loadProfile(ProfileServiceBootstrap.java:304)
at org.jboss.system.server.profileservice.ProfileServiceBootstrap.start(ProfileServiceBootstrap.java:205)
at org.jboss.bootstrap.AbstractServerImpl.start(AbstractServerImpl.java:405)
at org.jboss.Main.boot(Main.java:209)
at org.jboss.Main$1.run(Main.java:547)
at java.lang.Thread.run(Thread.java:613)
2008-12-26 16:46:01,815 DEBUG [org.jboss.ejb3.Ejb3Deployment] error trying to stop ejb container
javax.management.InstanceNotFoundException: jboss.j2ee:ear=workflow.ear,jar=workflow-ejb-2.7.0.jar,name=WorkflowMDB,service=EJB3 is not registered.
at org.jboss.mx.server.registry.BasicMBeanRegistry.get(BasicMBeanRegistry.java:529)
at org.jboss.mx.server.MBeanServerImpl.unregisterMBean(MBeanServerImpl.java:383)
at org.jboss.ejb3.Ejb3Deployment.stop(Ejb3Deployment.java:554)
at org.jboss.ejb3.Ejb3Deployment.start(Ejb3Deployment.java:538)
at org.jboss.ejb3.deployers.Ejb3Deployer.deploy(Ejb3Deployer.java:196)
at org.jboss.ejb3.deployers.Ejb3Deployer.deploy(Ejb3Deployer.java:104)
at org.jboss.deployers.vfs.spi.deployer.AbstractVFSRealDeployer.internalDeploy(AbstractVFSRealDeployer.java:45)
at org.jboss.deployers.spi.deployer.helpers.AbstractRealDeployer.deploy(AbstractRealDeployer.java:50)
at org.jboss.deployers.plugins.deployers.DeployerWrapper.deploy(DeployerWrapper.java:171)
at org.jboss.deployers.plugins.deployers.DeployersImpl.doDeploy(DeployersImpl.java:1439)
at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1157)
at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1210)
at org.jboss.deployers.plugins.deployers.DeployersImpl.install(DeployersImpl.java:1098)
at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1598)
at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1062)
at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822)
at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
at org.jboss.deployers.plugins.deployers.DeployersImpl.process(DeployersImpl.java:781)
at org.jboss.deployers.plugins.main.MainDeployerImpl.process(MainDeployerImpl.java:545)
at org.jboss.system.server.profileservice.ProfileServiceBootstrap.loadProfile(ProfileServiceBootstrap.java:304)
at org.jboss.system.server.profileservice.ProfileServiceBootstrap.start(ProfileServiceBootstrap.java:205)
at org.jboss.bootstrap.AbstractServerImpl.start(AbstractServerImpl.java:405)
at org.jboss.Main.boot(Main.java:209)
at org.jboss.Main$1.run(Main.java:547)
at java.lang.Thread.run(Thread.java:613)
2008-12-26 16:46:01,816 DEBUG [org.jboss.ejb3.Ejb3Deployment] error trying to stop ejb container
javax.management.InstanceNotFoundException: jboss.j2ee:ear=workflow.ear,jar=workflow-ejb-2.7.0.jar,name=WorkflowManager,service=EJB3 is not registered.
at org.jboss.mx.server.registry.BasicMBeanRegistry.get(BasicMBeanRegistry.java:529)
at org.jboss.mx.server.MBeanServerImpl.unregisterMBean(MBeanServerImpl.java:383)
at org.jboss.ejb3.Ejb3Deployment.stop(Ejb3Deployment.java:554)
at org.jboss.ejb3.Ejb3Deployment.start(Ejb3Deployment.java:538)
at org.jboss.ejb3.deployers.Ejb3Deployer.deploy(Ejb3Deployer.java:196)
at org.jboss.ejb3.deployers.Ejb3Deployer.deploy(Ejb3Deployer.java:104)
at org.jboss.deployers.vfs.spi.deployer.AbstractVFSRealDeployer.internalDeploy(AbstractVFSRealDeployer.java:45)
at org.jboss.deployers.spi.deployer.helpers.AbstractRealDeployer.deploy(AbstractRealDeployer.java:50)
at org.jboss.deployers.plugins.deployers.DeployerWrapper.deploy(DeployerWrapper.java:171)
at org.jboss.deployers.plugins.deployers.DeployersImpl.doDeploy(DeployersImpl.java:1439)
at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1157)
at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1210)
at org.jboss.deployers.plugins.deployers.DeployersImpl.install(DeployersImpl.java:1098)
at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1598)
at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1062)
at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822)
at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
at org.jboss.deployers.plugins.deployers.DeployersImpl.process(DeployersImpl.java:781)
at org.jboss.deployers.plugins.main.MainDeployerImpl.process(MainDeployerImpl.java:545)
at org.jboss.system.server.profileservice.ProfileServiceBootstrap.loadProfile(ProfileServiceBootstrap.java:304)
at org.jboss.system.server.profileservice.ProfileServiceBootstrap.start(ProfileServiceBootstrap.java:205)
at org.jboss.bootstrap.AbstractServerImpl.start(AbstractServerImpl.java:405)
at org.jboss.Main.boot(Main.java:209)
at org.jboss.Main$1.run(Main.java:547)
at java.lang.Thread.run(Thread.java:613)
2008-12-26 16:46:01,816 DEBUG [org.jboss.ejb3.Ejb3Deployment] error trying to stop ejb container
javax.management.InstanceNotFoundException: jboss.j2ee:ear=workflow.ear,jar=workflow-ejb-2.7.0.jar,name=CountManager,service=EJB3 is not registered.
at org.jboss.mx.server.registry.BasicMBeanRegistry.get(BasicMBeanRegistry.java:529)
at org.jboss.mx.server.MBeanServerImpl.unregisterMBean(MBeanServerImpl.java:383)
at org.jboss.ejb3.Ejb3Deployment.stop(Ejb3Deployment.java:554)
at org.jboss.ejb3.Ejb3Deployment.start(Ejb3Deployment.java:538)
at org.jboss.ejb3.deployers.Ejb3Deployer.deploy(Ejb3Deployer.java:196)
at org.jboss.ejb3.deployers.Ejb3Deployer.deploy(Ejb3Deployer.java:104)
at org.jboss.deployers.vfs.spi.deployer.AbstractVFSRealDeployer.internalDeploy(AbstractVFSRealDeployer.java:45)
at org.jboss.deployers.spi.deployer.helpers.AbstractRealDeployer.deploy(AbstractRealDeployer.java:50)
at org.jboss.deployers.plugins.deployers.DeployerWrapper.deploy(DeployerWrapper.java:171)
at org.jboss.deployers.plugins.deployers.DeployersImpl.doDeploy(DeployersImpl.java:1439)
at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1157)
at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1210)
at org.jboss.deployers.plugins.deployers.DeployersImpl.install(DeployersImpl.java:1098)
at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1598)
at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1062)
at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822)
at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
at org.jboss.deployers.plugins.deployers.DeployersImpl.process(DeployersImpl.java:781)
at org.jboss.deployers.plugins.main.MainDeployerImpl.process(MainDeployerImpl.java:545)
at org.jboss.system.server.profileservice.ProfileServiceBootstrap.loadProfile(ProfileServiceBootstrap.java:304)
at org.jboss.system.server.profileservice.ProfileServiceBootstrap.start(ProfileServiceBootstrap.java:205)
at org.jboss.bootstrap.AbstractServerImpl.start(AbstractServerImpl.java:405)
at org.jboss.Main.boot(Main.java:209)
at org.jboss.Main$1.run(Main.java:547)
at java.lang.Thread.run(Thread.java:613)
2008-12-26 16:46:01,816 DEBUG [org.jboss.ejb3.Ejb3Deployment] error trying to stop ejb container
javax.management.InstanceNotFoundException: jboss.j2ee:ear=workflow.ear,jar=workflow-ejb-2.7.0.jar,name=ModelManager,service=EJB3 is not registered.
at org.jboss.mx.server.registry.BasicMBeanRegistry.get(BasicMBeanRegistry.java:529)
at org.jboss.mx.server.MBeanServerImpl.unregisterMBean(MBeanServerImpl.java:383)
at org.jboss.ejb3.Ejb3Deployment.stop(Ejb3Deployment.java:554)
at org.jboss.ejb3.Ejb3Deployment.start(Ejb3Deployment.java:538)
at org.jboss.ejb3.deployers.Ejb3Deployer.deploy(Ejb3Deployer.java:196)
at org.jboss.ejb3.deployers.Ejb3Deployer.deploy(Ejb3Deployer.java:104)
at org.jboss.deployers.vfs.spi.deployer.AbstractVFSRealDeployer.internalDeploy(AbstractVFSRealDeployer.java:45)
at org.jboss.deployers.spi.deployer.helpers.AbstractRealDeployer.deploy(AbstractRealDeployer.java:50)
at org.jboss.deployers.plugins.deployers.DeployerWrapper.deploy(DeployerWrapper.java:171)
at org.jboss.deployers.plugins.deployers.DeployersImpl.doDeploy(DeployersImpl.java:1439)
at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1157)
at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1210)
at org.jboss.deployers.plugins.deployers.DeployersImpl.install(DeployersImpl.java:1098)
at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1598)
at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1062)
at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822)
at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
at org.jboss.deployers.plugins.deployers.DeployersImpl.process(DeployersImpl.java:781)
at org.jboss.deployers.plugins.main.MainDeployerImpl.process(MainDeployerImpl.java:545)
at org.jboss.system.server.profileservice.ProfileServiceBootstrap.loadProfile(ProfileServiceBootstrap.java:304)
at org.jboss.system.server.profileservice.ProfileServiceBootstrap.start(ProfileServiceBootstrap.java:205)
at org.jboss.bootstrap.AbstractServerImpl.start(AbstractServerImpl.java:405)
at org.jboss.Main.boot(Main.java:209)
at org.jboss.Main$1.run(Main.java:547)
at java.lang.Thread.run(Thread.java:613)
2008-12-26 16:46:01,817 DEBUG [org.jboss.ejb3.Ejb3Registry] Unregistered container jboss.j2ee:ear=workflow.ear,jar=workflow-ejb-2.7.0.jar,name=WorkflowEngine,service=EJB3,VMID=871ba2ae9678192d:-3cd08c6d:11e75424f45:-7ffa
2008-12-26 16:46:01,817 DEBUG [org.jboss.ejb3.Ejb3Registry] Unregistered container jboss.j2ee:ear=workflow.ear,jar=workflow-ejb-2.7.0.jar,name=WorkflowMDB,service=EJB3,VMID=871ba2ae9678192d:-3cd08c6d:11e75424f45:-7ffa
2008-12-26 16:46:01,817 DEBUG [org.jboss.ejb3.Ejb3Registry] Unregistered container jboss.j2ee:ear=workflow.ear,jar=workflow-ejb-2.7.0.jar,name=WorkflowManager,service=EJB3,VMID=871ba2ae9678192d:-3cd08c6d:11e75424f45:-7ffa
2008-12-26 16:46:01,817 DEBUG [org.jboss.ejb3.Ejb3Registry] Unregistered container jboss.j2ee:ear=workflow.ear,jar=workflow-ejb-2.7.0.jar,name=CountManager,service=EJB3,VMID=871ba2ae9678192d:-3cd08c6d:11e75424f45:-7ffa
2008-12-26 16:46:01,817 DEBUG [org.jboss.ejb3.Ejb3Registry] Unregistered container jboss.j2ee:ear=workflow.ear,jar=workflow-ejb-2.7.0.jar,name=ModelManager,service=EJB3,VMID=871ba2ae9678192d:-3cd08c6d:11e75424f45:-7ffa
2008-12-26 16:46:01,817 DEBUG [org.jboss.ejb3.deployers.Ejb3Deployer] Error during deploy: vfszip:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/server/default/deploy/workflow.ear/workflow-ejb-2.7.0.jar
org.jboss.deployers.spi.DeploymentException: Error deploying workflow-ejb-2.7.0.jar: java.lang.ClassNotFoundException: workflow.ejb.client.WorkflowEngineLocal from BaseClassLoader@7d8dfe{VFSClassLoaderPolicy@f55e8c{name=vfsfile:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/server/default/conf/jboss-service.xml domain=ClassLoaderDomain@8de742{name=DefaultDomain parentPolicy=BEFORE parent=org.jboss.system.NoAnnotationURLClassLoader@72ffb} roots=[MemoryContextHandler@1197338[path= context=vfsmemory://5c4o13-qr0cl1-fp7dh6nm-1-fp7dharu-6 real=vfsmemory://5c4o13-qr0cl1-fp7dh6nm-1-fp7dharu-6], DelegatingHandler@7787114[path=authorization-plugins-2.7.0.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/server/default/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/server/default/lib/authorization-plugins-2.7.0.jar], DelegatingHandler@15740258[path=jboss-jaas-2.7.0.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/server/default/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/server/default/lib/jboss-jaas-2.7.0.jar], DelegatingHandler@3390197[path=jbossws-common.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/server/default/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/server/default/lib/jbossws-common.jar], DelegatingHandler@3628074[path=jbossws-framework.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/server/default/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/server/default/lib/jbossws-framework.jar], DelegatingHandler@8649932[path=jbossws-native-jaxrpc.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/server/default/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/server/default/lib/jbossws-native-jaxrpc.jar], DelegatingHandler@4844995[path=jbossws-native-jaxws-ext.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/server/default/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/server/default/lib/jbossws-native-jaxws-ext.jar], DelegatingHandler@10005300[path=jbossws-native-jaxws.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/server/default/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/server/default/lib/jbossws-native-jaxws.jar], DelegatingHandler@1043573[path=jbossws-native-saaj.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/server/default/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/server/default/lib/jbossws-native-saaj.jar], DelegatingHandler@7153960[path=jbossws-spi.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/server/default/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/server/default/lib/jbossws-spi.jar], DelegatingHandler@11091676[path=mysql-connector-java-5.0.5.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/server/default/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/server/default/lib/mysql-connector-java-5.0.5.jar], DelegatingHandler@6160834[path=antlr.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/antlr.jar], DelegatingHandler@12939382[path=autonumber-plugin.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/autonumber-plugin.jar], DelegatingHandler@5926148[path=bcel.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/bcel.jar], DelegatingHandler@11223709[path=bsf.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/bsf.jar], DelegatingHandler@10652468[path=bsh.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/bsh.jar], DelegatingHandler@6373973[path=commons-collections.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/commons-collections.jar], DelegatingHandler@4854281[path=commons-httpclient.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/commons-httpclient.jar], DelegatingHandler@15089874[path=commons-logging.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/commons-logging.jar], DelegatingHandler@11128116[path=dtdparser121.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/dtdparser121.jar], DelegatingHandler@14629845[path=ejb3-persistence.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/ejb3-persistence.jar], DelegatingHandler@13710852[path=el-api.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/el-api.jar], DelegatingHandler@3229880[path=hibernate-annotations.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/hibernate-annotations.jar], DelegatingHandler@10314131[path=hibernate-commons-annotations.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/hibernate-commons-annotations.jar], DelegatingHandler@7410782[path=hibernate-core.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/hibernate-core.jar], DelegatingHandler@15743097[path=hibernate-entitymanager.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/hibernate-entitymanager.jar], DelegatingHandler@758654[path=hibernate-jmx.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/hibernate-jmx.jar], DelegatingHandler@14280[path=hibernate-validator.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/hibernate-validator.jar], DelegatingHandler@5130683[path=hsqldb-plugin.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/hsqldb-plugin.jar], DelegatingHandler@13277641[path=hsqldb.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/hsqldb.jar], DelegatingHandler@3570778[path=jaxen.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/jaxen.jar], DelegatingHandler@1971201[path=jboss-bindingservice.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/jboss-bindingservice.jar], DelegatingHandler@11752414[path=jboss-common-jdbc-wrapper.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/jboss-common-jdbc-wrapper.jar], DelegatingHandler@4659535[path=jboss-current-invocation-aspects.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/jboss-current-invocation-aspects.jar], DelegatingHandler@13538103[path=jboss-ejb3-cache.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/jboss-ejb3-cache.jar], DelegatingHandler@2300137[path=jboss-ejb3-common.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/jboss-ejb3-common.jar], DelegatingHandler@3706629[path=jboss-ejb3-core.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/jboss-ejb3-core.jar], DelegatingHandler@3519815[path=jboss-ejb3-deployers.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/jboss-ejb3-deployers.jar], DelegatingHandler@1072762[path=jboss-ejb3-ext-api-impl.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/jboss-ejb3-ext-api-impl.jar], DelegatingHandler@11191856[path=jboss-ejb3-ext-api.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/jboss-ejb3-ext-api.jar], DelegatingHandler@12166727[path=jboss-ejb3-interceptors.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/jboss-ejb3-interceptors.jar], DelegatingHandler@5473751[path=jboss-ejb3-metadata.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/jboss-ejb3-metadata.jar], DelegatingHandler@7872477[path=jboss-ejb3-proxy-clustered.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/jboss-ejb3-proxy-clustered.jar], DelegatingHandler@7611775[path=jboss-ejb3-proxy.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/jboss-ejb3-proxy.jar], DelegatingHandler@4831928[path=jboss-ejb3-security.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/ real=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/jboss-ejb3-security.jar], DelegatingHandler@8503987[path=jboss-ejb3-transactions.jar context=file:/Users/johnsingleton/Programming/pkg/jboss-5.0.0.GA/common/lib/ real=file:/Users/john