/**
*
*/
package net.conselldemallorca.helium.jbpm3.command;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.jbpm.JbpmContext;
import org.jbpm.command.AbstractGetObjectBaseCommand;
import org.jbpm.graph.def.Node;
import org.jbpm.graph.def.Node.NodeType;
import org.jbpm.graph.def.Transition;
import org.jbpm.graph.exe.Token;
/**
* Command per cercar tots els nodes que arriben al node a on
* es troba un token determinat
*
* @author Limit Tecnologies <limit@limit.es>
*/
public class FindArrivingNodeNamesCommand extends AbstractGetObjectBaseCommand {
private static final long serialVersionUID = -1908847549444051495L;
private long id;
public FindArrivingNodeNamesCommand() {}
public FindArrivingNodeNamesCommand(long id){
super();
this.id = id;
}
public Object execute(JbpmContext jbpmContext) throws Exception {
List<String> resposta = new ArrayList<String>();
Token token = jbpmContext.getToken(id);
if (token != null) {
Node node = token.getNode();
if (!node.getNodeType().equals(NodeType.Join)) {
for (Transition transition: token.getNode().getArrivingTransitions())
resposta.add(transition.getFrom().getName());
} else {
int joinsLeft = 1;
Node parentNode = node;
do {
Set<Transition> arrivingTransitions = parentNode.getArrivingTransitions();
if (arrivingTransitions != null && arrivingTransitions.size() > 0) {
parentNode = arrivingTransitions.iterator().next().getFrom();
if (parentNode.getNodeType().equals(NodeType.Fork))
joinsLeft--;
} else {
break;
}
} while(joinsLeft > 0);
if (joinsLeft == 0)
resposta.add(parentNode.getName());
}
}
return resposta;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
@Override
public String getAdditionalToStringInformation() {
return "id=" + id;
}
// methods for fluent programming
public FindArrivingNodeNamesCommand id(long id) {
setId(id);
return this;
}
}