view flys-client/src/main/java/de/intevation/flys/client/server/GaugeOverviewInfoServiceImpl.java @ 4027:21cac9482958

Fix xpath for attributes The attributes are using a namespace.
author Björn Ricks <bjoern.ricks@intevation.de>
date Thu, 04 Oct 2012 14:06:36 +0200
parents 22cd60315e08
children
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");
            String rofficial = riverresp.getAttributeNS(
                    ArtifactNamespaceContext.NAMESPACE_URI, "official");

            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");
                    String gofficial = gaugeele.getAttributeNS(
                            ArtifactNamespaceContext.NAMESPACE_URI, "official");

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

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

                    gauges.add(gaugeinfo);
                }
            }

            RiverInfo riverinfo = new DefaultRiverInfo(
                    rname,
                    kmup,
                    parseDouble(rstart),
                    parseDouble(rend),
                    rwstunit,
                    parseDouble(rminq),
                    parseDouble(rmaxq),
                    parseLong(rofficial),
                    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;
        }
    }

    private Long parseLong(String value) {
        if (value == null || value.isEmpty()) {
            return null;
        }
        try {
            return Long.valueOf(value);
        }
        catch(NumberFormatException e) {
            logger.error(e, e);
            return null;
        }
    }
}

http://dive4elements.wald.intevation.org