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.we.model.view.Reference; import org.eclipse.jwt.we.model.view.ReferenceEdge; 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.rbac.Role; import org.js.model.workflow.util.ChangePrimitive; import org.js.model.workflow.util.StageModelUtil; import org.js.model.workflow.util.WorkflowUtil; import org.js.model.workflow.util.WorkflowViewUtil; public class AddIngoingTransitionsAnyStage extends AbstractWorkflowAddRewriteRule { private StageModel stageModel; public AddIngoingTransitionsAnyStage(UserInputAddRole input, Model workflow, StageModel stageModel) { super(input, workflow); this.stageModel = stageModel; } @Override protected int executeInternal() { int returnCode = IRewriteRule.OK; if (!isFirstStage() && hasRoleOwner()) { returnCode = addTransitions(); } return returnCode; } private boolean isFirstStage() { String parentId = input.getAbstractParentRole().getId(); Stage stage = StageModelUtil.getStageForId(parentId, stageModel); return StageModelUtil.isFirstStage(stage); } private int addTransitions() { int returnCode = IRewriteRule.OK; // find pattern: owner action node -> fork node ForkNode fork = getOwnerForkNode(); 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 getOwnerForkNode() { ForkNode fork = null; Action ownerAction = getOwnerSpecializationAction(); if (ownerAction != null) { fork = getOutgoingFork(ownerAction); } return fork; } private ForkNode getOutgoingFork(Action ownerAction) { ForkNode fork = null; EList<ActivityEdge> out = ownerAction.getOut(); for (ActivityEdge activityEdge : out) { ActivityNode target = activityEdge.getTarget(); if (target instanceof ForkNode) { fork = (ForkNode) target; break; } } return fork; } private Action getOwnerSpecializationAction() { Action action = null; Role owner = input.getGroupOwner(); org.eclipse.jwt.meta.model.organisations.Role workflowRole = WorkflowUtil.getWorkflowRole(owner, workflow); Reference reference = WorkflowViewUtil.getReferenceEdge(getDiagram(), workflowRole); EList<ReferenceEdge> referenceEdges = reference.getReferenceEdges(); for (ReferenceEdge referenceEdge : referenceEdges) { Action referencedAction = referenceEdge.getAction(); if (referencedAction != null) { action = referencedAction; break; } } return action; } private boolean hasRoleOwner() { return input.getGroupOwner() != null; } }