gernotbelger@9404: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde
gernotbelger@9404: * Software engineering by Intevation GmbH
gernotbelger@9404: *
gernotbelger@9404: * This file is Free Software under the GNU AGPL (>=v3)
gernotbelger@9404: * and comes with ABSOLUTELY NO WARRANTY! Check out the
gernotbelger@9404: * documentation coming with Dive4Elements River for details.
gernotbelger@9404: */
gernotbelger@9404:
gernotbelger@9404: package org.dive4elements.river.client.server;
gernotbelger@9404:
gernotbelger@9404: import java.util.ArrayList;
gernotbelger@9404: import java.util.Date;
gernotbelger@9404: import java.util.List;
gernotbelger@9404:
gernotbelger@9404: import org.dive4elements.artifacts.common.ArtifactNamespaceContext;
gernotbelger@9404: import org.dive4elements.artifacts.common.utils.XMLUtils;
gernotbelger@9404: import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException;
gernotbelger@9404: import org.dive4elements.artifacts.httpclient.http.HttpClient;
gernotbelger@9404: import org.dive4elements.artifacts.httpclient.http.HttpClientImpl;
gernotbelger@9404: import org.dive4elements.river.client.client.services.DynamicMainValuesTimeRangeDeterminationService;
gernotbelger@9404: import org.dive4elements.river.client.shared.exceptions.ServerException;
gernotbelger@9404: import org.dive4elements.river.client.shared.model.GaugeInfoObject;
gernotbelger@9412: import org.dive4elements.river.client.shared.model.GaugeInfoResult;
gernotbelger@9412: import org.dive4elements.river.client.shared.model.GaugeInfoResultImpl;
gernotbelger@9404: import org.w3c.dom.Document;
gernotbelger@9404: import org.w3c.dom.Element;
gernotbelger@9404: import org.w3c.dom.NamedNodeMap;
gernotbelger@9404: import org.w3c.dom.Node;
gernotbelger@9404: import org.w3c.dom.NodeList;
gernotbelger@9404:
gernotbelger@9404: /**
gernotbelger@9404: * @author Ingo Weinzierl
gernotbelger@9404: */
gernotbelger@9404: public class DynamicMainValuesTimeRangeDeterminationServiceImpl extends RemoteServiceServlet implements DynamicMainValuesTimeRangeDeterminationService {
gernotbelger@9404: private static final long serialVersionUID = 1L;
gernotbelger@9404:
gernotbelger@9404: private static final String XPATH_ROOT = "dynamic-mainvalues-input";
gernotbelger@9404: private String globalErrorMsg = null;
gernotbelger@9404:
gernotbelger@9412: private GaugeInfoResult callService(final String serviceName, final Document input, final String locale) throws ServerException {
gernotbelger@9404: final String url = getServletContext().getInitParameter("server-url");
gernotbelger@9404:
gernotbelger@9404: final HttpClient client = new HttpClientImpl(url, locale);
gernotbelger@9404:
gernotbelger@9404: try {
gernotbelger@9404: final Document result = client.callService(url, serviceName, input);
gernotbelger@9412: return extractDates(result);
gernotbelger@9404: }
gernotbelger@9404: catch (final ConnectionException ce) {
gernotbelger@9404: // log.error(ce, ce);
gernotbelger@9404: }
gernotbelger@9404:
gernotbelger@9404: throw new ServerException("error_no_wqinput_found");
gernotbelger@9404: }
gernotbelger@9404:
gernotbelger@9412: private GaugeInfoResult extractDates(final Document result) throws ServerException {
gernotbelger@9404: final List results = new ArrayList();
gernotbelger@9404: final NodeList list = result.getChildNodes();
gernotbelger@9412: final List gauges = new ArrayList();
gernotbelger@9404:
gernotbelger@9404: if (list != null && list.getLength() == 1) {
gernotbelger@9404: // log.warn("No wq info found.");
gernotbelger@9404: final Node nodes = list.item(0);
gernotbelger@9404: final NodeList childNodes = nodes.getChildNodes();
gernotbelger@9404: for (int i = 0; i < childNodes.getLength(); i++) {
gernotbelger@9404: final Node node = childNodes.item(i);
gernotbelger@9404: if (node.getLocalName().equals("global-error-msg")) {
gernotbelger@9404: this.globalErrorMsg = node.getTextContent();
gernotbelger@9404: } else { // name equals gauge
gernotbelger@9404:
gernotbelger@9404: final NamedNodeMap map = node.getAttributes();
gernotbelger@9404: final String gaugeName = getStringFromMap("name", map);
gernotbelger@9404: final String error = getStringFromMap("error-message", map);
gernotbelger@9412: final GaugeInfoObject gi = new GaugeInfoObject(gaugeName, error, getDateFromMap("date-from", map), getDateFromMap("date-to", map));
gernotbelger@9412: // results.add(gi);
gernotbelger@9412: gauges.add(gi);
gernotbelger@9404: }
gernotbelger@9404: }
gernotbelger@9404:
gernotbelger@9404: }
gernotbelger@9412:
gernotbelger@9412: return new GaugeInfoResultImpl(this.globalErrorMsg, gauges.toArray(new GaugeInfoObject[gauges.size()]));
gernotbelger@9412:
gernotbelger@9404: }
gernotbelger@9404:
gernotbelger@9404: private Date getDateFromMap(final String attrName, final NamedNodeMap map) {
gernotbelger@9404: final Node dateNode = map.getNamedItem(attrName);
gernotbelger@9404: if (dateNode != null)
gernotbelger@9404: return new Date(Long.parseLong(dateNode.getNodeValue())); // errorHandling? Dürfte eigentlich keine Parse-Probleme bekommen!
gernotbelger@9404: return null;
gernotbelger@9404: }
gernotbelger@9404:
gernotbelger@9404: private String getStringFromMap(final String attrName, final NamedNodeMap map) {
gernotbelger@9404: final Node node = map.getNamedItem(attrName);
gernotbelger@9404: if (node != null)
gernotbelger@9404: return node.getNodeValue();
gernotbelger@9404: return null;
gernotbelger@9404: }
gernotbelger@9404:
gernotbelger@9404: @Override
gernotbelger@9412: public GaugeInfoResult getGaugeInfo(final String locale, final String river, final String[] gauges, final int startYear, final int endYear)
gernotbelger@9404: throws ServerException {
gernotbelger@9404:
gernotbelger@9404: final Document input = createInput(river, gauges, startYear, endYear);
gernotbelger@9404:
gernotbelger@9404: return callService("dynamicMainvaluesTimeRangeDetermination", input, locale);
gernotbelger@9404:
gernotbelger@9404: }
gernotbelger@9404:
gernotbelger@9404: public static final Document createInput(final String river, final String[] gauges, final int startYear, final int endYear) {
gernotbelger@9404:
gernotbelger@9404: final Document input = XMLUtils.newDocument();
gernotbelger@9404:
gernotbelger@9404: final XMLUtils.ElementCreator ec = new XMLUtils.ElementCreator(input, ArtifactNamespaceContext.NAMESPACE_URI,
gernotbelger@9404: ArtifactNamespaceContext.NAMESPACE_PREFIX);
gernotbelger@9404:
gernotbelger@9404: final Element inputElement = ec.create("dynamic-mainvalues-input");
gernotbelger@9404:
gernotbelger@9404: final Element riverEl = ec.create("river");
gernotbelger@9404: riverEl.setTextContent(river);
gernotbelger@9404: inputElement.appendChild(riverEl);
gernotbelger@9404:
gernotbelger@9404: for (final String gauge : gauges) {
gernotbelger@9404: final Element gaugeEl = ec.create("gauge");
gernotbelger@9404: gaugeEl.setTextContent(gauge);
gernotbelger@9404: inputElement.appendChild(gaugeEl);
gernotbelger@9404: }
gernotbelger@9404:
gernotbelger@9404: final Element startYearElement = ec.create("startYear");
gernotbelger@9404: startYearElement.setTextContent(String.valueOf(startYear));
gernotbelger@9404: inputElement.appendChild(startYearElement);
gernotbelger@9404:
gernotbelger@9404: final Element endYearElement = ec.create("endYear");
gernotbelger@9404: endYearElement.setTextContent(String.valueOf(endYear));
gernotbelger@9404: inputElement.appendChild(endYearElement);
gernotbelger@9404:
gernotbelger@9404: input.appendChild(inputElement);
gernotbelger@9404:
gernotbelger@9404: return input;
gernotbelger@9404: }
gernotbelger@9404:
gernotbelger@9404: }