package hudson.drools;
import hudson.model.Job;
import hudson.security.ACL;
import java.io.IOException;
import java.util.Map;
import javax.servlet.ServletException;
import org.acegisecurity.context.SecurityContextHolder;
import org.drools.runtime.StatefulKnowledgeSession;
import org.kohsuke.stapler.HttpResponse;
public class ScriptExecution {
private String scriptName;
private Map<String, Object> parameters;
private Result result = Result.NOT_RUN;
private final long workItemId;
private final DroolsRun run;
public enum Result {
NOT_RUN("Not Run"), RUNNING("Running"), FAILED("Failed"), COMPLETED(
"Completed");
private String displayName;
Result(String displayName) {
this.displayName = displayName;
}
@Override
public String toString() {
return displayName;
}
};
public ScriptExecution(DroolsRun run, String scriptName, long workItemId,
Map<String, Object> parameters) {
super();
this.run = run;
this.scriptName = scriptName;
this.workItemId = workItemId;
this.parameters = parameters;
run.addScriptExecution(this);
try {
run.save();
} catch (IOException e) {
e.printStackTrace();
}
}
public String getId() {
return scriptName;
}
public void setId(String id) {
this.scriptName = id;
}
public Map<String, Object> getParameters() {
return parameters;
}
public void setParameters(Map<String, Object> parameters) {
this.parameters = parameters;
}
public void run() {
final Script script = run.getParent().getScript(scriptName);
if (script == null) {
throw new IllegalArgumentException("Unknown script " + scriptName);
}
new Thread(new Runnable() {
public void run() {
SecurityContextHolder.getContext().setAuthentication(ACL.SYSTEM);
result = Result.RUNNING;
try {
StatefulKnowledgeSession session = run.getParent().getSession().getSession();
Map<String, Object> scriptResults = script.execute(session, run
.getLogWriter(), parameters);
result = Result.COMPLETED;
run.getParent().run(new CompleteWorkItemCallable(workItemId, scriptResults));
} catch (Exception e) {
result = Result.FAILED;
run.getLogWriter().println("Exception while running script " + scriptName);
e.printStackTrace(run.getLogWriter());
} finally {
try {
run.save();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}).start();
}
public HttpResponse doRun()
throws ServletException, IOException {
run.checkPermission(Job.BUILD);
run();
return new ForwardToPreviousPage();
}
public String getUrl() {
return run.getUrl() + "scriptExecution/" + workItemId;
}
public Result getResult() {
return result;
}
public boolean hasFailed() {
return result == Result.FAILED;
}
public DroolsRun getRun() {
return run;
}
public String getScriptName() {
return scriptName;
}
public long getWorkItemId() {
return workItemId;
}
}