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();
  }