/** Corresponds to <element name="javaExecutable"> */
  private Element createJavaExecutableElement(Document doc, JavaTask t) {
    Element executableE =
        doc.createElementNS(Schemas.SCHEMA_LATEST.namespace, XMLTags.JAVA_EXECUTABLE.getXMLName());
    setAttribute(executableE, XMLAttributes.TASK_CLASS_NAME, t.getExecutableClassName(), true);

    // <ref name="javaParameters"/>
    try {
      Map<String, Serializable> args = t.getArguments();
      if ((args != null) && (args.size() > 0)) {
        // <element name="parameter">
        Element paramsE =
            doc.createElementNS(
                Schemas.SCHEMA_LATEST.namespace, XMLTags.TASK_PARAMETERS.getXMLName());
        for (String name : args.keySet()) {
          Serializable val = args.get(name);
          Element paramE =
              doc.createElementNS(
                  Schemas.SCHEMA_LATEST.namespace, XMLTags.TASK_PARAMETER.getXMLName());
          setAttribute(paramE, XMLAttributes.COMMON_NAME, name, true);
          setAttribute(paramE, XMLAttributes.COMMON_VALUE, val.toString(), true);
          paramsE.appendChild(paramE);
        }
        executableE.appendChild(paramsE);
      }
    } catch (Exception e) {
      logger.error("Could not add arguments for Java Executable element of task " + t.getName(), e);
    }
    return executableE;
  }
  /**
   * Create an internal java Task with the given java task (user)
   *
   * @param task the user java task that will be used to create the internal java task.
   * @return the created internal task.
   * @throws JobCreationException an exception if the factory cannot create the given task.
   */
  @SuppressWarnings("unchecked")
  private static InternalTask createTask(Job userJob, JavaTask task) throws JobCreationException {
    InternalTask javaTask;

    if (task.getExecutableClassName() != null) {
      HashMap<String, byte[]> args = task.getSerializedArguments();

      try {
        if (isForkingTask()) {
          javaTask =
              new InternalForkedScriptTask(
                  new ScriptExecutableContainer(
                      new TaskScript(
                          new SimpleScript(
                              task.getExecutableClassName(),
                              JavaClassScriptEngineFactory.JAVA_CLASS_SCRIPT_ENGINE_NAME,
                              new Serializable[] {args}))));
          javaTask.setForkEnvironment(task.getForkEnvironment());
          configureRunAsMe(task);
        } else {
          javaTask =
              new InternalScriptTask(
                  new ScriptExecutableContainer(
                      new TaskScript(
                          new SimpleScript(
                              task.getExecutableClassName(),
                              JavaClassScriptEngineFactory.JAVA_CLASS_SCRIPT_ENGINE_NAME,
                              new Serializable[] {args}))));
        }
      } catch (InvalidScriptException e) {
        throw new JobCreationException(e);
      }
    } else {
      String msg =
          "You must specify your own executable task class to be launched (in every task)!";
      logger.info(msg);
      throw new JobCreationException(msg);
    }

    // set task common properties
    try {
      setTaskCommonProperties(userJob, task, javaTask);
    } catch (Exception e) {
      throw new JobCreationException(e);
    }
    return javaTask;
  }