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

comment removed
author dnt_bjoernsen <d.tironi@bjoernsen.de>
date Wed, 27 Jan 2021 11:47:38 +0100
parents 0fb76f2d4e5b
children
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.GaugeInfoResult;
import org.dive4elements.river.client.shared.model.GaugeInfoResultImpl;
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 GaugeInfoResult 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);
            return extractDates(result);
        }
        catch (final ConnectionException ce) {
            // log.error(ce, ce);
        }

        throw new ServerException("error_no_wqinput_found");
    }

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

        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 GaugeInfoObject(gaugeName, error, getDateFromMap("date-from", map), getDateFromMap("date-to", map));
                    // results.add(gi);
                    gauges.add(gi);
                }
            }

        }

        return new GaugeInfoResultImpl(this.globalErrorMsg, gauges.toArray(new GaugeInfoObject[gauges.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 GaugeInfoResult 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