package org.panlab.software.fstoolkit.workflowcomposer;
import workflow.*;
import FederationOffice.federationscenarios.RequestedFederationScenario;
import FederationOffice.federationscenarios.ResourceRequest;
public class PrepareWorkflowGraph {
//first prepare Dependency graph.
//Then make a topological sort. Q: How can we define parallel actions?
private Graph<Object> workflowGraph ;
public PrepareWorkflowGraph(){
workflowGraph = new Graph<Object>();
}
public Graph<Object> getworkflowGraph(){
return workflowGraph;
}
public boolean createWorkflow(RequestedFederationScenario scenario){
Workflow workflow = WorkflowFactory.eINSTANCE.createWorkflow();
//add initial activity
Vertex<Object> startVertex = AddActivityToWorkflowGraph(workflow , "Start", null);
Vertex<Object> startFork = AddForkToWorkflowGraph(workflow , "StartFork");
workflowGraph.addEdge(startVertex, startFork, 0);
//for now just simple/parallel provisioning
Vertex<Object> endJoin = AddJoinToWorkflowGraph(workflow , "EndJoin");
//add all
for (ResourceRequest req: scenario.getInfrastructureRequest().getReqOfferedResources()){
Vertex<Object> v = AddActivityToWorkflowGraph(workflow , "Activity for: "+req.getName(), req);
workflowGraph.addEdge(startFork, v, 0);
workflowGraph.addEdge(v, endJoin, 0);
}
//add end activity
Vertex<Object> endVertex = AddActivityToWorkflowGraph(workflow , "End", null);
workflowGraph.addEdge(endJoin, endVertex, 0);
System.out.println(workflowGraph.toString());
return true;
}
public Vertex<Object> AddActivityToWorkflowGraph(Workflow workflow , String activityName, ResourceRequest req){
Activity activity = WorkflowFactory.eINSTANCE.createActivity();
activity.setName( activityName );
workflow.getHasActivities().add(activity);
activity.setResourceRequest(req);
String vertexname = activityName;
Vertex<Object> v0 = new Vertex<Object>( vertexname, activity );
workflowGraph.addVertex(v0);
return v0;
}
public Vertex<Object> AddForkToWorkflowGraph(Workflow workflow , String forkName){
Fork fork = WorkflowFactory.eINSTANCE.createFork();
fork.setName( forkName );
workflow.getHasForks().add(fork);
String vertexname = forkName;
Vertex<Object> v0 = new Vertex<Object>( vertexname, fork );
workflowGraph.addVertex(v0);
return v0;
}
public Vertex<Object> AddJoinToWorkflowGraph(Workflow workflow , String joinName){
Join join = WorkflowFactory.eINSTANCE.createJoin();
join.setName( joinName );
workflow.getHasJoins().add(join);
String vertexname = joinName;
Vertex<Object> v0 = new Vertex<Object>( vertexname, join );
workflowGraph.addVertex(v0);
return v0;
}
}