package org.js.model.adaptation.rules.add; import org.eclipse.jwt.meta.model.core.Model; import org.eclipse.jwt.meta.model.organisations.Role; import org.eclipse.jwt.meta.model.processes.Action; import org.eclipse.jwt.meta.model.processes.ActivityNode; import org.js.model.adaptation.IRewriteRule; import org.js.model.adaptation.ui.UserInputAddRole; import org.js.model.workflow.RoleConnector; import org.js.model.workflow.State; import org.js.model.workflow.StateEnum; 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.WorkflowViewUtil; public class AddSpecializationAction extends AbstractWorkflowAddRewriteRule { public AddSpecializationAction(UserInputAddRole input, Model workflow) { super(input, workflow); } public int executeInternal() { int returnCode = IRewriteRule.OK; if (diagram == null || activity == null) { returnCode = IRewriteRule.Error; } else { Role role = addWorkflowRole(); Action action = addSpecializationAction(); assignRoleToAction(role, action); } return returnCode; } private Role addWorkflowRole() { org.js.model.rbac.Role rbacRole = input.getNewRole(); // create workflow role Role jwtRole = WorkflowModelUtil.addRole(workflow, rbacRole.getId()); setRoleLayout(jwtRole); input.setNewWorkflowRole(jwtRole); // add role aspect RoleConnector roleConnector = (RoleConnector) WorkflowConfUtil.addAspectInstance(jwtRole, WorkflowConfUtil.ROLE_ASPECT); WorkflowConfUtil.setRoleRef(roleConnector, rbacRole); return jwtRole; } private void setRoleLayout(Role role) { WorkflowViewUtil.setRoleLayout(diagram, activity, role, coordinate, coordinate); } private Action addSpecializationAction() { String actionName = WorkflowModelUtil.SPECIALIZATION_ACTION; // add action Action action = WorkflowModelUtil.addAction(activity, actionName); WorkflowViewUtil.setNodeLayout(diagram, action, coordinate, coordinate); input.setSpecializationAction(action); addAspects(action); setName(action); return action; } private void assignRoleToAction(Role newRole, Action newAction) { ChangePrimitive.addRoleActionRef(workflow, activity, diagram, newRole, newAction); ChangePrimitive.updateActionState(newAction); } private void addAspects(ActivityNode actNode) { // add aspects for the action if (WorkflowConfUtil.containsProfile(workflow, WorkflowConfUtil.WORKFLOW_PROFILE_NAME)) { // add log aspect WorkflowConfUtil.addAspectInstance(actNode, WorkflowConfUtil.LOG_ASPECT); // add the aspect of efm container WorkflowConfUtil.addAspectInstance(actNode, WorkflowConfUtil.EFM_ASPECT); // add state aspect State state = (State) WorkflowConfUtil.addAspectInstance(actNode, WorkflowConfUtil.STATE_ASPECT); WorkflowConfUtil.setState(state, StateEnum.INACTIVE); } } private void setName(ActivityNode actNode) { State state = (State) WorkflowConfUtil.getAspectInstance(actNode, WorkflowConfUtil.STATE_ASPECT); // set the name with the state actNode.setName(actNode.getName() + " (" + state.getState().getName() + ") "); } }