view flys-client/src/main/java/de/intevation/flys/client/server/DistanceInfoServiceImpl.java @ 290:a6f56ed9238b

Tagged RELEASE 2.3 of flys-client. flys-client/tags/2.3@1930 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Tue, 17 May 2011 07:51:26 +0000
parents 924da6695800
children d9fc58e30a53
line wrap: on
line source
package de.intevation.flys.client.server;

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

import javax.xml.xpath.XPathConstants;

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

import com.google.gwt.user.server.rpc.RemoteServiceServlet;

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.shared.exceptions.ServerException;
import de.intevation.flys.client.client.services.DistanceInfoService;
import de.intevation.flys.client.shared.model.DistanceInfoObject;
import de.intevation.flys.client.shared.model.DistanceInfoObjectImpl;


/**
 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
 */
public class DistanceInfoServiceImpl
extends      RemoteServiceServlet
implements   DistanceInfoService
{
    public static final String ERROR_NO_DISTANCEINFO_FOUND =
        "error_no_distanceinfo_found";

    public static final String XPATH_DISTANCES = "art:distances/art:distance";


    public DistanceInfoObject[] getDistanceInfo(
        String url,
        String locale,
        String river)
    throws ServerException
    {
        System.out.println("DistanceInfoServiceImpl.getDistanceInfo");

        Document doc = XMLUtils.newDocument();

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

        Element riverEl = ec.create("river");

        riverEl.setTextContent(river);

        doc.appendChild(riverEl);

        HttpClient client = new HttpClientImpl(url, locale);

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

            System.out.println("Extract distance info objects now.");
            DistanceInfoObject[] objects = extractDistanceInfoObjects(result);

            if (objects != null && objects.length > 0) {
                return objects;
            }
        }
        catch (ConnectionException ce) {
            System.err.println(ce.getLocalizedMessage());
        }

        throw new ServerException(ERROR_NO_DISTANCEINFO_FOUND);
    }


    /**
     * Extracts all distance info objects from <i>result</i> document.
     *
     * @param result The document retrieved by the server.
     *
     * @return a list of DistanceInfoObjects.
     */
    protected DistanceInfoObject[] extractDistanceInfoObjects(Document result)
    throws    ServerException
    {
        NodeList list = (NodeList) XMLUtils.xpath(
            result,
            XPATH_DISTANCES,
            XPathConstants.NODESET,
            ArtifactNamespaceContext.INSTANCE);

        if (list == null || list.getLength() == 0) {
            System.err.println("No distance info found.");

            throw new ServerException(ERROR_NO_DISTANCEINFO_FOUND);
        }

        int num = list.getLength();
        System.out.println("Response contains " + num + " objects.");

        List<DistanceInfoObject> objects =
            new ArrayList<DistanceInfoObject>(num);

        for (int i = 0; i < num; i++) {
            DistanceInfoObject obj = buildDistanceInfoObject(list.item(i));

            if (obj != null) {
                objects.add(obj);
            }
        }

        System.out.println("Retrieved " + objects.size() + " distances.");

        return (DistanceInfoObject[])
            objects.toArray(new DistanceInfoObject[num]);
    }


    /**
     * Extracts information for a single distance info object and intializes an
     * DistanceInfoObject with them.
     *
     * @param node The node that contains the information.
     *
     * @return a valid DistanceInfoObject.
     */
    protected DistanceInfoObject buildDistanceInfoObject(Node node) {
        String desc = XMLUtils.xpathString(
            node, "@art:description", ArtifactNamespaceContext.INSTANCE);

        String from = XMLUtils.xpathString(
            node, "@art:from", ArtifactNamespaceContext.INSTANCE);

        String to = XMLUtils.xpathString(
            node, "@art:to", ArtifactNamespaceContext.INSTANCE);

        String riverside = XMLUtils.xpathString(
            node, "@art:riverside", ArtifactNamespaceContext.INSTANCE);

        if (desc != null && from != null) {
            try {
                return new DistanceInfoObjectImpl(
                    desc,
                    new Double(from),
                    to != null && to.trim().length() > 0 ? new Double(to) : null,
                    riverside);
            }
            catch (NumberFormatException nfe) {
                System.err.println(nfe.getLocalizedMessage());
            }
        }

        System.err.println("Invalid distance info object found.");

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

http://dive4elements.wald.intevation.org