public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException { meta = (GetPreviousRowFieldMeta) smi; data = (GetPreviousRowFieldData) sdi; Object[] r = getRow(); // Get row from input rowset & set row busy! if (r == null) { // no more input to be expected... setOutputDone(); return false; } if (first) { data.inputRowMeta = getInputRowMeta(); data.NrPrevFields = data.inputRowMeta.size(); data.outputRowMeta = data.inputRowMeta.clone(); meta.getFields(data.outputRowMeta, getStepname(), null, null, this, repository, metaStore); data.inStreamNrs = new int[meta.getFieldInStream().length]; for (int i = 0; i < meta.getFieldInStream().length; i++) { data.inStreamNrs[i] = data.inputRowMeta.indexOfValue(meta.getFieldInStream()[i]); if (data.inStreamNrs[i] < 0) { // couldn't find field! throw new KettleException( BaseMessages.getString( PKG, "GetPreviousRowField.Exception.FieldRequired", meta.getFieldInStream()[i])); } } data.outStreamNrs = new String[meta.getFieldInStream().length]; for (int i = 0; i < meta.getFieldInStream().length; i++) { data.outStreamNrs[i] = meta.getFieldOutStream()[i]; if (Const.isEmpty(data.outStreamNrs[i])) { throw new KettleStepException( BaseMessages.getString( PKG, "GetPreviousRowField.Exception.OutputFieldEmpty", "" + i)); } } } // end if first try { Object[] outputRow = getOutputRowData(r); putRow(data.outputRowMeta, outputRow); // copy row to output rowset(s); if (checkFeedback(getLinesRead())) { if (log.isDetailed()) { logDetailed( BaseMessages.getString(PKG, "GetPreviousRowField.Log.LineNumber") + getLinesRead()); } } } catch (KettleException e) { boolean sendToErrorRow = false; String errorMessage = null; if (getStepMeta().isDoingErrorHandling()) { sendToErrorRow = true; errorMessage = e.toString(); } else { logError( BaseMessages.getString(PKG, "GetPreviousRowField.Log.ErrorInStep", e.getMessage())); setErrors(1); stopAll(); setOutputDone(); // signal end to receiver(s) return false; } if (sendToErrorRow) { // Simply add this row to the error row putError(getInputRowMeta(), r, 1, errorMessage, null, "GetPreviousRowField001"); } } return true; }