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

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

import java.util.ArrayList;
import java.util.List;

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

import org.apache.log4j.Logger;

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

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

import de.intevation.flys.model.Gauge;
import de.intevation.flys.model.Range;
import de.intevation.flys.model.River;

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


/**
 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
 */
public class GaugeInfoService extends FLYSService {

    interface Filter {
        boolean apply(Gauge gauge);
    }


    private static final class ReferenceNumberFilter implements Filter {
        private long refNr;

        public ReferenceNumberFilter(long refNr) {
            this.refNr = refNr;
        }

        @Override
        public boolean apply(Gauge  gauge) {
            if (logger.isDebugEnabled()) {
                logger.debug("Test gauge '" + gauge.getName() + "'");
            }

            return gauge != null && gauge.getOfficialNumber() == refNr;
        }
    } // end of ReferenceNumberFilter class


    /** The logger that is used by this service.*/
    private static Logger logger = Logger.getLogger(GaugeInfoService.class);


    public static final String XPATH_RIVERNAME = "/art:river/@name";

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


    public GaugeInfoService() {
    }


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

        if (logger.isDebugEnabled()) {
            logger.debug(XMLUtils.toString(data));
        }

        River river = getRiverFromRequest(data);

        List<Filter> filters  = getFilters(data);
        List<Gauge> allGauges = river.getGauges();
        List<Gauge> filtered  = new ArrayList<Gauge>();

        for (Gauge g: allGauges) {
            for (Filter f: filters) {
                if (f.apply(g)) {
                    filtered.add(g);
                    break;
                }
            }
        }

        return buildInfoDocument(filtered);
    }


    protected River getRiverFromRequest(Document data) {
        String rivername = XMLUtils.xpathString(
            data,
            XPATH_RIVERNAME,
            ArtifactNamespaceContext.INSTANCE);

        logger.debug("Return Gauge info for River '" + rivername + "'");

        return rivername != null ? RiverFactory.getRiver(rivername) : null;
    }


    protected List<Filter> getFilters(Document data) {
        List<Filter> filters = new ArrayList<Filter>();

        String refNr = XMLUtils.xpathString(
            data,
            XPATH_REFERENCE_NR,
            ArtifactNamespaceContext.INSTANCE);

        if (refNr != null && refNr.length() > 0) {
            try {
                filters.add(
                    new ReferenceNumberFilter(Long.parseLong(refNr)));
            }
            catch (NumberFormatException nfe) {
                logger.warn(nfe, nfe);
            }
        }

        return filters;
    }


    protected Document buildInfoDocument(List<Gauge> gauges) {
        Document doc = XMLUtils.newDocument();

        ElementCreator cr = new ElementCreator(
            doc,
            ArtifactNamespaceContext.NAMESPACE_URI,
            ArtifactNamespaceContext.NAMESPACE_PREFIX);

        Element service = cr.create("service");

        logger.debug("Append " + gauges.size() + " gauges to info doc.");

        for (Gauge g: gauges) {
            Range r = g.getRange();

            Element el = cr.create("gauge");
            cr.addAttr(el, "name", g.getName());
            cr.addAttr(el, "lower", String.valueOf(r.getA().doubleValue()));
            cr.addAttr(el, "upper", String.valueOf(r.getB().doubleValue()));

            service.appendChild(el);
        }

        doc.appendChild(service);

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

http://dive4elements.wald.intevation.org