/** Performs an installation. */
  private int install(ToolInstallation t, BuildIDs id, AbstractProject p)
      throws IOException, InterruptedException {

    Run b = p.getBuildByNumber(Integer.parseInt(id.number));
    if (b == null) throw new AbortException("No such build: " + id.number);

    Executor exec = b.getExecutor();
    if (exec == null) throw new AbortException(b.getFullDisplayName() + " is not building");

    Node node = exec.getOwner().getNode();
    if (node == null) {
      throw new AbortException(
          "The node " + exec.getOwner().getDisplayName() + " has been deleted");
    }

    t = t.translate(node, EnvVars.getRemote(checkChannel()), new StreamTaskListener(stderr));
    stdout.println(t.getHome());
    return 0;
  }
  protected int run() throws Exception {
    Jenkins h = Jenkins.getInstance();
    h.checkPermission(Jenkins.READ);

    // where is this build running?
    BuildIDs id = checkChannel().call(new BuildIDs());

    if (!id.isComplete())
      throw new AbortException(
          "This command can be only invoked from a build executing inside Hudson");

    AbstractProject p = Jenkins.getInstance().getItemByFullName(id.job, AbstractProject.class);
    if (p == null) throw new AbortException("No such job found: " + id.job);
    p.checkPermission(Item.CONFIGURE);

    List<String> toolTypes = new ArrayList<String>();
    for (ToolDescriptor<?> d : ToolInstallation.all()) {
      toolTypes.add(d.getDisplayName());
      if (d.getDisplayName().equals(toolType)) {
        List<String> toolNames = new ArrayList<String>();
        for (ToolInstallation t : d.getInstallations()) {
          toolNames.add(t.getName());
          if (t.getName().equals(toolName)) return install(t, id, p);
        }

        // didn't find the right tool name
        error(toolNames, toolName, "name");
      }
    }

    // didn't find the tool type
    error(toolTypes, toolType, "type");

    // will never be here
    throw new AssertionError();
  }
 /** Obtains the {@link hudson.tasks.Maven.MavenInstallation.DescriptorImpl} instance. */
 public Maven.MavenInstallation.DescriptorImpl getToolDescriptor() {
   return ToolInstallation.all().get(Maven.MavenInstallation.DescriptorImpl.class);
 }
 public SbtInstallation.DescriptorImpl getToolDescriptor() {
   return ToolInstallation.all().get(SbtInstallation.DescriptorImpl.class);
 }
 /**
  * Get the installations.
  *
  * @return The installations
  */
 public static PythonInstallation[] list() {
   return ToolInstallation.all().get(DescriptorImpl.class).getInstallations();
 }