package nl.wldelft.fews.system.plugin.dataImport;

import nl.wldelft.util.TimeUnit;
import nl.wldelft.util.TextUtils;
import nl.wldelft.util.io.LineReader;
import nl.wldelft.util.io.TextParser;
import nl.wldelft.util.timeseries.DefaultTimeSeriesHeader;
import nl.wldelft.util.timeseries.TimeSeriesContentHandler;

/**
 * The KnmiEpsTimeSeriesParser parses ensemble files of Knmi
 */
public class KnmiEpsTimeSeriesParser implements TextParser<TimeSeriesContentHandler> {
    private TimeSeriesContentHandler contentHandler = null;
    private LineReader reader = null;

    private long forecastTime = Long.MIN_VALUE;
    private String[] buffer = new String[1000];

    @Override
    public void parse(LineReader reader, String virtualFileName, TimeSeriesContentHandler contentHandler) throws Exception {
        this.reader = reader;
        this.contentHandler = contentHandler;
        this.contentHandler.addMissingValue(99999F);

        DefaultTimeSeriesHeader header = new DefaultTimeSeriesHeader();
        header.setCurrentReader(reader);

        header.setLocationId(TextUtils.leftFrom(reader.readLine(), ' '));

        while (reader.readLine(' ', buffer) != -1) {
            String parameterId = buffer[0];
            header.setForecastTime("yyyyMMddHH", buffer[1], contentHandler.getDefaultTimeZone());
            forecastTime = header.getForecastTime();

            header.setParameterId(parameterId + "_deterministic");
            contentHandler.setNewTimeSeriesHeader(header);
            parseValues();

            header.setParameterId(parameterId + "_control");
            contentHandler.setNewTimeSeriesHeader(header);
            parseValues();

            for (int i = 0; i < 50; i++) {
                header.setParameterId(parameterId + "_ensemble");
                header.setEnsembleMemberIndex(i);
                contentHandler.setNewTimeSeriesHeader(header);
                parseValues();
            }
        }
    }

    private void parseValues() throws Exception {
        int size = reader.readLine(' ', buffer);
        for (int i = 0; i < size; i++) {
            contentHandler.setTime(forecastTime + i * 6 * TimeUnit.HOUR_MILLIS);
            contentHandler.setValue('.', buffer[i]);
            contentHandler.applyCurrentFields();
        }
    }
}
  • No labels