public JobExecutionConfiguration(Node trecNode) throws KettleException {
    this();

    executingLocally = "Y".equalsIgnoreCase(XMLHandler.getTagValue(trecNode, "exec_local"));

    executingRemotely = "Y".equalsIgnoreCase(XMLHandler.getTagValue(trecNode, "exec_remote"));
    Node remoteHostNode = XMLHandler.getSubNode(trecNode, SlaveServer.XML_TAG);
    if (remoteHostNode != null) {
      remoteServer = new SlaveServer(remoteHostNode);
    }
    passingExport = "Y".equalsIgnoreCase(XMLHandler.getTagValue(trecNode, "pass_export"));
    expandingRemoteJob =
        "Y".equalsIgnoreCase(XMLHandler.getTagValue(trecNode, "expand_remote_job"));

    // Read the variables...
    //
    Node varsNode = XMLHandler.getSubNode(trecNode, "variables");
    int nrVariables = XMLHandler.countNodes(varsNode, "variable");
    for (int i = 0; i < nrVariables; i++) {
      Node argNode = XMLHandler.getSubNodeByNr(varsNode, "variable", i);
      String name = XMLHandler.getTagValue(argNode, "name");
      String value = XMLHandler.getTagValue(argNode, "value");
      if (!Utils.isEmpty(name) && !Utils.isEmpty(value)) {
        variables.put(name, value);
      }
    }

    // Read the arguments...
    //
    Node argsNode = XMLHandler.getSubNode(trecNode, "arguments");
    int nrArguments = XMLHandler.countNodes(argsNode, "argument");
    for (int i = 0; i < nrArguments; i++) {
      Node argNode = XMLHandler.getSubNodeByNr(argsNode, "argument", i);
      String name = XMLHandler.getTagValue(argNode, "name");
      String value = XMLHandler.getTagValue(argNode, "value");
      if (!Utils.isEmpty(name) && !Utils.isEmpty(value)) {
        arguments.put(name, value);
      }
    }

    // Read the parameters...
    //
    Node parmsNode = XMLHandler.getSubNode(trecNode, "parameters");
    int nrParams = XMLHandler.countNodes(parmsNode, "parameter");
    for (int i = 0; i < nrParams; i++) {
      Node parmNode = XMLHandler.getSubNodeByNr(parmsNode, "parameter", i);
      String name = XMLHandler.getTagValue(parmNode, "name");
      String value = XMLHandler.getTagValue(parmNode, "value");
      if (!Utils.isEmpty(name)) {
        params.put(name, value);
      }
    }

    replayDate = XMLHandler.stringToDate(XMLHandler.getTagValue(trecNode, "replay_date"));
    safeModeEnabled = "Y".equalsIgnoreCase(XMLHandler.getTagValue(trecNode, "safe_mode"));
    logLevel = LogLevel.getLogLevelForCode(XMLHandler.getTagValue(trecNode, "log_level"));
    clearingLog = "Y".equalsIgnoreCase(XMLHandler.getTagValue(trecNode, "clear_log"));

    startCopyName = XMLHandler.getTagValue(trecNode, "start_copy_name");
    startCopyNr = Const.toInt(XMLHandler.getTagValue(trecNode, "start_copy_nr"), 0);

    gatheringMetrics = "Y".equalsIgnoreCase(XMLHandler.getTagValue(trecNode, "gather_metrics"));

    String sPassedBatchId = XMLHandler.getTagValue(trecNode, "passedBatchId");
    if (!StringUtils.isEmpty(sPassedBatchId)) {
      passedBatchId = Long.parseLong(sPassedBatchId);
    }

    Node resultNode = XMLHandler.getSubNode(trecNode, Result.XML_TAG);
    if (resultNode != null) {
      try {
        previousResult = new Result(resultNode);
      } catch (KettleException e) {
        throw new KettleException("Unable to hydrate previous result", e);
      }
    }

    // Try to get a handle to the repository from here...
    //
    Node repNode = XMLHandler.getSubNode(trecNode, "repository");
    if (repNode != null) {
      String repositoryName = XMLHandler.getTagValue(repNode, "name");
      String username = XMLHandler.getTagValue(repNode, "login");
      String password = Encr.decryptPassword(XMLHandler.getTagValue(repNode, "password"));
      connectRepository(repositoryName, username, password);
    }
  }