package uk.ac.diamond.scisoft.analysis.processing.actor.runner;
import java.io.FileWriter;
import org.eclipse.dawnsci.analysis.api.processing.ExecutionType;
import org.eclipse.dawnsci.analysis.api.processing.IOperation;
import org.eclipse.dawnsci.analysis.api.processing.IOperationContext;
import org.eclipse.dawnsci.analysis.api.processing.IOperationExporter;
import org.eclipse.dawnsci.analysis.api.processing.OperationData;
import org.eclipse.dawnsci.analysis.api.processing.model.IOperationModel;
import ptolemy.data.IntToken;
import ptolemy.kernel.util.Location;
import uk.ac.diamond.scisoft.analysis.processing.actor.actors.OperationSource;
import uk.ac.diamond.scisoft.analysis.processing.actor.actors.OperationTransformer;
import com.isencia.passerelle.core.Port;
import com.isencia.passerelle.domain.et.ETDirector;
import com.isencia.passerelle.model.Flow;
public class GraphBuilder implements IOperationExporter{
private IOperationContext context;
@Override
public void init(IOperationContext context) {
this.context = context;
}
/**
* Currently we simply build an in memory graph which is a linear
* list of operations. Later we might execute a full graph.
*
* @throws Exception
*/
public Flow createEventDirectorFlow() throws Exception {
Flow flow = new Flow("Operations Graph", null);
ETDirector director = new ETDirector(flow, "Director");
director.dispatchThreadsParameter.setToken(new IntToken(context.getPoolSize()));
flow.setDirector(director);
final OperationSource source = new OperationSource(flow, "Data Source");
source.setContext(context);
new Location(source, "_location").setLocation(new double[]{25, 100});
Port from = source.output;
int count = 1;
for (IOperation<? extends IOperationModel, ? extends OperationData> op : context.getSeries()) {
final OperationTransformer opTrans = new OperationTransformer(flow, op.getName());
opTrans.setContext(context);
opTrans.setOperation((IOperation<IOperationModel, OperationData>)op);
new Location(opTrans, "_location").setLocation(new double[]{count*200, 100});
count++;
flow.connect(from, opTrans.input);
from = opTrans.output;
}
return flow;
}
@Override
public void export(String location) throws Exception {
final Flow flo = createEventDirectorFlow();
final FileWriter fw = new FileWriter(location);
try {
flo.exportMoML(fw);
} finally {
fw.close();
}
}
@Override
public ExecutionType[] getExecutionTypes() {
return new ExecutionType[]{ExecutionType.GRAPH};
}
}