package hudson.plugins.toolenv;
import hudson.EnvVars;
import hudson.Extension;
import hudson.Launcher;
import hudson.model.AbstractBuild;
import hudson.model.AbstractProject;
import hudson.model.BuildListener;
import hudson.model.Computer;
import hudson.model.EnvironmentSpecific;
import hudson.slaves.NodeSpecific;
import hudson.tasks.BuildWrapper;
import hudson.tasks.BuildWrapperDescriptor;
import hudson.tools.ToolDescriptor;
import hudson.tools.ToolInstallation;
import java.io.IOException;
import java.util.Collection;
import java.util.Locale;
import java.util.Map;
import java.util.TreeMap;
import org.kohsuke.stapler.DataBoundConstructor;
public class ToolEnvBuildWrapper extends BuildWrapper {
public final String vars;
@DataBoundConstructor public ToolEnvBuildWrapper(String vars) {
this.vars = vars;
}
@SuppressWarnings("rawtypes")
public @Override Environment setUp(AbstractBuild build, Launcher launcher, final BuildListener listener) throws IOException, InterruptedException {
return new Environment() {
public @Override void buildEnvVars(Map<String,String> env) {
for (String var : vars.split(",")) {
if (var.length() == 0) {
continue;
}
ToolInstallation tool = toolsByVar().get(var);
if (tool == null) {
listener.error("No tool found matching " + var);
continue;
}
if (tool instanceof NodeSpecific) {
try {
tool = (ToolInstallation) ((NodeSpecific<?>) tool).forNode(Computer.currentComputer().getNode(), listener);
} catch (Exception x) {
x.printStackTrace(listener.error("Could not install " + var));
continue;
}
}
if (tool instanceof EnvironmentSpecific) {
EnvVars e = new EnvVars(env);
tool = (ToolInstallation) ((EnvironmentSpecific<?>) tool).forEnvironment(e);
}
String home = tool.getHome();
listener.getLogger().println("Setting " + var + "=" + home);
env.put(var, home);
}
}
};
}
private static Map<String,ToolInstallation> toolsByVar() {
Map<String,ToolInstallation> r = new TreeMap<String,ToolInstallation>();
for (ToolDescriptor<?> desc : ToolInstallation.all()) {
for (ToolInstallation inst : desc.getInstallations()) {
r.put(inst.getName().replaceAll("[^a-zA-Z0-9_]+", "_").toUpperCase(Locale.ENGLISH) + "_HOME", inst);
}
}
return r;
}
public static Collection<String> availableVariableNames() {
return toolsByVar().keySet();
}
@Extension public static class Descriptor extends BuildWrapperDescriptor {
@SuppressWarnings("rawtypes")
public boolean isApplicable(AbstractProject item) {
return true;
}
public @Override String getDisplayName() {
return "Tool Environment";
}
}
}