public QueuedItemResult queueDispatcherJob(final IDispatchedJob dispatchedJob)
      throws CentralDispatcherException {
    final HashMap<String, String> params = new HashMap<String, String>();
    if (null == dispatchedJob.getJobRef()) {
      throw new IllegalArgumentException("JobRef was null");
    }
    if (null != dispatchedJob.getJobRef().getJobId()) {
      params.put("id", dispatchedJob.getJobRef().getJobId());
    } else {
      if (null != dispatchedJob.getJobRef().getName()) {
        params.put("jobName", dispatchedJob.getJobRef().getName());
      }
      if (null != dispatchedJob.getJobRef().getGroup()) {
        params.put("groupPath", dispatchedJob.getJobRef().getGroup());
      }
    }

    addNodeSetParams(params, dispatchedJob.getNodeSet(), dispatchedJob.isKeepgoing(), "extra.");
    addLoglevelParams(params, dispatchedJob.getLoglevel(), "extra.");
    if (null != dispatchedJob.getArgs() && dispatchedJob.getArgs().length > 0) {
      params.put("extra.argString", CLIUtils.generateArgline(null, dispatchedJob.getArgs()));
    }
    /*
     * submit request to the URL path, expecting standard "queued item list" result
     */
    return submitQueueRequest(null, params, RUNDECK_JOBS_RUN);
  }
  public QueuedItemResult queueDispatcherJob(final IDispatchedJob dispatchedJob)
      throws CentralDispatcherException {
    final HashMap<String, String> params = new HashMap<String, String>();
    if (null == dispatchedJob.getJobRef()) {
      throw new IllegalArgumentException("JobRef was null");
    }
    final String jobid;
    if (null != dispatchedJob.getJobRef().getJobId()) {
      jobid = dispatchedJob.getJobRef().getJobId();
    } else {
      if (null == dispatchedJob.getJobRef().getName()
          || "".equals(dispatchedJob.getJobRef().getName())) {
        throw new CentralDispatcherException("job name input is required");
      }
      final String project = dispatchedJob.getJobRef().getProject();
      final String name = dispatchedJob.getJobRef().getName();
      final String group;
      if (null != dispatchedJob.getJobRef().getGroup()
          && !"".equals(dispatchedJob.getJobRef().getGroup())) {
        group = dispatchedJob.getJobRef().getGroup();
      } else {
        // indicates a top level job
        group = "-";
      }

      // Query to find matching job
      final Collection<IStoredJob> iStoredJobs =
          reallistStoredJobs(new IStoredJobsQueryImpl(name, group, null, project));
      if (null == iStoredJobs) {
        throw new CentralDispatcherException("Unable to query jobs");
      }
      if (iStoredJobs.size() < 1) {
        throw new CentralDispatcherException(
            "Job not found matching query: " + (null != group ? group : "") + "/" + name);
      }
      if (iStoredJobs.size() > 1) {
        ArrayList<String> ids = new ArrayList<String>();
        for (final IStoredJob iStoredJob : iStoredJobs) {
          ids.add(iStoredJob.getJobId());
        }
        throw new CentralDispatcherException(
            "Job was not unique: "
                + (null != group ? group : "")
                + "/"
                + name
                + ": "
                + iStoredJobs.size()
                + " jobs found: "
                + ids);
      }
      // use found id
      final IStoredJob next = iStoredJobs.iterator().next();
      jobid = next.getJobId();
    }

    addAPINodeSetParams(params, dispatchedJob.getNodeSet(), dispatchedJob.isKeepgoing());
    addLoglevelParams(params, dispatchedJob.getLoglevel());
    if (null != dispatchedJob.getArgs() && dispatchedJob.getArgs().length > 0) {
      params.put("argString", CLIUtils.generateArgline(null, dispatchedJob.getArgs()));
    }

    final String apipath = substitutePathVariable(RUNDECK_API_JOBS_RUN, "id", jobid);
    return submitExecutionRequest(null, params, apipath);
  }