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.emf.ecore.EObject; 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.model.adaptation.IRewriteRule; import org.js.model.rbac.AccessControlModel; import org.js.model.rbac.Group; import org.js.model.rbac.Role; import org.js.model.workflow.util.AccessControlModelUtil; import org.js.model.workflow.util.ChangePrimitive; import org.js.model.workflow.util.WorkflowModelUtil; public class RemovePredecessorNodesAndEdges extends AbstractWorkflowRemoveRewriteRule { AccessControlModel accessControlModel; public RemovePredecessorNodesAndEdges(Role role, Model workflow, AccessControlModel accessControlModel) { super(role, workflow); this.accessControlModel = accessControlModel; } @Override protected int executeInternal() { removePredecessingEdges(); return IRewriteRule.OK; } private void removePredecessingEdges() { Group roleGroup = AccessControlModelUtil.getRoleGroupForMember(role, accessControlModel); ArrayList<Action> memberActions = WorkflowModelUtil.getActions(activity, role); if (roleGroup != null){ Role owner = roleGroup.getOwner(); ArrayList<Action> ownerActions = WorkflowModelUtil.getActions(activity, owner); for (Action ownerAction : ownerActions) { for (Action memberAction : memberActions) { deleteEdges(ownerAction, memberAction); // deleteAction(memberAction); } } } else { // role belongs to first stage, therefore remove edge between initial fork and member action InitialNode initialNode = WorkflowModelUtil.getInitialNode(activity); for (Action memberAction : memberActions) { deleteEdges(initialNode, memberAction); } } } private void deleteAction(Action memberAction) { ChangePrimitive.removeAction(workflow, activity, diagram, memberAction); } private void deleteEdges(ActivityNode ownerAction, Action memberAction) { EList<ActivityEdge> out = ownerAction.getOut(); for (ActivityEdge activityEdge : out) { ActivityNode target = activityEdge.getTarget(); if (target instanceof ForkNode) { ForkNode fork = (ForkNode) target; Set<EObject> path = WorkflowModelUtil.findPath(fork, memberAction, new HashSet<EObject>()); for (EObject eObject : path) { deleteElement(eObject); } } } } private void deleteElement(EObject eObject) { if (eObject instanceof ForkNode) { ForkNode node = (ForkNode) eObject; ChangePrimitive.removeForkNode(activity, diagram, node); } else if (eObject instanceof ActivityEdge) { ActivityEdge edge = (ActivityEdge) eObject; ChangePrimitive.removeEdge(activity, edge); } } }