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: }