view flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/DischargeInfoService.java @ 4031:e4e345d81a65

issue889/2
author Felix Wolfsteller <felix.wolfsteller@intevation.de>
date Thu, 04 Oct 2012 14:54:44 +0200
parents 4bd3d8bbb60c
children 0cc2c3d89a9d
line wrap: on
line source
package de.intevation.flys.artifacts.services;

import java.util.List;
import java.util.Date;
import java.util.Calendar;
import java.util.GregorianCalendar;

import org.apache.log4j.Logger;

import org.w3c.dom.Document;
import org.w3c.dom.Element;

import de.intevation.artifacts.CallMeta;
import de.intevation.artifacts.GlobalContext;

import de.intevation.artifacts.common.ArtifactNamespaceContext;
import de.intevation.artifacts.common.utils.XMLUtils;

import de.intevation.flys.model.Gauge;
import de.intevation.flys.model.DischargeTable;
import de.intevation.flys.model.TimeInterval;

/**
 * This service provides information about discharges at a defined gauge.
 *
 * @author <a href="mailto:raimund.renkert@intevation.de">Raimund Renkert</a>
 */
public class DischargeInfoService extends FLYSService {

    /** The logger used in this service. */
    private static Logger logger = Logger.getLogger(DischargeInfoService.class);

    public static final String GAUGE_XPATH = "/art:gauge/text()";

    public DischargeInfoService() {
    }


    @Override
    public Document doProcess(
        Document      data,
        GlobalContext globalContext,
        CallMeta      callMeta
    ) {
        logger.debug("DischargeInfoService.process");

        String gaugeNumber = XMLUtils.xpathString(
            data, GAUGE_XPATH, ArtifactNamespaceContext.INSTANCE);

        if(gaugeNumber == null ||
           (gaugeNumber = gaugeNumber.trim()).length() == 0) {
            logger.warn("No gauge specified. Cannot return discharge info.");
            return XMLUtils.newDocument();
        }

        logger.debug("Getting discharge for gauge: " + gaugeNumber);

        long gn;
        try {
            gn = Long.parseLong(gaugeNumber);
        }
        catch (NumberFormatException nfe) {
            logger.warn("Invalid gauge number. Cannot return discharg info.");
            return XMLUtils.newDocument();
        }

        Gauge gauge = Gauge.getGaugeByOfficialNumber(gn);

        logger.debug("Found gauge: " + gauge.getName());

        return buildDocument(gauge);
    }


    protected Document buildDocument(Gauge gauge) {
        Document result = XMLUtils.newDocument();

        List<DischargeTable> tables =gauge.getDischargeTables();

        Element all = result.createElement("discharges");
        for (DischargeTable dt: tables) {
            if (dt.getKind() == Gauge.MASTER_DISCHARGE_TABLE) {
                continue;
            }

            Element discharge = result.createElement("discharge");
            discharge.setAttribute("description", dt.getDescription());

            // Get time interval.
            TimeInterval ti = dt.getTimeInterval();

            if (ti == null) {
                logger.warn("DischargeTable has no TimeInterval set!");
                continue;
            }

            Date startTime = ti.getStartTime();
            Date stopTime = ti.getStopTime();

            // Get the year for start end end date.
            int startYear;
            int stopYear;
            Calendar c = new GregorianCalendar();
            if (startTime != null) {
                c.setTime(startTime);
                startYear = c.get(Calendar.YEAR);
            }
            else {
                startYear = -1;
            }
            if (stopTime != null) {
                c.setTime(stopTime);
                stopYear = c.get(Calendar.YEAR);
            }
            else {
                stopYear = -1;
            }

            discharge.setAttribute("start", String.valueOf(startYear));
            discharge.setAttribute("end", String.valueOf(stopYear));

            all.appendChild(discharge);
        }
        result.appendChild(all);
        return result;
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org