package org.js.model.adaptation.rules.remove;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.emf.common.util.EList;
import org.eclipse.jwt.meta.model.core.Model;
import org.eclipse.jwt.meta.model.processes.Action;
import org.eclipse.jwt.meta.model.processes.ActivityEdge;
import org.eclipse.jwt.meta.model.processes.ActivityNode;
import org.js.graph.transform.stagemodel.Stage;
import org.js.graph.transform.stagemodel.StageModel;
import org.js.model.adaptation.IRewriteRule;
import org.js.model.rbac.Role;
import org.js.model.workflow.util.ChangePrimitive;
import org.js.model.workflow.util.StageModelUtil;
import org.js.model.workflow.util.WorkflowModelUtil;
public class RemoveSuccessorNodesAndEdges extends AbstractWorkflowRemoveRewriteRule {
private StageModel stageModel;
public RemoveSuccessorNodesAndEdges(Role role, Model workflow, StageModel stageModel) {
super(role, workflow);
this.stageModel = stageModel;
}
@Override
protected int executeInternal() {
// if (isFinalStage()) {
removeSuccessorNodesAndEdges();
// }
return IRewriteRule.OK;
}
private void removeSuccessorNodesAndEdges() {
ArrayList<Action> actions = WorkflowModelUtil.getActions(activity, role);
for (Action action : actions) {
removeOutgoingEdgesAndNodes(action);
}
}
private void removeOutgoingEdgesAndNodes(ActivityNode node) {
EList<ActivityEdge> out = node.getOut();
Set<ActivityEdge> copy = new HashSet<ActivityEdge>(out.size());
copy.addAll(out);
for (ActivityEdge activityEdge : copy) {
ActivityNode target = activityEdge.getTarget();
ChangePrimitive.removeEdge(activity, node, target);
removeNodeRecursively(target);
}
}
private void removeNodeRecursively(ActivityNode node) {
EList<ActivityEdge> out = node.getOut();
Set<ActivityEdge> copy = new HashSet<ActivityEdge>(out.size());
copy.addAll(out);
if (!copy.isEmpty()) {
for (ActivityEdge edge : copy) {
ActivityNode target = edge.getTarget();
ChangePrimitive.removeEdge(activity, node, target);
removeNodeRecursively(target);
}
}
ChangePrimitive.removeActivityNode(workflow, activity, diagram, node);
}
private boolean isFinalStage() {
boolean isFinal = false;
Stage parentStage = getParentStage(role);
if (parentStage != null) {
isFinal = parentStage.getSuccessor() == null;
}
return isFinal;
}
protected Stage getParentStage(Role role) {
EList<Role> parentRoles = role.getParentRoles();
Stage parentStage = null;
for (Role parentRole : parentRoles) {
parentStage = StageModelUtil.getStageForId(parentRole.getId(), stageModel);
if (parentStage != null) {
break;
}
}
return parentStage;
}
}