view flys-client/src/main/java/de/intevation/flys/client/server/GaugeOverviewInfoServiceImpl.java @ 3719:e82acd5c86f7

Merged revisions 5495-5496,5509,5514-5515,5521-5526 via svnmerge from file:///home/clients/bsh/bsh-generischer-viewer/Material/SVN/flys-client/trunk ........ r5495 | ingo | 2012-09-17 14:55:09 +0200 (Mo, 17 Sep 2012) | 1 line Added missing i18n strings for minfo state description. ........ r5496 | ingo | 2012-09-17 15:47:43 +0200 (Mo, 17 Sep 2012) | 1 line Tagged 'flys-client' as 2.9.1 ........ r5509 | teichmann | 2012-09-18 17:54:37 +0200 (Di, 18 Sep 2012) | 1 line Removed trailing whitespace. ........ r5514 | bricks | 2012-09-19 09:56:42 +0200 (Mi, 19 Sep 2012) | 2 lines Add missing Changelog entry for r5472 ........ r5515 | bricks | 2012-09-19 09:59:35 +0200 (Mi, 19 Sep 2012) | 2 lines Implement a scrolling gauge info tree ........ r5521 | bricks | 2012-09-19 14:41:48 +0200 (Mi, 19 Sep 2012) | 2 lines Add station info to the gauges ........ r5522 | bricks | 2012-09-19 14:43:43 +0200 (Mi, 19 Sep 2012) | 2 lines Improve the handling of the GaugePanel in the ParameterList ........ r5523 | bricks | 2012-09-19 14:51:02 +0200 (Mi, 19 Sep 2012) | 4 lines Improve the GaugePanel Be locale aware and only load the gauge info if the river name changes. ........ r5524 | bricks | 2012-09-19 15:14:46 +0200 (Mi, 19 Sep 2012) | 5 lines Fix a NullPointerException When iterating over a list it must be checked if the reference to the list is valid. ........ r5525 | bricks | 2012-09-19 15:16:24 +0200 (Mi, 19 Sep 2012) | 2 lines Don't display the GaugePanel if no river is selected ........ r5526 | bricks | 2012-09-19 15:18:36 +0200 (Mi, 19 Sep 2012) | 2 lines Use the wstunit from the river as unit for the Pegelnullpunkt ........ flys-client/tags/2.9.1@5528 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Wed, 19 Sep 2012 14:42:48 +0000
parents 79ad33f41977
children 22cd60315e08
line wrap: on
line source
package de.intevation.flys.client.server;

import java.util.ArrayList;
import javax.xml.xpath.XPathConstants;

import org.apache.log4j.Logger;

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

import de.intevation.artifacts.common.ArtifactNamespaceContext;
import de.intevation.artifacts.common.utils.XMLUtils;
import de.intevation.artifacts.httpclient.exceptions.ConnectionException;
import de.intevation.artifacts.httpclient.http.HttpClient;
import de.intevation.artifacts.httpclient.http.HttpClientImpl;

import de.intevation.flys.client.client.services.GaugeOverviewInfoService;
import de.intevation.flys.client.shared.exceptions.ServerException;
import de.intevation.flys.client.shared.model.DefaultGaugeInfo;
import de.intevation.flys.client.shared.model.DefaultRiverInfo;
import de.intevation.flys.client.shared.model.GaugeInfo;
import de.intevation.flys.client.shared.model.RiverInfo;

/**
 * @author <a href="mailto:bjoern.ricks@intevation.de">Björn Ricks</a>
 */
public class GaugeOverviewInfoServiceImpl
extends      RemoteServiceServlet
implements   GaugeOverviewInfoService
{
    private static final Logger logger =
        Logger.getLogger(GaugeOverviewInfoServiceImpl.class);

    public static final String ERROR_NO_RIVERINFO_FOUND =
        "error_no_gaugeoverviewinfo_found";

    private static final String XPATH_RIVER = "/art:gauge-info/art:river";

    private static final String XPATH_GAUGES = "/art:gauge-info/art:gauges/art:gauge";

    public RiverInfo getRiverInfo(String river) throws ServerException {
        logger.info("RiverInfoServiceImpl.getRiverInfo");

        String url = getServletContext().getInitParameter("server-url");

        Document doc = XMLUtils.newDocument();

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

        Element riverele = ec.create("river");
        riverele.setTextContent(river);

        doc.appendChild(riverele);

        HttpClient client = new HttpClientImpl(url);

        try {
            Document result = client.callService(url, "gaugeoverviewinfo", doc);

            Element riverresp = (Element) XMLUtils.xpath(
                    result,
                    XPATH_RIVER,
                    XPathConstants.NODE,
                    ArtifactNamespaceContext.INSTANCE);

            String rname = riverresp.getAttributeNS(
                    ArtifactNamespaceContext.NAMESPACE_URI, "name");
            String rkmup = riverresp.getAttributeNS(
                    ArtifactNamespaceContext.NAMESPACE_URI, "kmup");
            String rstart = riverresp.getAttributeNS(
                    ArtifactNamespaceContext.NAMESPACE_URI, "start");
            String rend = riverresp.getAttributeNS(
                    ArtifactNamespaceContext.NAMESPACE_URI, "end");
            String rwstunit = riverresp.getAttributeNS(
                    ArtifactNamespaceContext.NAMESPACE_URI, "wstunit");
            String rminq = riverresp.getAttributeNS(
                    ArtifactNamespaceContext.NAMESPACE_URI, "minq");
            String rmaxq = riverresp.getAttributeNS(
                    ArtifactNamespaceContext.NAMESPACE_URI, "maxq");

            logger.debug("River is " + rname);

            boolean kmup = rkmup.equalsIgnoreCase("true");

            NodeList gaugenodes = (NodeList) XMLUtils.xpath(
                result,
                XPATH_GAUGES,
                XPathConstants.NODESET,
                ArtifactNamespaceContext.INSTANCE);

            int num = gaugenodes == null ? 0 : gaugenodes.getLength();

            ArrayList<GaugeInfo> gauges = new ArrayList<GaugeInfo>(num);

            if (num == 0) {
                logger.warn("No gauge info found.");
            }
            else {
                logger.debug("Found " + num + " gauges.");

                for (int i = 0; i < num; i++) {
                    Element gaugeele = (Element)gaugenodes.item(i);

                    String gname = gaugeele.getAttributeNS(
                            ArtifactNamespaceContext.NAMESPACE_URI, "name");
                    String gstart = gaugeele.getAttributeNS(
                            ArtifactNamespaceContext.NAMESPACE_URI, "start");
                    String gend = gaugeele.getAttributeNS(
                            ArtifactNamespaceContext.NAMESPACE_URI, "end");
                    String gdatum = gaugeele.getAttributeNS(
                            ArtifactNamespaceContext.NAMESPACE_URI, "datum");
                    String gaeo = gaugeele.getAttributeNS(
                            ArtifactNamespaceContext.NAMESPACE_URI, "aeo");
                    String gminq = gaugeele.getAttributeNS(
                            ArtifactNamespaceContext.NAMESPACE_URI, "minq");
                    String gminw = gaugeele.getAttributeNS(
                            ArtifactNamespaceContext.NAMESPACE_URI, "minw");
                    String gmaxq = gaugeele.getAttributeNS(
                            ArtifactNamespaceContext.NAMESPACE_URI, "maxq");
                    String gmaxw = gaugeele.getAttributeNS(
                            ArtifactNamespaceContext.NAMESPACE_URI, "maxw");
                    String gstation = gaugeele.getAttributeNS(
                            ArtifactNamespaceContext.NAMESPACE_URI, "station");

                    logger.debug("Found gauge with name " + gname);

                    GaugeInfo gaugeinfo = new DefaultGaugeInfo(
                            gname,
                            kmup,
                            parseDouble(gstation),
                            parseDouble(gstart),
                            parseDouble(gend),
                            parseDouble(gdatum),
                            parseDouble(gaeo),
                            parseDouble(gminq),
                            parseDouble(gmaxq),
                            parseDouble(gminw),
                            parseDouble(gmaxw),
                            rwstunit
                            );

                    gauges.add(gaugeinfo);
                }
            }

            RiverInfo riverinfo = new DefaultRiverInfo(
                    rname,
                    kmup,
                    parseDouble(rstart),
                    parseDouble(rend),
                    rwstunit,
                    parseDouble(rminq),
                    parseDouble(rmaxq),
                    gauges);

            logger.debug("Finished RiverInfoService.");

            return riverinfo;
        }
        catch (ConnectionException ce) {
            logger.error(ce, ce);
        }

        logger.warn("No gauge found");
        throw new ServerException(ERROR_NO_RIVERINFO_FOUND);
    }

    /**
     * Avoids NullPointerException when parsing double value
     */
    private Double parseDouble(String value) {
        if (value == null || value.isEmpty()) {
            return null;
        }
        try {
            return Double.valueOf(value);
        }
        catch(NumberFormatException e) {
            logger.error(e, e);
            return null;
        }
    }
}

http://dive4elements.wald.intevation.org