view gwt-client/src/main/java/org/dive4elements/river/client/server/DynamicMainValuesTimeRangeDeterminationServiceImpl.java @ 9404:bc9a45d2b1fa

common time range for gauges incl. error messages
author gernotbelger
date Wed, 15 Aug 2018 13:59:09 +0200
parents
children 0fb76f2d4e5b
line wrap: on
line source
/* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde
 * Software engineering by Intevation GmbH
 *
 * This file is Free Software under the GNU AGPL (>=v3)
 * and comes with ABSOLUTELY NO WARRANTY! Check out the
 * documentation coming with Dive4Elements River for details.
 */

package org.dive4elements.river.client.server;

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

import org.dive4elements.artifacts.common.ArtifactNamespaceContext;
import org.dive4elements.artifacts.common.utils.XMLUtils;
import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException;
import org.dive4elements.artifacts.httpclient.http.HttpClient;
import org.dive4elements.artifacts.httpclient.http.HttpClientImpl;
import org.dive4elements.river.client.client.services.DynamicMainValuesTimeRangeDeterminationService;
import org.dive4elements.river.client.shared.exceptions.ServerException;
import org.dive4elements.river.client.shared.model.GaugeInfoObject;
import org.dive4elements.river.client.shared.model.GaugeInfoObjectImpl;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
 */
public class DynamicMainValuesTimeRangeDeterminationServiceImpl extends RemoteServiceServlet implements DynamicMainValuesTimeRangeDeterminationService {
    private static final long serialVersionUID = 1L;

    private static final String XPATH_ROOT = "dynamic-mainvalues-input";
    private String globalErrorMsg = null;

    private GaugeInfoObject[] callService(final String serviceName, final Document input, final String locale) throws ServerException {
        final String url = getServletContext().getInitParameter("server-url");

        final HttpClient client = new HttpClientImpl(url, locale);

        try {
            final Document result = client.callService(url, serviceName, input);
            final GaugeInfoObject[] objects = extractDates(result);
            if (!this.globalErrorMsg.equals(""))
                throw new ServerException(this.globalErrorMsg);
            // log.debug("Extract wq info objects now.");
            return objects;

        }
        catch (final ConnectionException ce) {
            // log.error(ce, ce);
        }

        throw new ServerException("error_no_wqinput_found");
    }

    private GaugeInfoObject[] extractDates(final Document result) throws ServerException {
        final List<GaugeInfoObject> results = new ArrayList<GaugeInfoObject>();
        final NodeList list = result.getChildNodes();

        if (list != null && list.getLength() == 1) {
            // log.warn("No wq info found.");
            final Node nodes = list.item(0);
            final NodeList childNodes = nodes.getChildNodes();
            for (int i = 0; i < childNodes.getLength(); i++) {
                final Node node = childNodes.item(i);
                if (node.getLocalName().equals("global-error-msg")) {
                    this.globalErrorMsg = node.getTextContent();
                } else { // name equals gauge

                    final NamedNodeMap map = node.getAttributes();
                    final String gaugeName = getStringFromMap("name", map);
                    final String error = getStringFromMap("error-message", map);
                    final GaugeInfoObject gi = new GaugeInfoObjectImpl(gaugeName, error, getDateFromMap("date-from", map), getDateFromMap("date-to", map));
                    results.add(gi);
                }
            }

        }
        return results.toArray(new GaugeInfoObject[results.size()]);
    }

    private Date getDateFromMap(final String attrName, final NamedNodeMap map) {
        final Node dateNode = map.getNamedItem(attrName);
        if (dateNode != null)
            return new Date(Long.parseLong(dateNode.getNodeValue())); // errorHandling? Dürfte eigentlich keine Parse-Probleme bekommen!
        return null;
    }

    private String getStringFromMap(final String attrName, final NamedNodeMap map) {
        final Node node = map.getNamedItem(attrName);
        if (node != null)
            return node.getNodeValue();
        return null;
    }

    @Override
    public GaugeInfoObject[] getGaugeInfo(final String locale, final String river, final String[] gauges, final int startYear, final int endYear)
            throws ServerException {

        final Document input = createInput(river, gauges, startYear, endYear);

        return callService("dynamicMainvaluesTimeRangeDetermination", input, locale);

    }

    public static final Document createInput(final String river, final String[] gauges, final int startYear, final int endYear) {

        final Document input = XMLUtils.newDocument();

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

        final Element inputElement = ec.create("dynamic-mainvalues-input");

        final Element riverEl = ec.create("river");
        riverEl.setTextContent(river);
        inputElement.appendChild(riverEl);

        for (final String gauge : gauges) {
            final Element gaugeEl = ec.create("gauge");
            gaugeEl.setTextContent(gauge);
            inputElement.appendChild(gaugeEl);
        }

        final Element startYearElement = ec.create("startYear");
        startYearElement.setTextContent(String.valueOf(startYear));
        inputElement.appendChild(startYearElement);

        final Element endYearElement = ec.create("endYear");
        endYearElement.setTextContent(String.valueOf(endYear));
        inputElement.appendChild(endYearElement);

        input.appendChild(inputElement);

        return input;
    }

}

http://dive4elements.wald.intevation.org