package org.js.model.adaptation.rules.add; 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.eclipse.jwt.meta.model.processes.ForkNode; import org.eclipse.jwt.meta.model.processes.InitialNode; import org.js.graph.transform.stagemodel.Stage; import org.js.graph.transform.stagemodel.StageModel; import org.js.model.adaptation.IRewriteRule; import org.js.model.adaptation.ui.UserInputAddRole; import org.js.model.workflow.util.ChangePrimitive; import org.js.model.workflow.util.StageModelUtil; public class AddIngoingTransitionsFirstStage extends AbstractWorkflowAddRewriteRule { private StageModel stageModel; public AddIngoingTransitionsFirstStage(UserInputAddRole input, Model workflow, StageModel stageModel) { super(input, workflow); this.stageModel = stageModel; } @Override protected int executeInternal() { int returnCode = IRewriteRule.OK; if (isFirstStage()) { returnCode = addTransitions(); } return returnCode; } private int addTransitions() { int returnCode = IRewriteRule.OK; // find pattern: initial node -> fork node ForkNode fork = getFirstForkNode(); if (fork != null) { // add transition between this fork node and the new specialization action Action specializationAction = input.getSpecializationAction(); ChangePrimitive.addEdge(activity, fork, specializationAction); // update action state of specialization action ChangePrimitive.updateActionState(specializationAction); } else { returnCode = IRewriteRule.Error; } return returnCode; } private ForkNode getFirstForkNode() { ForkNode fork = null; EList<ActivityNode> nodes = activity.getNodes(); stop: while (fork == null) { for (ActivityNode activityNode : nodes) { if (activityNode instanceof InitialNode) { InitialNode initial = (InitialNode) activityNode; EList<ActivityEdge> outgoingEdges = initial.getOut(); for (ActivityEdge activityEdge : outgoingEdges) { ActivityNode target = activityEdge.getTarget(); if (target instanceof ForkNode) { fork = (ForkNode) target; break stop; } } } } } return fork; } private boolean isFirstStage() { String parentId = input.getAbstractParentRole().getId(); Stage stage = StageModelUtil.getStageForId(parentId, stageModel); return StageModelUtil.isFirstStage(stage); } }