view flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/GaugeOverviewInfoService.java @ 3742:467efea19d15

Added type safety. flys-artifacts/trunk@5425 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 10 Sep 2012 14:38:58 +0000
parents 0edc05642fa4
children a33df17ac9bb
line wrap: on
line source
package de.intevation.flys.artifacts.services;

import java.math.BigDecimal;
import java.util.List;

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.RiverFactory;
import de.intevation.flys.model.Gauge;
import de.intevation.flys.model.MinMaxWQ;
import de.intevation.flys.model.Range;
import de.intevation.flys.model.River;

/**
 * @author <a href="mailto:bjoern.ricks@intevation.de">Björn Ricks</a>
 */
public class GaugeOverviewInfoService extends FLYSService {

    private static final Logger logger = Logger.getLogger(
            GaugeOverviewInfoService.class);

    public static final String RIVER_XPATH = "/art:river/text()";

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

        String riverstr = XMLUtils.xpathString(
            data, RIVER_XPATH, ArtifactNamespaceContext.INSTANCE);

        River river = RiverFactory.getRiver(riverstr);

        Document result = XMLUtils.newDocument();

        if (river == null) {
            logger.warn("No river with name " + riverstr + " found.");
            return result;
        }

        XMLUtils.ElementCreator ec = new XMLUtils.ElementCreator(
            result,
            ArtifactNamespaceContext.NAMESPACE_URI,
            ArtifactNamespaceContext.NAMESPACE_PREFIX);

        Element go = ec.create("gauge-info");

        double[] minmax = river.determineMinMaxDistance();

        Element r = ec.create("river");
        ec.addAttr(r, "name", river.getName(), true);
        ec.addAttr(r, "start", Double.toString(minmax[0]), true);
        ec.addAttr(r, "end", Double.toString(minmax[1]), true);
        ec.addAttr(r, "wstunit", river.getWstUnit().getName(), true);
        ec.addAttr(r, "kmup", Boolean.toString(river.getKmUp()), true);
        //TODO
        /* ec.addAttr(r, "qmin", , true); */
        /* ec.addAttr(r, "qmax", , true); */

        Element egs = ec.create("gauges");

        List<Gauge> gauges = river.getGauges();
        logger.debug("Loaded gauges: " + gauges);
        for (Gauge gauge: river.getGauges()) {
            Element eg = ec.create("gauge");
            String name = gauge.getName();
            if (name != null) {
                ec.addAttr(eg, "name", gauge.getName(), true);
            }

            Range range = gauge.getRange();
            if (range != null) {
                double min = range.getA().doubleValue();
                ec.addAttr(eg, "start", Double.toString(min), true);

                BigDecimal b = range.getB();
                if (b != null) {
                    double max = range.getB().doubleValue();
                    ec.addAttr(eg, "end", Double.toString(max), true);
                }
            }
            MinMaxWQ minmaxwq = gauge.fetchMaxMinWQ();
            String minw = getGaugeValue(minmaxwq.getMinW());
            String maxw = getGaugeValue(minmaxwq.getMaxW());
            String minq = getGaugeValue(minmaxwq.getMinQ());
            String maxq = getGaugeValue(minmaxwq.getMaxQ());

            if (minw != null) {
                ec.addAttr(eg, "minw", minw, true);
            }
            if (maxw != null) {
                ec.addAttr(eg, "maxw", maxw, true);
            }
            if (minq != null) {
                ec.addAttr(eg, "minq", minq, true);
            }
            if (maxq != null) {
                ec.addAttr(eg, "maxq", maxq, true);
            }

            ec.addAttr(eg, "aeo", Double.toString(gauge.getAeo().doubleValue()), true);
            ec.addAttr(eg, "datum", Double.toString(gauge.getDatum().doubleValue()), true);

            egs.appendChild(eg);
        }

        go.appendChild(r);
        go.appendChild(egs);
        result.appendChild(go);

        return result;
    }

    private String getGaugeValue(BigDecimal value) {
        if (value == null) {
            return null;
        }
        return Double.toString(value.doubleValue());
    }

}

http://dive4elements.wald.intevation.org