CsvRowLineProvider.java

package de.dlr.shepard.data.timeseries.utilities;

import com.opencsv.bean.StatefulBeanToCsv;
import com.opencsv.bean.StatefulBeanToCsvBuilder;
import com.opencsv.exceptions.CsvException;
import de.dlr.shepard.data.timeseries.io.TimeseriesWithDataPoints;
import jakarta.annotation.Nonnull;
import java.io.IOException;
import java.io.StringWriter;
import java.util.List;
import java.util.Objects;

public class CsvRowLineProvider implements CsvLineProvider {

  private final List<TimeseriesWithDataPoints> timeseriesWithDataPoints;

  private final StringWriter csvStringWriter;
  private final StatefulBeanToCsv<CsvTimeseriesDataPoint> csvWriter;

  private int timeseriesIndex = -1;
  private int datapointIndex = -1;

  public CsvRowLineProvider(@Nonnull List<TimeseriesWithDataPoints> timeseriesWithDataPoints) {
    this.timeseriesWithDataPoints = Objects.requireNonNull(timeseriesWithDataPoints);
    csvStringWriter = new StringWriter();
    csvWriter = new StatefulBeanToCsvBuilder<CsvTimeseriesDataPoint>(csvStringWriter)
      .withApplyQuotesToAll(false)
      .build();
  }

  @Override
  public String readCsvLine() throws IOException {
    while (timeseriesIndex < timeseriesWithDataPoints.size()) {
      if (timeseriesIndex >= 0) {
        if (datapointIndex < timeseriesWithDataPoints.get(timeseriesIndex).getPoints().size() - 1) {
          datapointIndex++;
          break;
        } else {
          datapointIndex = -1;
          timeseriesIndex++;
        }
      } else {
        timeseriesIndex++;
      }
    }

    if (timeseriesIndex >= timeseriesWithDataPoints.size() || datapointIndex < 0) return "";

    var timeseries = timeseriesWithDataPoints.get(timeseriesIndex).getTimeseries();
    var dataPoint = timeseriesWithDataPoints.get(timeseriesIndex).getPoints().get(datapointIndex);

    try {
      csvWriter.write(
        new CsvTimeseriesDataPoint(
          dataPoint.getTimestamp(),
          timeseries.getMeasurement(),
          timeseries.getDevice(),
          timeseries.getLocation(),
          timeseries.getSymbolicName(),
          timeseries.getField(),
          dataPoint.getValue()
        )
      );

      var lineBuffer = csvStringWriter.toString();
      csvStringWriter.getBuffer().setLength(0);
      return lineBuffer;
    } catch (CsvException ex) {
      throw new IOException(ex);
    }
  }
}