11-07-2011 02:58 PM
package my.package.name;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.impl.interceptor.Command;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
import org.activiti.engine.impl.pvm.PvmTransition;
import org.activiti.engine.impl.pvm.process.ActivityImpl;
import org.apache.commons.lang.StringUtils;
// this class based on SignalCmd.java
public class SignalViaNameCmd implements Command<Object>, Serializable {
public static final String INVALID_TRANSITION_MSG = " is not a valid transition for state ";
public static final String DUPLICATE_TRANSITIONS_MSG =
" is used as a name for more than one outgoing transition of state ";
public static final String TOO_MANY_TRANSITIONS_MSG =
"Can only signal without a transition name if there is exactly one outgoing transition. ";
public static final String IF_NAMED_ALL_MUST_HAVE_NAME_MSG =
"When signaling with a transition name, all outgoing transitions must have a name. ";
private static final long serialVersionUID = 1L;
protected String executionId;
protected String signalName;
public SignalViaNameCmd(String executionId, String signalName, Object signalData) {
this.executionId = executionId;
this.signalName = signalName;
}
public Object execute(CommandContext commandContext) {
if (executionId == null) {
throw new ActivitiException("executionId is null");
}
ExecutionEntity execution = commandContext.getExecutionManager().findExecutionById(executionId);
if (execution == null) {
throw new ActivitiException("execution " + executionId + " doesn't exist");
}
signal(execution);
return null;
}
// This method is loosely based on BpmnActivityBehavior.java.
private void signal(ExecutionEntity execution) {
// next line is inspired by ExecutionEntity.signal
ActivityImpl activity = execution.getActivity();
List<PvmTransition> transitionsToTake = new ArrayList<PvmTransition>();
List<PvmTransition> outgoingTransitions = activity.getOutgoingTransitions();
if (signalName == null) {
if (outgoingTransitions.size() != 1) {
throw new ActivitiException(TOO_MANY_TRANSITIONS_MSG + " State = '"
+ activity.getProperty("name") + "'");
} else {
execution.take(outgoingTransitions.get(0));
return;
}
}
for (PvmTransition outgoingTransition : outgoingTransitions) {
String name = (String) outgoingTransition.getProperty("name");
if (StringUtils.isBlank(name)) {
throw new ActivitiException(IF_NAMED_ALL_MUST_HAVE_NAME_MSG
+ showStateNameId(signalName, activity, outgoingTransition));
}
if (signalName.equals(name)) {
transitionsToTake.add(outgoingTransition);
}
}
if (transitionsToTake.size() == 0) {
throw new ActivitiException("'" + signalName + "'" + INVALID_TRANSITION_MSG + "'"
+ activity.getProperty("name") + "'");
}
if (transitionsToTake.size() > 1) { // bpmn supports this, but for
// simplicity we do not yet
throw new ActivitiException("'" + signalName + "'" + DUPLICATE_TRANSITIONS_MSG + "'"
+ activity.getProperty("name") + "'");
}
execution.take(transitionsToTake.get(0));
}
private String showStateNameId(String transitionName, ActivityImpl activity,
PvmTransition outgoingTransition) {
String message =
" State = '" + activity.getProperty("name") + "', signaled transition = '" + transitionName
+ "', transition Id = '" + outgoingTransition.getId() + "'";
return message;
}
}
public void signal(ProcessEngine engine, String processInstanceId, String transitionName) {
CommandExecutor commandExecutor =
((RuntimeServiceImpl) engine.getRuntimeService()).getCommandExecutor();
SignalViaNameCmd command = new SignalViaNameCmd(processInstanceId, transitionName, null);
commandExecutor.execute(command);
}
02-08-2012 07:14 AM
Tags
Find what you came for
We want to make your experience in Hyland Connect as valuable as possible, so we put together some helpful links.