package nl.wldelft.aquarius.ratingcurveparsers;
/* ================================================================
 * Delft FEWS 
 * ================================================================
 *
 * Project Info:  http://www.wldelft.nl/soft/fews/index.html
 * Project Lead:  Karel Heynert (karel.heynert@wldelft.nl)
 *
 * (C) Copyright 2003, by WL | Delft Hydraulics
 *                        P.O. Box 177
 *                        2600 MH  Delft
 *                        The Netherlands
 *                        http://www.wldelft.nl
 *
 * DELFT-FEWS is a sophisticated collection of modules designed 
 * for building a FEWS customised to the specific requirements 
 * of individual agencies. An open modelling approach allows users
 * to add their own modules in an efficient way.
 *
 * ----------------------------------------------------------------
 * AquariusRatingCurveSoapServerParser
 * ----------------------------------------------------------------
 * (C) Copyright 2003, by WL | Delft Hydraulics
 *
 * Original Author: rooij_e
 * Contributor(s):   
 *
 * Changes:
 * --------
 * 2/27/14 : Version 1 ();
 * 
 *
 */

import nl.wldelft.aquarius.CsvRatingTableParser;
import nl.wldelft.aquarius.util.AquariusSoapUtils;
import nl.wldelft.util.Period;
import nl.wldelft.util.PeriodConsumer;
import nl.wldelft.util.TextUtils;
import nl.wldelft.util.io.LineReader;
import nl.wldelft.util.io.ServerParser;
import nl.wldelft.util.timeseries.TimeSeriesContentHandler;
import nl.wldelft.util.timeseries.TimeSeriesHeader;
import nl.wldelft.util.timeseries.TimeSeriesHeadersConsumer;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.io.IOException;
import java.io.StringReader;
import java.net.URL;

public class AquariusRatingCurveSoapServerParser implements ServerParser<TimeSeriesContentHandler>, TimeSeriesHeadersConsumer, PeriodConsumer {

    private static final Logger log = LogManager.getLogger();

    private TimeSeriesHeader[] headers = null;
    private Period searchPeriod = Period.ANY_TIME;

    @Override
    public void parse(URL url, String username, String password, TimeSeriesContentHandler timeSeriesContentHandler) throws Exception {

        if (headers == null || headers.length == 0) {
            throw new Exception("No wanted parameters and locations found. Configure these in the id map of"
                    + " your import.");
        }

        String authToken = AquariusSoapUtils.getAuthToke(url, username, password);

        for (TimeSeriesHeader header : headers) {
                if (header.getQualifierCount() != 3) {
                log.warn("Incorrect RatingCurve IdMap configuration for location=%s! " +
                        "Please configure IdMap as follows: externalLocation=locationId, externalQualifier='input parameter', externalQualifier1='output parameter' and externalQualifier2=['StageDischarge' or 'DischargeStage'] ",
                        header.getLocationId());
                continue;
            }
            try {
                retrieveRatingCurves(timeSeriesContentHandler, url, header, authToken);
                log.debug("Successfully parsed ratingcurves for header %s", header);
            } catch (Exception e) {
                log.warn("Error importing ratingcurvers for header %s: %s", header, e.getMessage());
            }
        }

    }

    private void retrieveRatingCurves(TimeSeriesContentHandler timeSeriesContentHandler, URL url,
                                             TimeSeriesHeader header, String authToken) throws Exception {


        /** Set destination header for returned data **/
        timeSeriesContentHandler.setTimeSeriesHeader(header);


        /** Read data for given dataset id **/
        String csvRatingTable = AquariusSoapUtils.getRatingCurveTable(url, header.getLocationId(), header.getQualifierId(0),
                header.getQualifierId(1), authToken);
        csvRatingTable = TextUtils.trimToNull(csvRatingTable);
        if (csvRatingTable == null) return;
        CsvRatingTableParser csvRatingTableParser = new CsvRatingTableParser(searchPeriod);
        csvRatingTableParser.setRatingCurveType(CsvRatingTableParser.RatingCurveType.valueOf(header.getQualifierId(2)));

        LineReader lineReader = new LineReader(new StringReader(csvRatingTable), "ratingTable.csv");
        try {
            csvRatingTableParser.parse(lineReader, "ratingTable.csv", timeSeriesContentHandler);
        } catch (IOException e) {
            throw new IOException(e.getMessage() + csvRatingTable);
        }

    }

    @Override
    public void setTimeSeriesHeaders(TimeSeriesHeader[] timeSeriesHeaders) {
        this.headers = timeSeriesHeaders;
    }

    @Override
    public void setPeriod(Period period) {
        this.searchPeriod = period;
    }
}



  • No labels