@Override
  public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException {
    Date startDate = new Date(0L);
    if (first) {
      first = false;
      try {
        startDate = getIncrementalFieldValue();
        if (startDate == null) {
          setOutputDone();
          return false;
        }
      } catch (KettleStepException e) {
        setErrors(1L);
        logError(e.getMessage());
        setOutputDone();
        return false;
      }
      if (data.rowMeta == null) {
        data.rowMeta = new RowMeta();
        data.rowMeta.addValueMeta(
            new ValueMetaInteger(environmentSubstitute(meta.getOutputFieldName())));
      }
    }

    switch (meta.getDownloadType()) {
      case TICKETS:
        for (Ticket ticket : data.conn.getTicketsIncrementally(startDate)) {
          putRow(data.rowMeta, processTicket(ticket));
          incrementLinesOutput();
        }
        break;
      case USERS:
        for (User user : data.conn.getUsersIncrementally(startDate)) {
          putRow(data.rowMeta, processUser(user));
          incrementLinesOutput();
        }
        break;
      case ORGANIZATIONS:
        for (Organization org : data.conn.getOrganizationsIncrementally(startDate)) {
          putRow(data.rowMeta, processOrganization(org));
          incrementLinesOutput();
        }
        break;
      case HELPCENTER_ARTICLES:
        for (Article article : data.conn.getArticlesIncrementally(startDate)) {
          putRow(data.rowMeta, processArticle(article));
        }
        break;
    }
    setOutputDone();
    return false;
  }
  private Date getIncrementalFieldValue() throws KettleException {
    Date result = null;
    boolean firstRow = true;
    Object[] row;
    RowMetaInterface inputRowMeta;

    while ((row = getRow()) != null) {
      if (firstRow) {
        firstRow = false;
        inputRowMeta = getInputRowMeta();

        if (inputRowMeta == null || inputRowMeta.size() <= 0) {
          if (log.isBasic()) {
            logBasic(BaseMessages.getString(PKG, "ZendeskInput.Error.NoIncomingRows"));
          }
          return null;
        }

        String filenameField = environmentSubstitute(meta.getTimestampFieldName());
        int fieldIndex = inputRowMeta.indexOfValue(filenameField);
        if (fieldIndex < 0) {
          throw new KettleStepException(
              BaseMessages.getString(
                  PKG, "ZendeskInputIncremental.Exception.StartDateFieldNotFound", filenameField));
        }
        ValueMetaInterface fieldValueMeta = inputRowMeta.getValueMeta(fieldIndex);
        if (!(fieldValueMeta instanceof ValueMetaDate)) {
          throw new KettleStepException(
              BaseMessages.getString(
                  PKG,
                  "ZendeskInput.Error.WrongFieldType",
                  ValueMetaFactory.getValueMetaName(fieldValueMeta.getType())));
        } else {
          result = fieldValueMeta.getDate(row[fieldIndex]);
        }
      } else {
        if (log.isDetailed()) {
          logDetailed(
              BaseMessages.getString(PKG, "ZendeskInput.Warning.IgnoringAdditionalInputRows"));
        }
      }
    }

    if (firstRow) {
      if (log.isBasic()) {
        logBasic(BaseMessages.getString(PKG, "ZendeskInput.Error.NoIncomingRows"));
      }
    }

    return result;
  }