/**
   * Notify RM to create a new job.
   *
   * @param parentID parent element ID
   * @param jobID the ID of the job
   * @param attrMgr attributes from the job thread
   * @return job id of the newly created job
   */
  public String createJob(String parentID, AttributeManager attrMgr) throws CoreException {
    ElementAttributeManager mgr = new ElementAttributeManager();
    AttributeManager jobAttrMgr = new AttributeManager();

    /*
     * Add generated attributes.
     */
    String jobID = generateID().toString();
    jobAttrMgr.addAttribute(JobAttributes.getJobIdAttributeDefinition().create(jobID));
    jobAttrMgr.addAttribute(
        JobAttributes.getStatusAttributeDefinition()
            .create(MPIJobAttributes.Status.NORMAL.toString()));
    jobAttrMgr.addAttribute(
        JobAttributes.getUserIdAttributeDefinition().create(System.getenv("USER"))); // $NON-NLS-1$
    jobAttrMgr.addAttribute(
        ElementAttributes.getNameAttributeDefinition().create(generateJobName()));

    /*
     * Get mandatory launch attributes.
     */
    String subId = getAttributeValue(JobAttributes.getSubIdAttributeDefinition(), attrMgr);
    String execName =
        getAttributeValue(JobAttributes.getExecutableNameAttributeDefinition(), attrMgr);
    String execPath =
        getAttributeValue(JobAttributes.getExecutablePathAttributeDefinition(), attrMgr);
    String workDir =
        getAttributeValue(JobAttributes.getWorkingDirectoryAttributeDefinition(), attrMgr);
    Integer numProcs =
        getAttributeValue(JobAttributes.getNumberOfProcessesAttributeDefinition(), attrMgr);
    List<? extends String> progArgs =
        getAttributeValue(JobAttributes.getProgramArgumentsAttributeDefinition(), attrMgr);

    /*
     * Copy these relevant attributes to IPJob.
     */
    jobAttrMgr.addAttribute(JobAttributes.getSubIdAttributeDefinition().create(subId));
    jobAttrMgr.addAttribute(JobAttributes.getExecutableNameAttributeDefinition().create(execName));
    jobAttrMgr.addAttribute(JobAttributes.getExecutablePathAttributeDefinition().create(execPath));
    jobAttrMgr.addAttribute(JobAttributes.getWorkingDirectoryAttributeDefinition().create(workDir));
    try {
      jobAttrMgr.addAttribute(
          JobAttributes.getNumberOfProcessesAttributeDefinition().create(numProcs));
    } catch (IllegalValueException e) {
      RMCorePlugin.log(e);
    }
    jobAttrMgr.addAttribute(
        JobAttributes.getProgramArgumentsAttributeDefinition()
            .create(progArgs.toArray(new String[0])));

    /*
     * Copy optional attributes
     */
    BooleanAttribute debugAttr =
        attrMgr.getAttribute(JobAttributes.getDebugFlagAttributeDefinition());
    if (debugAttr != null) {
      jobAttrMgr.addAttribute(
          JobAttributes.getDebugFlagAttributeDefinition().create(debugAttr.getValue()));
    }

    /*
     * Notify RM.
     */
    mgr.setAttributeManager(new RangeSet(jobID), jobAttrMgr);
    fireRuntimeNewJobEvent(eventFactory.newRuntimeNewJobEvent(parentID, mgr));

    DebugUtil.trace(
        DebugUtil.RTS_TRACING,
        "RTS {0}: new job #{1}",
        getResourceManager().getConfiguration().getName(),
        jobID); //$NON-NLS-1$

    return jobID;
  }