public String getXML() throws IOException {
    StringBuilder xml = new StringBuilder(160);

    xml.append("  <" + XML_TAG + ">").append(Const.CR);

    xml.append("    ").append(XMLHandler.addTagValue("exec_local", executingLocally));

    xml.append("    ").append(XMLHandler.addTagValue("exec_remote", executingRemotely));
    if (remoteServer != null) {
      xml.append("    ").append(remoteServer.getXML()).append(Const.CR);
    }
    xml.append("    ").append(XMLHandler.addTagValue("pass_export", passingExport));

    // Serialize the parameters...
    //
    xml.append("    <parameters>").append(Const.CR);
    List<String> paramNames = new ArrayList<String>(params.keySet());
    Collections.sort(paramNames);
    for (String name : paramNames) {
      String value = params.get(name);
      xml.append("    <parameter>");
      xml.append(XMLHandler.addTagValue("name", name, false));
      xml.append(XMLHandler.addTagValue("value", value, false));
      xml.append("</parameter>").append(Const.CR);
    }
    xml.append("    </parameters>").append(Const.CR);

    // Serialize the variables...
    //
    xml.append("    <variables>").append(Const.CR);
    List<String> variableNames = new ArrayList<String>(variables.keySet());
    Collections.sort(variableNames);
    for (String name : variableNames) {
      String value = variables.get(name);
      xml.append("    <variable>");
      xml.append(XMLHandler.addTagValue("name", name, false));
      xml.append(XMLHandler.addTagValue("value", value, false));
      xml.append("</variable>").append(Const.CR);
    }
    xml.append("    </variables>").append(Const.CR);

    // Serialize the variables...
    //
    xml.append("    <arguments>").append(Const.CR);
    List<String> argumentNames = new ArrayList<String>(arguments.keySet());
    Collections.sort(argumentNames);
    for (String name : argumentNames) {
      String value = arguments.get(name);
      xml.append("    <argument>");
      xml.append(XMLHandler.addTagValue("name", name, false));
      xml.append(XMLHandler.addTagValue("value", value, false));
      xml.append("</argument>").append(Const.CR);
    }
    xml.append("    </arguments>").append(Const.CR);

    xml.append("    ").append(XMLHandler.addTagValue("replay_date", replayDate));
    xml.append("    ").append(XMLHandler.addTagValue("safe_mode", safeModeEnabled));
    xml.append("    ").append(XMLHandler.addTagValue("log_level", logLevel.getCode()));
    xml.append("    ").append(XMLHandler.addTagValue("clear_log", clearingLog));

    xml.append("    ").append(XMLHandler.addTagValue("start_copy_name", startCopyName));
    xml.append("    ").append(XMLHandler.addTagValue("start_copy_nr", startCopyNr));

    xml.append("    ").append(XMLHandler.addTagValue("gather_metrics", gatheringMetrics));
    xml.append("    ").append(XMLHandler.addTagValue("expand_remote_job", expandingRemoteJob));
    if (passedBatchId != null) {
      xml.append("    ").append(XMLHandler.addTagValue("passedBatchId", passedBatchId));
    }

    // The source rows...
    //
    if (previousResult != null) {
      xml.append(previousResult.getXML());
    }

    // Send the repository name and user to the remote site...
    //
    if (repository != null) {
      xml.append(XMLHandler.openTag("repository"));
      xml.append(XMLHandler.addTagValue("name", repository.getName()));
      // File base repositories doesn't have user info
      if (repository.getUserInfo() != null) {
        xml.append(XMLHandler.addTagValue("login", repository.getUserInfo().getLogin()));
        xml.append(
            XMLHandler.addTagValue(
                "password", Encr.encryptPassword(repository.getUserInfo().getPassword())));
      }
      xml.append(XMLHandler.closeTag("repository"));
    }

    xml.append("</" + XML_TAG + ">").append(Const.CR);
    return xml.toString();
  }