package hudson.plugins.gradle;
import hudson.*;
import hudson.model.EnvironmentSpecific;
import hudson.model.Hudson;
import hudson.model.Node;
import hudson.model.TaskListener;
import hudson.remoting.Callable;
import hudson.slaves.NodeSpecific;
import hudson.tools.ToolDescriptor;
import hudson.tools.ToolInstallation;
import hudson.tools.ToolProperty;
import org.kohsuke.stapler.DataBoundConstructor;
import java.io.File;
import java.io.IOException;
import java.util.List;
public class GradleInstallation extends ToolInstallation
implements EnvironmentSpecific<GradleInstallation>, NodeSpecific<GradleInstallation> {
private final String gradleHome;
@DataBoundConstructor
public GradleInstallation(String name, String home, List<? extends ToolProperty<?>> properties) {
super(name, launderHome(home), properties);
this.gradleHome = super.getHome();
}
private static String launderHome(String home) {
if (home.endsWith("/") || home.endsWith("\\")) {
// see https://issues.apache.org/bugzilla/show_bug.cgi?id=26947
// Ant doesn't like the trailing slash, especially on Windows
return home.substring(0, home.length() - 1);
} else {
return home;
}
}
@Override
public String getHome() {
if (gradleHome != null) return gradleHome;
return super.getHome();
}
public String getExecutable(Launcher launcher) throws IOException, InterruptedException {
return launcher.getChannel().call(new Callable<String, IOException>() {
public String call() throws IOException {
File exe = getExeFile();
if (exe.exists())
return exe.getPath();
return null;
}
});
}
private File getExeFile() {
String execName;
if (Functions.isWindows())
execName = "gradle.bat";
else
execName = "gradle";
String antHome = Util.replaceMacro(gradleHome, EnvVars.masterEnvVars);
return new File(antHome, "bin/" + execName);
}
private static final long serialVersionUID = 1L;
public GradleInstallation forEnvironment(EnvVars environment) {
return new GradleInstallation(getName(), environment.expand(gradleHome), getProperties().toList());
}
public GradleInstallation forNode(Node node, TaskListener log) throws IOException, InterruptedException {
return new GradleInstallation(getName(), translateFor(node, log), getProperties().toList());
}
@Extension
public static class DescriptorImpl extends ToolDescriptor<GradleInstallation> {
public DescriptorImpl() {
}
@Override
public String getDisplayName() {
return Messages.installer_displayName();
}
// for compatibility reasons, the persistence is done by GradleBuilder.DescriptorImpl
@Override
public GradleInstallation[] getInstallations() {
return Hudson.getInstance().getDescriptorByType(Gradle.DescriptorImpl.class).getInstallations();
}
@Override
public void setInstallations(GradleInstallation... installations) {
Hudson.getInstance().getDescriptorByType(Gradle.DescriptorImpl.class).setInstallations(installations);
}
}
}