public class RmoTimeSeriesServerParser implements ServerParser<TimeSeriesContentHandler>, TimeSeriesHeadersConsumer, PeriodConsumer {
    private static final Logger log = Logger.getLogger(RmoTimeSeriesServerParser.class);
    
    private FastDateFormat dateFormat = null;
    private FastDateFormat timeFormat = null;
    private TimeSeriesHeader[] headers = null;
    private Period period = null;

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

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

    // http://000.000.00.00:8002/query?stations=1300H014,B,1300H013,1300H016,1300H017&start=2007-10-01&end=2007-10-10&startTime=00:00:00&endTime=00:00:00
    @Override
    public void parse(URL url, String username, String password, TimeSeriesContentHandler contentHandler) throws IOException {
        if (period == Period.ANY_TIME)
            throw new IllegalArgumentException("contentHandler.getWantedPeriod() == Period.ANY_TIME");

        dateFormat = FastDateFormat.getInstance("yyyy-MM-dd", contentHandler.getDefaultTimeZone(), Locale.US, dateFormat);
        timeFormat = FastDateFormat.getInstance("HH:mm:ss", contentHandler.getDefaultTimeZone(), Locale.US, timeFormat);
        Date startDate = period.getStartDate();
        Date endDate = period.getEndDate();
        String periodQuery = "&start=" + dateFormat.format(startDate) + "&end="  + dateFormat.format(endDate)
                + "&startTime=" + timeFormat.format(startDate) + "&endTime=" + timeFormat.format(endDate);

        PiTimeSeriesParser piTimeSeriesParser = new PiTimeSeriesParser();
        for (int i = 0; i < headers.length; i++) {
            TimeSeriesHeader header = headers[i];
            String locationId = header.getLocationId();
            URL fullUrl = new URL(url.toExternalForm() + "/query?stations=" + locationId + periodQuery);
            if (log.isDebugEnabled()) log.debug(fullUrl.toExternalForm());

            try {
                InputStream stream = fullUrl.openStream();
                try {
                    IOUtils.parse(stream, url.toString(), piTimeSeriesParser, contentHandler);
                } finally {
                    stream.close();
                }
            } catch (ConnectException e) {
                log.warn("Can not connect to " + fullUrl + ' ' + e.getMessage(), e);
                return;
            } catch (Exception e) {
                log.warn("Can not parse data for " + header + ' ' + e.getMessage(), e);
            }
        }

    }
}
  • No labels