package org.trianacode.http;
import org.thinginitself.http.Path;
import org.thinginitself.http.RequestContext;
import org.thinginitself.http.RequestProcessException;
import org.thinginitself.http.Resource;
import org.thinginitself.http.target.TargetResource;
import org.thinginitself.http.util.PathTree;
import org.thinginitself.streamable.Streamable;
import org.thinginitself.streamable.StreamableStream;
import org.thinginitself.streamable.StreamableString;
import org.trianacode.TrianaInstance;
import org.trianacode.enactment.Exec;
import org.trianacode.enactment.io.IoConfiguration;
import org.trianacode.enactment.io.IoHandler;
import org.trianacode.taskgraph.ser.DocumentHandler;
import org.trianacode.taskgraph.tool.Tool;
import org.trianacode.taskgraph.tool.ToolResolver;
import java.io.*;
/**
* @author Andrew Harrison
* @version 1.0.0 Oct 4, 2010
*/
public class ExecutionTarget extends TargetResource {
private ToolResolver toolResolver;
private PathTree pathTree;
public ExecutionTarget(ToolResolver toolResolver) {
super("exec");
this.toolResolver = toolResolver;
}
@Override
public void onGet(RequestContext requestContext) throws RequestProcessException {
Path path = requestContext.getRequestTarget();
String[] comps = path.getComponents();
if (comps.length < 2) {
requestContext.setResponseEntity(new StreamableString("POST me a workflow to run :-)"));
return;
}
if (comps.length == 2) {
String target = comps[comps.length - 1];
Resource r = getPathTree().getLocatable(target);
if (r.getPath().equals(getPath())) {
requestContext.setResponseCode(404);
}
try {
Exec exec = new Exec(target);
String status = exec.readUuidFile();
requestContext.setResponseEntity(new StreamableString(status));
requestContext.setResponseCode(201);
} catch (IOException e) {
requestContext.setResponseCode(404);
}
} else if (comps.length == 3) {
String target = comps[comps.length - 2];
String data = comps[comps.length - 1];
Exec exec = new Exec(target);
try {
InputStream in = exec.readData(data);
if (in != null) {
requestContext.setResponseCode(200);
requestContext.setResponseEntity(new StreamableStream(in));
return;
}
} catch (FileNotFoundException e) {
}
requestContext.setResponseCode(404);
}
}
@Override
public void onPost(RequestContext requestContext) throws RequestProcessException {
try {
IoHandler handler = new IoHandler();
Streamable s = requestContext.getRequestEntity();
final IoConfiguration config = handler.deserialize(s.getInputStream());
String tool = config.getToolName();
if (tool == null) {
throw new RequestProcessException("No tool specified.", 400);
}
final Tool task = toolResolver.getTool(tool);
if (task == null) {
throw new RequestProcessException("No tool found with name:" + tool, 400);
}
TrianaInstance inst = toolResolver.getProperties().getEngine();
final Exec exec = new Exec(null);
exec.createFile();
String pid = exec.getPid();
getPathTree().addLocatable(new Resource(new Path(pid)));
inst.execute(new Runnable() {
public void run() {
try {
//TODO hack!
DocumentHandler documentHandler = new DocumentHandler();
new IoHandler().serialize(documentHandler, config);
File tempConfFile = File.createTempFile(config.getToolName() + "_confFile", ".dat");
documentHandler.output(new FileWriter(tempConfFile), true);
exec.execute(task, tempConfFile.getAbsolutePath());
} catch (Exception e) {
e.printStackTrace(); // TODO
}
}
});
requestContext.setResponseEntity(new StreamableString(pid));
requestContext.setResponseCode(201);
} catch (Exception e) {
throw new RequestProcessException(e, 400);
}
}
@Override
public void onDelete(RequestContext requestContext) throws RequestProcessException {
requestContext.setResponseCode(405);
}
@Override
public void onOptions(RequestContext requestContext) throws RequestProcessException {
//requestContext.setResponseEntity(StreamableOptions.newOptions(Http.Method.GET, Http.Method.POST));
}
}