package org.fireflow.pdl.bpel;
import org.fireflow.client.WorkflowSession;
import org.fireflow.client.impl.WorkflowSessionLocalImpl;
import org.fireflow.engine.context.RuntimeContext;
import org.fireflow.engine.entity.runtime.ActivityInstance;
import org.fireflow.engine.entity.runtime.ActivityInstanceState;
import org.fireflow.engine.entity.runtime.ProcessInstance;
import org.fireflow.engine.entity.runtime.impl.ActivityInstanceImpl;
import org.fireflow.engine.modules.calendar.CalendarService;
import org.fireflow.engine.modules.instancemanager.ActivityInstanceManager;
import org.fireflow.engine.modules.persistence.ActivityInstancePersister;
import org.fireflow.engine.modules.persistence.PersistenceService;
import org.fireflow.pvm.kernel.Token;
import org.fireflow.pvm.pdllogic.CancellationHandler;
import org.fireflow.pvm.pdllogic.CompensationHandler;
import org.fireflow.pvm.pdllogic.ContinueDirection;
import org.fireflow.pvm.pdllogic.FaultHandler;
public abstract class AbstractActivity implements BpelActivity {
protected String id = null;
protected String name = null;
protected BpelActivity parent = null;
protected BpelProcess process = null;
public AbstractActivity(String name) {
this.name = name;
}
public String getId() {
if (this.parent != null) {
return this.parent.getId() + "." + this.name;
} else if (this.process != null) {
return this.process.getName() + "." + this.name;
} else {
return name;
}
}
public String getName() {
return name;
}
public void setName(String name) {
// TODO Auto-generated method stub
}
public BpelActivity getParent() {
return parent;
}
public void setParent(BpelActivity p) {
parent = p;
}
public BpelProcess getProcess() {
return process;
}
public void setProcess(BpelProcess process) {
this.process = process;
}
/**
* 一个用于该实验的方法,获得当前Activity所处的层级。
*
* @return
*/
protected int getLevel() {
if (this.getParent() == null) {
return 0;
} else {
AbstractActivity activity = (AbstractActivity) this.getParent();
return activity.getLevel() + 1;
}
}
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) {
int level = getLevel();
for (int i = 0; i < (level + 1); i++) {
System.out.print(" ");// 打印空格
}
System.out.println(this.getName() + " executing...");
RuntimeContext ctx = ((WorkflowSessionLocalImpl) session)
.getRuntimeContext();
ActivityInstanceManager activityInstanceMgr = ctx.getEngineModule(
ActivityInstanceManager.class, BpelConstants.PROCESS_TYPE);
PersistenceService persistenceStrategy = ctx.getEngineModule(
PersistenceService.class, BpelConstants.PROCESS_TYPE);
ActivityInstancePersister actInstPersistSvc = persistenceStrategy
.getActivityInstancePersister();
ProcessInstance processInstance = ((WorkflowSessionLocalImpl)session).getCurrentProcessInstance();
ActivityInstance activityInstance = activityInstanceMgr
.createActivityInstance(session, processInstance,
workflowElement);
((ActivityInstanceImpl) activityInstance).setTokenId(token.getId());
((ActivityInstanceImpl) activityInstance).setStepNumber(token
.getStepNumber());
actInstPersistSvc.saveOrUpdate(activityInstance);
((WorkflowSessionLocalImpl) session)
.setCurrentActivityInstance(activityInstance);
token.setElementInstanceId(activityInstance.getId());
return 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) {
int level = getLevel();
for (int i = 0; i < (level + 1); i++) {
System.out.print(" ");// 打印空格
}
System.out.println(this.getName() + " completed!");
return ContinueDirection.closeMe();
}
/*
* (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);
ActivityInstancePersister actInstPersistenceService = persistenceStrategy
.getActivityInstancePersister();
CalendarService calendarService = ctx.getEngineModule(
CalendarService.class, BpelConstants.PROCESS_TYPE);
ActivityInstance activityInstance = actInstPersistenceService.fetch(
ActivityInstance.class, token.getElementInstanceId());
ActivityInstanceState state = ActivityInstanceState.valueOf(token
.getState().name());
((ActivityInstanceImpl) activityInstance).setState(state);
if (state.getValue() > ActivityInstanceState.DELIMITER.getValue()) {
((ActivityInstanceImpl) activityInstance)
.setEndTime(calendarService.getSysDate());
}
actInstPersistenceService.saveOrUpdate(activityInstance);
}
}