package hudson.plugins.groovy;
import groovy.lang.Binding;
import groovy.lang.GroovyShell;
import hudson.Extension;
import hudson.Launcher;
import hudson.model.AbstractBuild;
import hudson.model.BuildListener;
import hudson.model.Descriptor;
import hudson.model.Hudson;
import hudson.tasks.Builder;
import java.io.IOException;
import net.sf.json.JSONObject;
import org.codehaus.groovy.control.CompilerConfiguration;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.StaplerRequest;
/**
* A Builder which executes system Groovy script in Hudson JVM (similar to HUDSON_URL/script).
*
* @author dvrzalik
*/
public class SystemGroovy extends AbstractGroovy {
//initial variable bindings
String bindings;
String classpath;
@DataBoundConstructor
public SystemGroovy(ScriptSource scriptSource, String bindings,String classpath) {
super(scriptSource);
this.bindings = bindings;
this.classpath = classpath;
}
@Override
public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException {
Hudson.getInstance().checkPermission(Hudson.ADMINISTER);
CompilerConfiguration compilerConfig = new CompilerConfiguration();
if(classpath != null) {
compilerConfig.setClasspath(classpath);
}
GroovyShell shell = new GroovyShell(new Binding(parseProperties(bindings)),compilerConfig);
shell.setVariable("out", listener.getLogger());
Object output = shell.evaluate(getScriptSource().getScriptStream(build.getWorkspace()));
if (output instanceof Boolean) {
return (Boolean) output;
} else {
if (output != null) {
listener.getLogger().println("Script returned: " + output);
}
if (output instanceof Number) {
return ((Number) output).intValue() == 0;
}
}
//No output. Suppose success.
return true;
}
@Override
public Descriptor<Builder> getDescriptor() {
return DESCRIPTOR;
}
@Extension
public static final DescriptorImpl DESCRIPTOR = new DescriptorImpl();
public static final class DescriptorImpl extends AbstractGroovyDescriptor {
DescriptorImpl() {
super(SystemGroovy.class);
load();
}
@Override
public String getDisplayName() {
return "Execute system Groovy script";
}
@Override
public Builder newInstance(StaplerRequest req, JSONObject data) throws FormException {
ScriptSource source = getScriptSource(req, data);
String binds = data.getString("bindings");
String classp = data.getString("classpath");
return new SystemGroovy(source, binds, classp);
}
@Override
public String getHelpFile() {
return "/plugin/groovy/systemscript-projectconfig.html";
}
}
//---- Backward compatibility -------- //
public enum BuilderType { COMMAND,FILE }
private String command;
private Object readResolve() {
if(command != null) {
scriptSource = new StringScriptSource(command);
command = null;
}
return this;
}
public String getCommand() {
return command;
}
public String getBindings() {
return bindings;
}
public String getClasspath() {
return classpath;
}
}