package org.trianacode.http;
import org.apache.commons.logging.Log;
import org.thinginitself.http.HttpPeer;
import org.thinginitself.http.RequestContext;
import org.thinginitself.http.RequestProcessException;
import org.thinginitself.http.Resource;
import org.thinginitself.http.target.TargetResource;
import org.trianacode.config.TrianaProperties;
import org.trianacode.enactment.logging.Loggers;
import org.trianacode.taskgraph.Task;
import org.trianacode.taskgraph.interceptor.execution.ExecutionControlListener;
import org.trianacode.taskgraph.interceptor.execution.ExecutionController;
import org.trianacode.taskgraph.tool.Tool;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.SynchronousQueue;
/**
* @author Andrew Harrison
* @version 1.0.0 Jul 20, 2010
*/
public class TaskResource extends TargetResource implements ExecutionControlListener {
private static Log log = Loggers.TOOL_LOGGER;
private Task task;
private ExecutionController controller;
private BlockingQueue<RenderInfo> nextTask = new SynchronousQueue<RenderInfo>();
private boolean started = false;
private HttpPeer peer;
private Task currentTask = null;
public TaskResource(Task task, String path, HttpPeer peer) {
super(path);
this.task = task;
this.peer = peer;
controller = new ExecutionController(task, this);
}
public Task getTask() {
return task;
}
public Resource getResource(RequestContext context) throws RequestProcessException {
log.debug("TaskResource.getResource " + context.getRequestTarget());
log.debug("TaskResource.getResource me " + getPath().toString());
if (context.getRequestTarget().toString().startsWith(getPath().toString())) {
return this;
}
return null;
}
@Override
public void onPost(RequestContext requestContext) throws RequestProcessException {
log.debug("TaskResource.onPost ENTER " + requestContext.getRequestTarget());
if (currentTask != null) {
// get the POST data here I think and set the parameters.
}
if (!started) {
started = true;
controller.begin();
} else {
controller.resume();
}
try {
RenderInfo info = nextTask.take();
requestContext.setResponseEntity(info.getRenderer().render(info.getTemplate(), "text/html"));
requestContext.setSendBody(true);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private boolean isDisplayTask(Task t) {
/*String guiDesc = (String) t.getParameter(Tool.GUI_BUILDER);
boolean show = showParameters(t);
if (guiDesc != null && show) {
return true;
}
return false;*/
return true;
}
private boolean showParameters(Task task) {
return !task.isParameterName(Tool.PARAM_PANEL_INSTANTIATE)
|| task.getParameter(Tool.PARAM_PANEL_INSTANTIATE).equals(Tool.ON_TASK_INSTANTIATION);
}
@Override
public void executionSuspended(Task task) {
log.debug("TaskResource.executionSuspended for task " + task.getToolName());
if (isDisplayTask(task)) {
try {
ToolRenderer r = new ToolRenderer();
r.init(task, task.getToolName());
currentTask = task;
nextTask.put(new RenderInfo(r, TrianaProperties.TOOL_PARAMETER_WINDOW_TEMPLATE_PROPERTY));
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
controller.resume();
}
}
@Override
public void executionComplete(Task task) {
try {
ToolRenderer r = new ToolRenderer();
r.init(task, task.getToolName());
nextTask.put(new RenderInfo(r, TrianaProperties.TOOL_COMPLETED_TEMPLATE_PROPERTY));
peer.removeTarget(this);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private static class RenderInfo {
private Renderer renderer;
private String template;
private RenderInfo(Renderer renderer, String template) {
this.renderer = renderer;
this.template = template;
}
public Renderer getRenderer() {
return renderer;
}
public String getTemplate() {
return template;
}
}
}