public Result execute(Result result, int nr) throws KettleException {
    result.setResult(true);
    result.setNrErrors(0);
    try {

      List<String> variables = new ArrayList<String>();
      List<String> variableValues = new ArrayList<String>();
      List<Integer> variableTypes = new ArrayList<Integer>();

      String realFilename = environmentSubstitute(filename);
      try {
        if (!Const.isEmpty(realFilename)) {
          Properties properties = new Properties();
          properties.load(KettleVFS.getInputStream(realFilename));
          for (Object key : properties.keySet()) {
            variables.add((String) key);
            variableValues.add((String) properties.get(key));
            variableTypes.add(fileVariableType);
          }
        }
      } catch (Exception e) {
        throw new KettleException(
            BaseMessages.getString(
                PKG, "JobEntrySetVariables.Error.UnableReadPropertiesFile", realFilename));
      }

      for (int i = 0; i < variableName.length; i++) {
        variables.add(variableName[i]);
        variableValues.add(variableValue[i]);
        variableTypes.add(variableType[i]);
      }

      for (int i = 0; i < variables.size(); i++) {
        String varname = variables.get(i);
        String value = variableValues.get(i);
        int type = variableTypes.get(i);

        if (replaceVars) {
          varname = environmentSubstitute(varname);
          value = environmentSubstitute(value);
        }

        // OK, where do we set this value...
        switch (type) {
          case VARIABLE_TYPE_JVM:
            {
              System.setProperty(varname, value);
              setVariable(varname, value);
              Job parentJobTraverse = parentJob;
              while (parentJobTraverse != null) {
                parentJobTraverse.setVariable(varname, value);
                parentJobTraverse = parentJobTraverse.getParentJob();
              }
            }
            break;
          case VARIABLE_TYPE_ROOT_JOB:
            {
              // set variable in this job entry
              setVariable(varname, value);
              Job rootJob = parentJob;
              while (rootJob != null) {
                rootJob.setVariable(varname, value);
                rootJob = rootJob.getParentJob();
              }
            }
            break;
          case VARIABLE_TYPE_CURRENT_JOB:
            {
              setVariable(varname, value);
              if (parentJob != null) {
                parentJob.setVariable(varname, value);
              } else {
                throw new KettleJobException(
                    BaseMessages.getString(
                        PKG, "JobEntrySetVariables.Error.UnableSetVariableCurrentJob", varname));
              }
            }
            break;
          case VARIABLE_TYPE_PARENT_JOB:
            {
              setVariable(varname, value);

              if (parentJob != null) {
                parentJob.setVariable(varname, value);
                Job gpJob = parentJob.getParentJob();
                if (gpJob != null) {
                  gpJob.setVariable(varname, value);
                } else {
                  throw new KettleJobException(
                      BaseMessages.getString(
                          PKG, "JobEntrySetVariables.Error.UnableSetVariableParentJob", varname));
                }
              } else {
                throw new KettleJobException(
                    BaseMessages.getString(
                        PKG, "JobEntrySetVariables.Error.UnableSetVariableCurrentJob", varname));
              }
            }
            break;
          default:
            break;
        }

        // ok we can process this line
        if (log.isDetailed()) {
          logDetailed(
              BaseMessages.getString(
                  PKG, "JobEntrySetVariables.Log.SetVariableToValue", varname, value));
        }
      }
    } catch (Exception e) {
      result.setResult(false);
      result.setNrErrors(1);

      logError(
          BaseMessages.getString(PKG, "JobEntrySetVariables.UnExcpectedError", e.getMessage()));
    }

    return result;
  }