Mercurial > dive4elements > river
changeset 1426:fc8ff0ed64ca
Added client for CrossSectionKMService.
flys-client/trunk@3369 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Felix Wolfsteller <felix.wolfsteller@intevation.de> |
---|---|
date | Thu, 08 Dec 2011 12:09:58 +0000 |
parents | bc06a671ef60 |
children | 60cd8c56ca58 |
files | flys-client/ChangeLog flys-client/src/main/java/de/intevation/flys/client/client/services/CrossSectionKMService.java flys-client/src/main/java/de/intevation/flys/client/client/services/CrossSectionKMServiceAsync.java flys-client/src/main/java/de/intevation/flys/client/server/CrossSectionKMServiceImpl.java |
diffstat | 4 files changed, 190 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/flys-client/ChangeLog Thu Dec 08 09:12:27 2011 +0000 +++ b/flys-client/ChangeLog Thu Dec 08 12:09:58 2011 +0000 @@ -1,4 +1,11 @@ -2011-11-17 Raimund Renkert <raimund.renkert@intevation.de> +2011-12-08 Felix Wolfsteller <felix.wolfsteller@intevation.de> + + * src/main/java/de/intevation/flys/client/server/CrossSectionKMServiceImpl.java, + src/main/java/de/intevation/flys/client/client/services/CrossSectionKMServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/CrossSectionKMService.java: + Added client to CrossSectionKMService. + +2011-12-08 Raimund Renkert <raimund.renkert@intevation.de> * src/main/java/de/intevation/flys/client/server/LoadArtifactServiceImpl.java, src/main/java/de/intevation/flys/client/server/CollectionItemAttributeServiceImpl.java,
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-client/src/main/java/de/intevation/flys/client/client/services/CrossSectionKMService.java Thu Dec 08 12:09:58 2011 +0000 @@ -0,0 +1,30 @@ +package de.intevation.flys.client.client.services; + +import java.util.Map; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +import de.intevation.flys.client.shared.exceptions.ServerException; + +/** + * This interface provides access to CrossSectionKMService . + */ +@RemoteServiceRelativePath("cross-section-km") +public interface CrossSectionKMService extends RemoteService { + + /** + * @param serverUrl The url of the artifact server. + * @param locale The locale used for the request. + * @param artifact The artifact. + * @param data The data that should be inserted. + * + * @return the artifact which description might have been changed. + */ + public Map<Integer,Double[]> getCrossSectionKMs( + String locale, + Map<Integer, Double> data, + int nNeightbours) + throws ServerException; +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-client/src/main/java/de/intevation/flys/client/client/services/CrossSectionKMServiceAsync.java Thu Dec 08 12:09:58 2011 +0000 @@ -0,0 +1,18 @@ +package de.intevation.flys.client.client.services; + +import java.util.Map; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +/** + * Talk-to interface for crosssectionkm service. + */ +public interface CrossSectionKMServiceAsync { + + void getCrossSectionKMs( + String locale, + Map<Integer, Double> data, + int nNeighbours, + AsyncCallback<Map<Integer, Double[]>> cb); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-client/src/main/java/de/intevation/flys/client/server/CrossSectionKMServiceImpl.java Thu Dec 08 12:09:58 2011 +0000 @@ -0,0 +1,134 @@ +package de.intevation.flys.client.server; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +import javax.xml.xpath.XPathConstants; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +import org.apache.log4j.Logger; + +import com.google.gwt.user.server.rpc.RemoteServiceServlet; + +import de.intevation.artifacts.common.ArtifactNamespaceContext; +import de.intevation.artifacts.common.utils.XMLUtils; + +import de.intevation.artifacts.httpclient.exceptions.ConnectionException; +import de.intevation.artifacts.httpclient.http.HttpClient; +import de.intevation.artifacts.httpclient.http.HttpClientImpl; + +import de.intevation.flys.client.shared.exceptions.ServerException; +import de.intevation.flys.client.client.services.CrossSectionKMService; + +/** + * Interact with not documented service. + */ +public class CrossSectionKMServiceImpl +extends RemoteServiceServlet +implements CrossSectionKMService +{ + private static final Logger logger = + Logger.getLogger(CrossSectionKMServiceImpl.class); + + /** XPath that points to the found cross section measurements. */ + public static final String XPATH_CROSS_SECTIONS + = "/cross-sections/cross-section"; + + /** The error message key that is thrown if an error occured while getting + * new data. */ + public static final String ERROR_GET_CROSS_SECTION + = "error_get_cross_section"; + + + /** + * Fetches positions (kms) at which measurements for given cross-sections + * exists. + * + * @param data Map of Integer (cross-section-id) to km. + * + */ + public Map<Integer,Double[]> getCrossSectionKMs( + String locale, + Map<Integer, Double> data, + int nNeighbours) + throws ServerException + { + logger.info("CrossSectionKMService.getCrossSectionKMs"); + + String url = getServletContext().getInitParameter("server-url"); + + Document doc = XMLUtils.newDocument(); + + XMLUtils.ElementCreator ec = new XMLUtils.ElementCreator( + doc, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX); + Element crossSection = ec.create("cross-sections"); + + doc.appendChild(crossSection); + + for(Map.Entry<Integer, Double> oneCrossSection : data.entrySet()) { + Element cs = ec.create("cross-section"); + cs.setAttribute("id", oneCrossSection.getKey().toString()); + cs.setAttribute("km", oneCrossSection.getValue().toString()); + cs.setAttribute("n", Integer.valueOf(nNeighbours).toString()); + crossSection.appendChild(cs); + } + + HttpClient client = new HttpClientImpl(url, locale); + logger.debug("Created httpclient"); + + try { + // Document should contain: + // crosse-sections: + // attribute(id), attribute(km) attribute(n) + Document response = client.callService(url, "cross-section-km", doc); + //<cross-sections><cross-section id="1"><line km="19.5" line-id="189"/>... + + NodeList nodeList = (NodeList) XMLUtils.xpath(response, + XPATH_CROSS_SECTIONS, + XPathConstants.NODESET); + + int num = nodeList.getLength(); + + Map<Integer, Double[]> result = new HashMap<Integer, Double[]>(); + + try{ + for (int i = 0; i < num; i++) { + Element csElement = (Element) nodeList.item(i); + + int idx = Integer.parseInt(csElement.getAttribute("id")); + ArrayList<Double> kms = new ArrayList<Double>(); + + NodeList lineNodes = csElement.getElementsByTagName("line"); + int numLines = lineNodes.getLength(); + for (int k = 0; k < numLines; k++) { + Element line = (Element) lineNodes.item(i); + double d = Double.parseDouble(line.getAttribute("km")); + kms.add(d); + } + + Double[] doubles = new Double[kms.size()]; + kms.toArray(doubles); + result.put(Integer.valueOf(idx), doubles); + } + } + catch(NumberFormatException nfe) { + logger.error("Response was not parsable"); + } + + return result; + } + catch (ConnectionException ce) { + logger.error("ConnectionExsp", ce); + } + + logger.warn("CrossSectionKMService.getCrossSectionKMS() - FAILED"); + throw new ServerException(ERROR_GET_CROSS_SECTION); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :