package hudson.drools;
import groovy.lang.Binding;
import groovy.lang.GroovyCodeSource;
import groovy.lang.GroovyShell;
import hudson.model.Hudson;
import java.io.IOException;
import java.util.HashMap;
import java.util.logging.Logger;
import org.drools.runtime.process.WorkItem;
import org.drools.runtime.process.WorkItemHandler;
import org.drools.runtime.process.WorkItemManager;
public class HumanTaskHandler implements WorkItemHandler {
private static final String ACTOR_ID = "ActorId";
private static final String CONTENT = "Content";
private static final Logger logger = Logger
.getLogger(HumanTaskHandler.class.getName());
private final DroolsProject project;
public HumanTaskHandler(DroolsProject project) {
this.project = project;
}
public void abortWorkItem(WorkItem workItem, WorkItemManager manager) {
for (DroolsRun r : project.getBuilds()) {
HumanTask humanTask = r.getHumanTask((int) workItem.getId());
if (humanTask != null) {
try {
humanTask.cancel();
} catch (IOException e) {
e.printStackTrace(humanTask.getRun().getLogWriter());
}
return;
}
}
logger.warning("couldn't find HumanTask for work item "
+ workItem.getId());
}
public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {
long processInstanceId = workItem.getProcessInstanceId();
DroolsRun run = project.getFromProcessInstance(processInstanceId);
String script = (String) workItem.getParameter(CONTENT);
script = "def task = { title,closure -> new hudson.drools.HumanTaskBuilder().task(title, closure) }\n"
+ script;
Binding binding = new Binding(new HashMap(workItem.getParameters()));
GroovyShell shell = new GroovyShell(HumanTaskBuilder.class.getClassLoader(), binding);
GroovyCodeSource codeSource = new GroovyCodeSource(script, "name", ".");
HumanTask question = (HumanTask) shell.evaluate(codeSource);
question.setWorkItemId(workItem.getId());
question.setActorId((String) workItem.getParameter(ACTOR_ID));
run.addHumanTask(question);
}
}