package org.fireflow.pdl.bpel; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import javax.xml.namespace.QName; import org.fireflow.client.WorkflowSession; import org.fireflow.client.WorkflowStatement; import org.fireflow.client.impl.InternalSessionAttributeKeys; import org.fireflow.client.impl.WorkflowSessionLocalImpl; import org.fireflow.engine.context.RuntimeContext; import org.fireflow.engine.entity.repository.ProcessDescriptor; import org.fireflow.engine.entity.repository.ProcessKey; import org.fireflow.engine.entity.runtime.ActivityInstance; import org.fireflow.engine.entity.runtime.ProcessInstance; import org.fireflow.engine.entity.runtime.ProcessInstanceState; import org.fireflow.engine.entity.runtime.Variable; import org.fireflow.engine.entity.runtime.impl.AbsVariable; import org.fireflow.engine.entity.runtime.impl.ProcessInstanceImpl; import org.fireflow.engine.entity.runtime.impl.VariableImpl; import org.fireflow.engine.modules.calendar.CalendarService; import org.fireflow.engine.modules.instancemanager.ProcessInstanceManager; import org.fireflow.engine.modules.persistence.PersistenceService; import org.fireflow.engine.modules.persistence.ProcessInstancePersister; import org.fireflow.engine.modules.persistence.ProcessPersister; import org.fireflow.engine.modules.persistence.TokenPersister; import org.fireflow.engine.modules.persistence.VariablePersister; import org.fireflow.pvm.kernel.KernelManager; import org.fireflow.pvm.kernel.PObjectKey; import org.fireflow.pvm.kernel.Token; import org.fireflow.pvm.kernel.TokenState; import org.fireflow.pvm.pdllogic.BusinessStatus; import org.fireflow.pvm.pdllogic.CancellationHandler; import org.fireflow.pvm.pdllogic.CompensationHandler; import org.fireflow.pvm.pdllogic.ContinueDirection; import org.fireflow.pvm.pdllogic.ExecuteResult; import org.fireflow.pvm.pdllogic.FaultHandler; import org.fireflow.pvm.pdllogic.WorkflowBehavior; import org.firesoa.common.schema.NameSpaces; public class BpelProcess implements WorkflowBehavior{ private BpelActivity startActivity = null; private String name = null; public BpelProcess(String name){ this.name = name; } public String getId() { return name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public BpelActivity getStartActivity() { return startActivity; } public BpelProcess setStartActivity(BpelActivity activity) { this.startActivity = activity; return this; } public CompensationHandler getCompensationHandler(String compensationCode){ return null; } public CancellationHandler getCancellationHandler(){ return null; } public FaultHandler getFaultHandler(String errorCode){ return null; } /* (non-Javadoc) * @see org.fireflow.pvm.pdllogic.WorkflowBehavior#canBeFired(org.fireflow.engine.WorkflowSession, org.fireflow.pvm.kernel.Token, java.lang.Object) */ public Boolean prepare(WorkflowSession session, Token token, Object workflowElement) { WorkflowSessionLocalImpl sessionLocal = (WorkflowSessionLocalImpl)session; RuntimeContext context = sessionLocal.getRuntimeContext(); PersistenceService persistenceStrategy = context.getEngineModule(PersistenceService.class, BpelConstants.PROCESS_TYPE); ProcessInstancePersister procInstPersistSvc = persistenceStrategy.getProcessInstancePersister(); ProcessInstance newProcessInstance = ((WorkflowSessionLocalImpl)session).getCurrentProcessInstance(); ((ProcessInstanceImpl)newProcessInstance).setTokenId(token.getId()); procInstPersistSvc.saveOrUpdate(newProcessInstance); token.setProcessInstanceId(newProcessInstance.getId()); token.setElementInstanceId(newProcessInstance.getId()); TokenPersister tokenPersister = persistenceStrategy.getTokenPersister(); tokenPersister.saveOrUpdate(token); return true;//true表示告诉虚拟机,“我”已经准备妥当了。 } /* (non-Javadoc) * @see org.fireflow.pvm.pdllogic.WorkflowBehavior#continueOn(org.fireflow.engine.WorkflowSession, org.fireflow.pvm.kernel.Token, java.lang.Object) */ public ContinueDirection continueOn(WorkflowSession session, Token token, Object workflowElement) { RuntimeContext ctx = ((WorkflowSessionLocalImpl)session).getRuntimeContext(); KernelManager kernelManager = ctx.getDefaultEngineModule(KernelManager.class); List<Token> childTokenList = kernelManager.getChildren(token); if (childTokenList==null || childTokenList.size()==0){ return ContinueDirection.closeMe(); }else{ for (Token tk : childTokenList){ if (tk.getState().getValue()<TokenState.DELIMITER.getValue()){ return ContinueDirection.waitingForClose(); } } } return ContinueDirection.closeMe(); } /* (non-Javadoc) * @see org.fireflow.pvm.pdllogic.WorkflowBehavior#execute(org.fireflow.engine.WorkflowSession, org.fireflow.pvm.kernel.Token, java.lang.Object) */ public ExecuteResult execute(WorkflowSession session, Token parentToken, Object workflowElement) { BpelActivity activity = this.getStartActivity(); PObjectKey pobjectKey = new PObjectKey(parentToken.getProcessId(),parentToken.getVersion(),parentToken.getProcessType(),activity.getId()); RuntimeContext ctx = ((WorkflowSessionLocalImpl)session).getRuntimeContext(); KernelManager kernelManager = ctx.getDefaultEngineModule(KernelManager.class); kernelManager.startPObject(session, pobjectKey, parentToken,null); ExecuteResult result = new ExecuteResult(); result.setStatus(BusinessStatus.RUNNING); return result; } /* (non-Javadoc) * @see org.fireflow.pvm.pdllogic.WorkflowBehavior#onTokenStateChanged(org.fireflow.engine.WorkflowSession, org.fireflow.pvm.kernel.Token, java.lang.Object) */ public void onTokenStateChanged(WorkflowSession session, Token token, Object workflowElement) { RuntimeContext ctx = ((WorkflowSessionLocalImpl)session).getRuntimeContext(); PersistenceService persistenceStrategy = ctx.getEngineModule(PersistenceService.class, BpelConstants.PROCESS_TYPE); ProcessInstancePersister procInstPersistenceService = persistenceStrategy.getProcessInstancePersister(); CalendarService calendarService = ctx.getEngineModule(CalendarService.class,BpelConstants.PROCESS_TYPE); ProcessInstance procInst = procInstPersistenceService.fetch(ProcessInstance.class, token.getElementInstanceId()); ProcessInstanceState state = ProcessInstanceState.valueOf(token.getState().name()); ((ProcessInstanceImpl)procInst).setState(state); if (state.getValue()>ProcessInstanceState.DELIMITER.getValue()){ ((ProcessInstanceImpl)procInst).setEndTime(calendarService.getSysDate()); } procInstPersistenceService.saveOrUpdate(procInst); } public void abort(WorkflowSession session,Token thisToken,Object workflowElement){ } }