view flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/DischargeInfoService.java @ 5648:4feda81c38bc

SedimentLoadFacet: Minor refactor.
author Felix Wolfsteller <felix.wolfsteller@intevation.de>
date Wed, 10 Apr 2013 13:11:24 +0200
parents 5b8919ef601d
children
line wrap: on
line source
package de.intevation.flys.artifacts.services;

import java.util.Collections;
import java.util.List;
import java.util.Date;

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.artifacts.model.DischargeTables;
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");
        logger.debug(XMLUtils.toString(data));

        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();
        Collections.sort(tables);

        Element all = result.createElement("discharges");
        for (DischargeTable dt: tables) {
            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();

            if (startTime != null) {
                discharge.setAttribute("start", String.valueOf(startTime.getTime()));
            }
            else {
                continue;
            }

            if (stopTime != null && dt.getKind() != DischargeTables.MASTER) {
                discharge.setAttribute("end", String.valueOf(stopTime.getTime()));
            }
            else if (dt.getKind() == DischargeTables.MASTER) {
                long now = System.currentTimeMillis();
                discharge.setAttribute("end", String.valueOf(now));
            }
            else {
                continue;
            }

            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