view flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/DistanceInfoService.java @ 4198:1cdbd8a0c994

Added two new tables ClickableQDTable and ClickableWTable and made Ws and Qs clickable in historical discharge calculation. The new tables define listener interfaces (clicked lower or upper icon) to listen to user clicks. In addition to this, there is an enum ClickMode with NONE, SINGLE and RANGE options, which allows to specifiy, which icons are displayed in the tables. NONE means no icon for user clicks, SINGLE has 1 icon, RANGE 2 icons for lower and upper.
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Mon, 22 Oct 2012 13:31:25 +0200
parents 9136fc8f35f0
children
line wrap: on
line source
package de.intevation.flys.artifacts.services;

import java.util.Iterator;

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.FastAnnotations;

import de.intevation.flys.artifacts.model.LocationProvider;


/**
 * This service provides information about distances of a specified river.
 *
 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
 */
public class DistanceInfoService extends FLYSService {

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

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

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


    /**
     * The default constructor.
     */
    public DistanceInfoService() {
    }


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

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

        String filterName  = XMLUtils.xpathString(
            data, FILTER_XPATH, ArtifactNamespaceContext.INSTANCE);

        if (river == null || (river = river.trim()).length() == 0) {
            logger.warn("No river specified. Cannot return distance info!");
            return XMLUtils.newDocument();
        }

        logger.debug("Search distances for river: " + river);

        FastAnnotations fas = LocationProvider.getAnnotations(river);

        FastAnnotations.Filter filter = selectFilter(filterName);

        return buildDocument(fas.filter(filter));
    }

    protected Document buildDocument(
        Iterator<FastAnnotations.Annotation> iter
    ) {
        Document result = XMLUtils.newDocument();

        Element all = result.createElement("distances");

        while (iter.hasNext()) {
            all.appendChild(buildNode(result, iter.next()));
        }

        result.appendChild(all);

        return result;
    }

    protected static FastAnnotations.Filter selectFilter(String name) {

        if (name != null) {
            if ("locations".equals(name)) return FastAnnotations.IS_POINT;
            if ("distances".equals(name)) return FastAnnotations.IS_RANGE;
            if ("measuringpoint".equals(name))
                return new FastAnnotations.NameFilter("Messstelle");
        }

        return FastAnnotations.ALL;
    }

    /**
     * Builds an Element for a distance info.
     *
     * @param an The Annotation that provides information about the distance.
     *
     * @return an Element that contains information about a distance.
     */
    protected static Element buildNode(
        Document                   document,
        FastAnnotations.Annotation an
    ) {
        Element distance = document.createElement("distance");

        distance.setAttribute("description", an.getPosition());

        String riverSide = an.getAttribute();

        if (riverSide != null && riverSide.length() > 0) {
            distance.setAttribute("riverside", riverSide);
        }

        distance.setAttribute("from", String.valueOf(an.getA()));

        double b      = an.getB();
        double bottom = an.getBottom();
        double top    = an.getTop();

        if (!Double.isNaN(b)) {
            distance.setAttribute("to", String.valueOf(b));
        }

        if (!Double.isNaN(bottom)) {
            distance.setAttribute("bottom", String.valueOf(bottom));
        }

        if (!Double.isNaN(top)) {
            distance.setAttribute("top", String.valueOf(top));
        }

        return distance;
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org