class BaseStep implements VariableSpace, StepInterface, LoggingObjectInterface, ExtensionDataInterface {

  public RowMetaAndData buildLog( String sname, int copynr, long lines_read, long lines_written,
                                  long lines_updated, long lines_skipped, long errors, Date start_date,
                                  Date end_date ) {
    RowMetaInterface r = new RowMeta();
    Object[] data = new Object[ 9 ];
    int nr = 0;

    r.addValueMeta( new ValueMetaString(
      BaseMessages.getString( PKG, "BaseStep.ColumnName.Stepname" ) ) );
    data[ nr ] = sname;
    nr++;

    r.addValueMeta( new ValueMetaNumber(
      BaseMessages.getString( PKG, "BaseStep.ColumnName.Copy" ) ) );
    data[ nr ] = new Double( copynr );
    nr++;

    r.addValueMeta( new ValueMetaNumber(
      BaseMessages.getString( PKG, "BaseStep.ColumnName.LinesReaded" ) ) );
    data[ nr ] = new Double( lines_read );
    nr++;

    r.addValueMeta( new ValueMetaNumber(
      BaseMessages.getString( PKG, "BaseStep.ColumnName.LinesWritten" ) ) );
    data[ nr ] = new Double( lines_written );
    nr++;

    r.addValueMeta( new ValueMetaNumber(
      BaseMessages.getString( PKG, "BaseStep.ColumnName.LinesUpdated" ) ) );
    data[ nr ] = new Double( lines_updated );
    nr++;

    r.addValueMeta( new ValueMetaNumber(
      BaseMessages.getString( PKG, "BaseStep.ColumnName.LinesSkipped" ) ) );
    data[ nr ] = new Double( lines_skipped );
    nr++;

    r.addValueMeta( new ValueMetaNumber(
      BaseMessages.getString( PKG, "BaseStep.ColumnName.Errors" ) ) );
    data[ nr ] = new Double( errors );
    nr++;

    r.addValueMeta( new ValueMetaDate( "start_date" ) );
    data[ nr ] = start_date;
    nr++;

    r.addValueMeta( new ValueMetaDate( "end_date" ) );
    data[ nr ] = end_date;
    nr++;

    return new RowMetaAndData( r, data );
  }

  public  BaseStep( StepMeta stepMeta, StepDataInterface stepDataInterface, int copyNr, TransMeta transMeta,
                   Trans trans );

}