package pl.net.bluesoft.rnd.pt.ext.jbpm;
import org.jbpm.api.model.Transition;
import org.jbpm.pvm.internal.model.ExecutionImpl;
import org.jbpm.pvm.internal.wire.WireContext;
import pl.net.bluesoft.rnd.processtool.ProcessToolContext;
import pl.net.bluesoft.rnd.processtool.dao.ProcessInstanceDAO;
import pl.net.bluesoft.rnd.processtool.model.BpmStep;
import pl.net.bluesoft.rnd.processtool.model.ProcessInstance;
import pl.net.bluesoft.rnd.processtool.model.nonpersistent.MutableBpmStep;
import pl.net.bluesoft.rnd.processtool.steps.ProcessToolProcessStep;
import pl.net.bluesoft.rnd.processtool.ui.widgets.annotations.PropertyAutoWiring;
import pl.net.bluesoft.util.lang.TaskWatch;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.logging.Level;
import java.util.logging.Logger;
public class JbpmStepAction {
private WireContext context;
private String processInstanceId;
private String stepName;
private Map<String, String> params = new HashMap<String, String>();
private static final Logger logger = Logger.getLogger(JbpmStepAction.class.getName());
public String invoke() throws Exception {
final TaskWatch watch = new TaskWatch(this.getClass().getSimpleName() + ": " + stepName);
String res = watch.watchTask("total step processing", new Callable<String>() {
@Override
public String call() throws Exception {
return internalInvoke(watch);
}
});
watch.stopAll();
logger.log(Level.INFO, watch.printSummary());
return res;
}
private BpmStep prepareStep(ProcessInstance pi) {
ExecutionImpl exec = context.getScopeInstance().getExecution();
MutableBpmStep step = new MutableBpmStep();
step.setProcessInstance(pi);
step.setExecutionId(exec.getId());
step.setStateName(exec.getActivityName());
List<String> transitionNames = new ArrayList<String>();
for (Transition transition : exec.getActivity().getOutgoingTransitions()) {
transitionNames.add(transition.getDestination().getName());
}
step.setOutgoingTransitions(transitionNames);
return step;
}
public String internalInvoke(final TaskWatch watch) {
ProcessToolContext ctx = ProcessToolContext.Util.getThreadProcessToolContext();
ProcessInstanceDAO dao = ctx.getProcessInstanceDAO();
ProcessInstance pi = dao.getProcessInstance(Long.parseLong(processInstanceId));
if (pi.getInternalId() == null) {
pi.setInternalId(context.getScopeInstance().getExecution().getProcessInstance().getId());
dao.saveProcessInstance(pi);
}
final ProcessToolProcessStep stepInstance = ctx.getRegistry().getStep(stepName);
if (stepInstance == null) {
throw new IllegalArgumentException("No step defined by name: " + stepName);
}
String res;
try {
PropertyAutoWiring.autowire(stepInstance, params);
final BpmStep step = prepareStep(pi);
res = watch.watchTask("actual step execution", new Callable<String>() {
@Override
public String call() throws Exception {
return stepInstance.invoke(step, params);
}
});
} catch (Exception e) {
throw new RuntimeException(e);
}
ctx.updateContext(pi);
return res;
}
}