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.ActivityNode;
import org.eclipse.jwt.meta.model.processes.FinalNode;
import org.eclipse.jwt.meta.model.processes.ForkNode;
import org.js.model.rbac.AccessControlModel;
import org.js.model.workflow.ACMConnector;
import org.js.model.workflow.RoleConnector;
import org.js.model.workflow.actions.MyAction;
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 AddApplicationProvider extends MyAction {
public AddApplicationProvider() {
}
@Override
public void run() {
initialRes();
addApplicationProvider();
save();
refresh();
}
public void addApplicationProvider() {
if (!hasApplicationProvider(activity)) {
org.js.model.rbac.Role platformProviderType = WorkflowUtil.getRBACRole(workflowModel, "PlatformProvider");
org.js.model.rbac.Role applicationProviderType = WorkflowUtil.getRBACRole(workflowModel, "ApplicationProvider");
ForkNode forkNode = getForkNode(activity);
Action idleAction = WorkflowModelUtil.getIdleAction(activity);
FinalNode finalNode = WorkflowModelUtil.getFinalNode(activity);
Action platProviderAction = getPlatformProviderAction(activity,platformProviderType);
String roleName= "ApplicationProviderTest";
if (forkNode != null && platformProviderType != null&&platformProviderType!=null&&platProviderAction!=null) {
// add an action
Action action = ChangePrimitive.addAction(workflowModel,
activity, diagram,
WorkflowModelUtil.SPECIALIZATION_ACTION, 400, 200);
// add the action with the reference of the role
Role role = ChangePrimitive.addRole(workflowModel, activity,
diagram, applicationProviderType, roleName, 400,
250);
ChangePrimitive.addRoleActionRef(workflowModel, activity,
diagram, role, action);
// add a fork node
ForkNode forkNode1 = ChangePrimitive.addForkNode(activity, diagram, 600, 200);
// remove the edge
ChangePrimitive.removeEdge(activity, platProviderAction, idleAction);
// add the edge
ChangePrimitive.addEdge(activity, platProviderAction, action);
ChangePrimitive.addEdge(activity, action, forkNode1);
ChangePrimitive.addEdge(activity, forkNode1, idleAction);
ChangePrimitive.updateActionState(action);
WorkflowViewUtil.treeLayout(workflowModel, activity, diagram,
idleAction, finalNode, action);
}
}
}
public boolean hasApplicationProvider(Activity activity) {
for (ActivityNode actNode : activity.getNodes()) {
if (actNode instanceof 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("ApplicationProvider")){
return true;
}
}
}
}
}
return false;
}
public Action getPlatformProviderAction(Activity activity,org.js.model.rbac.Role platformProvider) {
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);
for(org.js.model.rbac.Role parent:role.getParentRoles()){
if(parent.getId().equals("PlatformProvider")){
return (Action)actNode;
}
}
}
}
return null;
}
public ForkNode getForkNode(Activity activity) {
for (ActivityNode actNode : activity.getNodes()) {
if (actNode instanceof ForkNode) {
return (ForkNode) actNode;
}
}
return null;
}
}