diff 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 diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/DynamicMainValuesTimeRangeDeterminationServiceImpl.java	Wed Aug 15 13:59:09 2018 +0200
@@ -0,0 +1,142 @@
+/* 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;
+    }
+
+}
\ No newline at end of file

http://dive4elements.wald.intevation.org