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 }