package org.js.model.workflow.test.action; import org.eclipse.jwt.meta.model.organisations.Role; import org.eclipse.jwt.meta.model.processes.Action; import org.eclipse.jwt.meta.model.processes.Activity; import org.eclipse.jwt.meta.model.processes.ActivityEdge; import org.eclipse.jwt.meta.model.processes.ActivityNode; import org.eclipse.jwt.meta.model.processes.FinalNode; import org.eclipse.jwt.meta.model.processes.ForkNode; import org.eclipse.swt.widgets.Display; import org.js.model.rbac.AccessControlModel; import org.js.model.workflow.ACMConnector; import org.js.model.workflow.actions.MyAction; import org.js.model.workflow.test.ui.GroupSelection; import org.js.model.workflow.util.ChangePrimitive; import org.js.model.workflow.util.WorkflowConfUtil; import org.js.model.workflow.util.WorkflowModelUtil; import org.js.model.workflow.util.WorkflowUtil; import org.js.model.workflow.util.WorkflowViewUtil; public class AddUser extends MyAction { public AddUser() { } @Override public void run() { initialRes(); addUser(); save(); refresh(); } public void addUser() { org.js.model.rbac.Role userType = WorkflowUtil.getRBACRole( workflowModel, "User"); AccessControlModel acm = ((ACMConnector) WorkflowConfUtil .getAspectInstance(workflowModel, WorkflowConfUtil.ACM_ASPECT)) .getAcmref(); Action idleAction = WorkflowModelUtil.getIdleAction(activity); FinalNode finalNode = WorkflowModelUtil.getFinalNode(activity); String groupLeaderName = null; try { Display display = Display.getDefault(); GroupSelection shell = new GroupSelection(display, acm); shell.open(); shell.layout(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } groupLeaderName = shell.getGroupLeaderName(); } catch (Exception e) { e.printStackTrace(); } if (groupLeaderName != null && userType != null) { // get the group leader action Action groupLeaderAction = getTenantAction(activity, groupLeaderName); // the vertical position of idle action int groupLeaderY = WorkflowViewUtil.getNodeLayout(diagram, groupLeaderAction).getY(); // add the action with the reference of the role int size = groupLeaderAction.getOut().get(0).getTarget().getOut() .size() - 1; int index = userType.getChildRoles().size(); // add an action String roleName = "UserTest" + index; Action action = ChangePrimitive.addAction(workflowModel, activity, diagram, WorkflowModelUtil.SPECIALIZATION_ACTION, 900, groupLeaderY + 100 * size); Role role = ChangePrimitive.addRole(workflowModel, activity, diagram, userType, roleName, 900, groupLeaderY + 100 * size + 50); ChangePrimitive.addRoleActionRef(workflowModel, activity, diagram, role, action); // add a flow final node ActivityNode flowFinal = ChangePrimitive.addFlowFinalNode(activity, diagram, "", 1100, groupLeaderY + 100 * size); // add the edge ForkNode forNode1 = (ForkNode) ((ActivityEdge) groupLeaderAction .getOut().get(0)).getTarget(); ChangePrimitive.addEdge(activity, forNode1, action); ChangePrimitive.addEdge(activity, action, flowFinal); ChangePrimitive.updateActionState(action); WorkflowViewUtil.treeLayout(workflowModel, activity, diagram, idleAction, finalNode, action); } } public Action getTenantAction(Activity activity, String groupLeaderName) { for (ActivityNode actNode : activity.getNodes()) { if (actNode instanceof Action && WorkflowModelUtil.getActionName((Action) actNode) .equals(WorkflowModelUtil.SPECIALIZATION_ACTION)) { org.js.model.rbac.Role role = WorkflowUtil .getRBACRole((Action) actNode); if (role != null) { for (org.js.model.rbac.Role parent : role.getParentRoles()) { if (parent.getId().equals("Tenant") && role.getId().equals(groupLeaderName)) { return (Action) actNode; } } } } } return null; } }