package org.js.model.adaptation;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.core.runtime.Assert;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jwt.meta.model.core.Model;
import org.feature.model.utilities.ResourceUtil;
import org.js.graph.transform.stagemodel.StageModel;
import org.js.model.adaptation.rules.add.AddConcreteRole;
import org.js.model.adaptation.rules.add.AddIngoingTransitionsAnyStage;
import org.js.model.adaptation.rules.add.AddIngoingTransitionsFirstStage;
import org.js.model.adaptation.rules.add.AddRoleGroupMember;
import org.js.model.adaptation.rules.add.AddRoleGroupOwner;
import org.js.model.adaptation.rules.add.AddSpecializationAction;
import org.js.model.adaptation.rules.add.AddSuccessorFinalNode;
import org.js.model.adaptation.rules.add.AddSuccessorFork;
import org.js.model.adaptation.rules.remove.DisableSpecializationAction;
import org.js.model.adaptation.rules.remove.RemovePredecessorNodesAndEdges;
import org.js.model.adaptation.rules.remove.RemoveRoleAssociationsInAccessControlModel;
import org.js.model.adaptation.rules.remove.RemoveSpecializationAction;
import org.js.model.adaptation.rules.remove.RemoveSuccessorNodesAndEdges;
import org.js.model.adaptation.ui.UserInputAddRole;
import org.js.model.rbac.AccessControlModel;
import org.js.model.rbac.Role;
import org.js.model.workflow.util.WorkflowUtil;
public class AdaptationEngine {
private Model workflow;
private AccessControlModel accessControlModel;
private StageModel stageModel;
public AdaptationEngine(Model workflow) {
Assert.isNotNull(workflow);
this.workflow = workflow;
init();
}
private void init() {
accessControlModel = WorkflowUtil.getAccessControlModel(workflow);
stageModel = WorkflowUtil.getStageModel(workflow);
}
private Model getWorkflow() {
return workflow;
}
private AccessControlModel getAccessControlModel() {
return accessControlModel;
}
private StageModel getStageModel() {
return stageModel;
}
/**
* Integrate a new stakeholder by transforming the instance graphs of access control model and workflow.
*/
public void integrateStakeholder(UserInputAddRole userInput) {
LinkedList<IRewriteRule> orderedRules = new LinkedList<IRewriteRule>();
// 1. create role in access control model and insert parent relation to abstract role
orderedRules.add(new AddConcreteRole(userInput, getAccessControlModel()));
// 2. assign member relation to group owner role
orderedRules.add(new AddRoleGroupMember(userInput, getAccessControlModel()));
// 3. add specialization action for new rbac role
orderedRules.add(new AddSpecializationAction(userInput, getWorkflow()));
// 4. add transition to predecessing fork if role belongs to first stage
orderedRules.add(new AddIngoingTransitionsFirstStage(userInput, getWorkflow(), getStageModel()));
// 5. add transition to predecessing fork if role does not belong to the first stage
orderedRules.add(new AddIngoingTransitionsAnyStage(userInput, getWorkflow(), getStageModel()));
// 6. add role group in access control model and add role as owner if role does not belong to last stage
orderedRules.add(new AddRoleGroupOwner(userInput, getAccessControlModel(), getStageModel()));
// 7. add successor edge and fork node in workflow model
orderedRules.add(new AddSuccessorFork(userInput, getWorkflow(), getAccessControlModel()));
// 8. add successor flow final node if role added to last stage
orderedRules.add(new AddSuccessorFinalNode(userInput, getWorkflow(), getStageModel()));
executeRules(orderedRules);
List<EObject> models = new ArrayList<EObject>(3);
models.add(getAccessControlModel());
saveModels(models);
}
private void saveModels(List<EObject> models) {
for (EObject eObject : models) {
ResourceUtil.saveModel(eObject);
}
}
private void executeRules(LinkedList<IRewriteRule> orderedRules) {
for (Iterator<IRewriteRule> iterator = orderedRules.iterator(); iterator.hasNext();) {
IRewriteRule rewriteRule = (IRewriteRule) iterator.next();
int returnCode = rewriteRule.execute();
if (returnCode == IRewriteRule.Error) {
System.out.println("Error occured while executing rewrite rule" + rewriteRule.getClass());
break;
}
}
}
/**
*
* Remove a new stakeholder by transforming the instance graphs of access control model and workflow. Recursively
* remove depending stakeholders.
*/
public void removeStakeholder(Role role) {
LinkedList<IRewriteRule> orderedRules = new LinkedList<IRewriteRule>();
// 1. disable role's specialization action
//orderedRules.add(new DisableSpecializationAction(role, workflow));
// 2. remove logs related to removable role
// 3. remove flow final node and outgoing transitions in last stage
orderedRules.add(new RemoveSuccessorNodesAndEdges(role, workflow, stageModel));
// 4. remove predecessor nodes and edges and role action
orderedRules.add(new RemovePredecessorNodesAndEdges(role, workflow, accessControlModel));
// 5. remove roles and groups in access control model
orderedRules.add(new RemoveSpecializationAction(role, workflow));
// 6. remove role and relations in access control model
orderedRules.add(new RemoveRoleAssociationsInAccessControlModel(role, accessControlModel));
executeRules(orderedRules);
List<EObject> models = new ArrayList<EObject>(3);
models.add(getAccessControlModel());
saveModels(models);
}
}