View Javadoc
1   package de.dlr.shepard.data.timeseries.utilities;
2   
3   import com.opencsv.bean.StatefulBeanToCsv;
4   import com.opencsv.bean.StatefulBeanToCsvBuilder;
5   import com.opencsv.exceptions.CsvException;
6   import de.dlr.shepard.data.timeseries.io.TimeseriesWithDataPoints;
7   import jakarta.annotation.Nonnull;
8   import java.io.IOException;
9   import java.io.StringWriter;
10  import java.util.List;
11  import java.util.Objects;
12  
13  public class CsvRowLineProvider implements CsvLineProvider {
14  
15    private final List<TimeseriesWithDataPoints> timeseriesWithDataPoints;
16  
17    private final StringWriter csvStringWriter;
18    private final StatefulBeanToCsv<CsvTimeseriesDataPoint> csvWriter;
19  
20    private int timeseriesIndex = -1;
21    private int datapointIndex = -1;
22  
23    public CsvRowLineProvider(@Nonnull List<TimeseriesWithDataPoints> timeseriesWithDataPoints) {
24      this.timeseriesWithDataPoints = Objects.requireNonNull(timeseriesWithDataPoints);
25      csvStringWriter = new StringWriter();
26      csvWriter = new StatefulBeanToCsvBuilder<CsvTimeseriesDataPoint>(csvStringWriter)
27        .withApplyQuotesToAll(false)
28        .build();
29    }
30  
31    @Override
32    public String readCsvLine() throws IOException {
33      while (timeseriesIndex < timeseriesWithDataPoints.size()) {
34        if (timeseriesIndex >= 0) {
35          if (datapointIndex < timeseriesWithDataPoints.get(timeseriesIndex).getPoints().size() - 1) {
36            datapointIndex++;
37            break;
38          } else {
39            datapointIndex = -1;
40            timeseriesIndex++;
41          }
42        } else {
43          timeseriesIndex++;
44        }
45      }
46  
47      if (timeseriesIndex >= timeseriesWithDataPoints.size() || datapointIndex < 0) return "";
48  
49      var timeseries = timeseriesWithDataPoints.get(timeseriesIndex).getTimeseries();
50      var dataPoint = timeseriesWithDataPoints.get(timeseriesIndex).getPoints().get(datapointIndex);
51  
52      try {
53        csvWriter.write(
54          new CsvTimeseriesDataPoint(
55            dataPoint.getTimestamp(),
56            timeseries.getMeasurement(),
57            timeseries.getDevice(),
58            timeseries.getLocation(),
59            timeseries.getSymbolicName(),
60            timeseries.getField(),
61            dataPoint.getValue()
62          )
63        );
64  
65        var lineBuffer = csvStringWriter.toString();
66        csvStringWriter.getBuffer().setLength(0);
67        return lineBuffer;
68      } catch (CsvException ex) {
69        throw new IOException(ex);
70      }
71    }
72  }