package jenkins.plugins.accurev; import hudson.EnvVars; import hudson.Extension; import hudson.init.Initializer; import hudson.model.EnvironmentSpecific; import hudson.model.Node; import hudson.model.TaskListener; import hudson.slaves.NodeSpecific; import hudson.tools.ToolDescriptor; import hudson.tools.ToolInstallation; import hudson.tools.ToolProperty; import hudson.util.FormValidation; import jenkins.model.Jenkins; import net.sf.json.JSONObject; import org.jenkinsci.Symbol; import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.StaplerRequest; import javax.annotation.Nonnull; import java.io.File; import java.io.IOException; import java.util.Collections; import java.util.List; import java.util.logging.Logger; import static hudson.init.InitMilestone.EXTENSIONS_AUGMENTED; /** * Initialized by josep on 21-01-2017. */ public class AccurevTool extends ToolInstallation implements NodeSpecific<AccurevTool>, EnvironmentSpecific<AccurevTool> { public static transient final String DEFAULT = "Default"; private static final long serialVersionUID = 1; private static final Logger LOGGER = Logger.getLogger(AccurevTool.class.getName()); /** * Constructor for AccurevTool * * @param name Tool name * @param home Tool location (usually "accurev") * @param properties {@link java.util.List} of properties for this tool */ @DataBoundConstructor public AccurevTool(String name, String home, List<? extends ToolProperty<?>> properties) { super(name, home, properties); } private static AccurevTool[] getInstallations(DescriptorImpl descriptor) { AccurevTool[] installations; try { installations = descriptor.getInstallations(); } catch (NullPointerException e) { installations = new AccurevTool[0]; } return installations; } /** * Returns the default installation. * * @return default installation */ public static AccurevTool getDefaultInstallation() { Jenkins jenkinsInstance = Jenkins.getInstance(); DescriptorImpl AccurevTools = jenkinsInstance.getDescriptorByType(AccurevTool.DescriptorImpl.class); AccurevTool tool = AccurevTools.getInstallation(AccurevTool.DEFAULT); if (tool != null) { return tool; } else { AccurevTool[] installations = AccurevTools.getInstallations(); if (installations.length > 0) { return installations[0]; } else { onLoaded(); return AccurevTools.getInstallations()[0]; } } } @Initializer(after = EXTENSIONS_AUGMENTED) public static void onLoaded() { //Creates default tool installation if needed. Uses "accurev" or migrates data from previous versions Jenkins jenkinsInstance = Jenkins.getInstance(); DescriptorImpl descriptor = (DescriptorImpl) jenkinsInstance.getDescriptor(AccurevTool.class); AccurevTool[] installations = getInstallations(descriptor); if (installations != null && installations.length > 0) { //No need to initialize if there's already something return; } String defaultAccurevExe = "accurev"; AccurevTool tool = new AccurevTool(DEFAULT, defaultAccurevExe, Collections.emptyList()); descriptor.setInstallations(tool); descriptor.save(); } public AccurevTool forNode(@Nonnull Node node, TaskListener log) throws IOException, InterruptedException { return new AccurevTool(getName(), translateFor(node, log), Collections.emptyList()); } public AccurevTool forEnvironment(EnvVars environment) { return new AccurevTool(getName(), environment.expand(getHome()), Collections.emptyList()); } @Override public DescriptorImpl getDescriptor() { Jenkins jenkinsInstance = Jenkins.getInstance(); return (DescriptorImpl) jenkinsInstance.getDescriptorOrDie(getClass()); } @Extension @Symbol("accurev") public static class DescriptorImpl extends ToolDescriptor<AccurevTool> { public DescriptorImpl() { super(); load(); } @Override @Nonnull public String getDisplayName() { return "Accurev"; } @SuppressWarnings("SuspiciousToArrayCall") @Override public boolean configure(StaplerRequest req, JSONObject json) throws FormException { setInstallations(req.bindJSONToList(clazz, json.get("tool")).toArray(new AccurevTool[0])); save(); return true; } public FormValidation doCheckHome(@QueryParameter File value) { Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); String path = value.getPath(); return FormValidation.validateExecutable(path); } public AccurevTool getInstallation(String name) { for (AccurevTool i : getInstallations()) { if (i.getName().equals(name)) { return i; } } return null; } } }