# HG changeset patch # User Bjoern Ricks # Date 1347628485 0 # Node ID 79ad33f419773a22210945a3fe3fdee429b84f4b # Parent 738010779c7483191f86fda06ca8246f9427f743 Implement a gauge service flys-client/trunk@5469 c6561f87-3c4e-4783-a992-168aeb5c3f6f diff -r 738010779c74 -r 79ad33f41977 flys-client/ChangeLog --- a/flys-client/ChangeLog Fri Sep 14 05:57:51 2012 +0000 +++ b/flys-client/ChangeLog Fri Sep 14 13:14:45 2012 +0000 @@ -1,3 +1,14 @@ +2012-09-14 Björn Ricks + + * src/main/java/de/intevation/flys/client/client/services/GaugeOverviewInfoService.java, + src/main/java/de/intevation/flys/client/client/services/GaugeOverviewInfoServiceAsync.java, + src/main/java/de/intevation/flys/client/shared/model/GaugeInfo.java, + src/main/java/de/intevation/flys/client/shared/model/RiverInfo.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultGaugeInfo.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultRiverInfo.java, + src/main/java/de/intevation/flys/client/server/GaugeOverviewInfoServiceImpl.java: + Implement a service to handle the gauge info + 2012-09-13 Christian Lins * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java, diff -r 738010779c74 -r 79ad33f41977 flys-client/src/main/java/de/intevation/flys/client/client/services/GaugeOverviewInfoServiceAsync.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-client/src/main/java/de/intevation/flys/client/client/services/GaugeOverviewInfoServiceAsync.java Fri Sep 14 13:14:45 2012 +0000 @@ -0,0 +1,16 @@ +package de.intevation.flys.client.client.services; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +import de.intevation.flys.client.shared.model.RiverInfo; + + +/** + * @author Björn Ricks + */ +public interface GaugeOverviewInfoServiceAsync { + + public void getRiverInfo(String river, AsyncCallback callback); +} + +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 tw=80 : diff -r 738010779c74 -r 79ad33f41977 flys-client/src/main/java/de/intevation/flys/client/server/GaugeOverviewInfoServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-client/src/main/java/de/intevation/flys/client/server/GaugeOverviewInfoServiceImpl.java Fri Sep 14 13:14:45 2012 +0000 @@ -0,0 +1,183 @@ +package de.intevation.flys.client.server; + +import java.util.ArrayList; +import javax.xml.xpath.XPathConstants; + +import org.apache.log4j.Logger; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +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.client.services.GaugeOverviewInfoService; +import de.intevation.flys.client.shared.exceptions.ServerException; +import de.intevation.flys.client.shared.model.DefaultGaugeInfo; +import de.intevation.flys.client.shared.model.DefaultRiverInfo; +import de.intevation.flys.client.shared.model.GaugeInfo; +import de.intevation.flys.client.shared.model.RiverInfo; + +/** + * @author Björn Ricks + */ +public class GaugeOverviewInfoServiceImpl +extends RemoteServiceServlet +implements GaugeOverviewInfoService +{ + private static final Logger logger = + Logger.getLogger(GaugeOverviewInfoServiceImpl.class); + + public static final String ERROR_NO_RIVERINFO_FOUND = + "error_no_gaugeoverviewinfo_found"; + + private static final String XPATH_RIVER = "/art:gauge-info/art:river"; + + private static final String XPATH_GAUGES = "/art:gauge-info/art:gauges/art:gauge"; + + public RiverInfo getRiverInfo(String river) throws ServerException { + logger.info("RiverInfoServiceImpl.getRiverInfo"); + + String url = getServletContext().getInitParameter("server-url"); + + Document doc = XMLUtils.newDocument(); + + XMLUtils.ElementCreator ec = new XMLUtils.ElementCreator( + doc, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX); + + Element riverele = ec.create("river"); + riverele.setTextContent(river); + + doc.appendChild(riverele); + + HttpClient client = new HttpClientImpl(url); + + try { + Document result = client.callService(url, "gaugeoverviewinfo", doc); + + Element riverresp = (Element) XMLUtils.xpath( + result, + XPATH_RIVER, + XPathConstants.NODE, + ArtifactNamespaceContext.INSTANCE); + + String rname = riverresp.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "name"); + String rkmup = riverresp.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "kmup"); + String rstart = riverresp.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "start"); + String rend = riverresp.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "end"); + String rwstunit = riverresp.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "wstunit"); + String rminq = riverresp.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "minq"); + String rmaxq = riverresp.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "maxq"); + + logger.debug("River is " + rname); + + boolean kmup = rkmup.equalsIgnoreCase("true"); + + NodeList gaugenodes = (NodeList) XMLUtils.xpath( + result, + XPATH_GAUGES, + XPathConstants.NODESET, + ArtifactNamespaceContext.INSTANCE); + + int num = gaugenodes == null ? 0 : gaugenodes.getLength(); + + ArrayList gauges = new ArrayList(num); + + if (num == 0) { + logger.warn("No gauge info found."); + } + else { + logger.debug("Found " + num + " gauges."); + + for (int i = 0; i < num; i++) { + Element gaugeele = (Element)gaugenodes.item(i); + + String gname = gaugeele.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "name"); + String gstart = gaugeele.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "start"); + String gend = gaugeele.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "end"); + String gdatum = gaugeele.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "datum"); + String gaeo = gaugeele.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "aeo"); + String gminq = gaugeele.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "minq"); + String gminw = gaugeele.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "minw"); + String gmaxq = gaugeele.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "maxq"); + String gmaxw = gaugeele.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "maxw"); + + logger.debug("Found gauge with name " + gname); + + GaugeInfo gaugeinfo = new DefaultGaugeInfo( + gname, + kmup, + parseDouble(gstart), + parseDouble(gend), + parseDouble(gdatum), + parseDouble(gaeo), + parseDouble(gminq), + parseDouble(gmaxq), + parseDouble(gminw), + parseDouble(gmaxw) + ); + + gauges.add(gaugeinfo); + } + } + + RiverInfo riverinfo = new DefaultRiverInfo( + rname, + kmup, + parseDouble(rstart), + parseDouble(rend), + rwstunit, + parseDouble(rminq), + parseDouble(rmaxq), + gauges); + + logger.debug("Finished RiverInfoService."); + + return riverinfo; + } + catch (ConnectionException ce) { + logger.error(ce, ce); + } + + logger.warn("No gauge found"); + throw new ServerException(ERROR_NO_RIVERINFO_FOUND); + } + + /** + * Avoids NullPointerException when parsing double value + */ + private Double parseDouble(String value) { + if (value == null || value.isEmpty()) { + return null; + } + try { + return Double.valueOf(value); + } + catch(NumberFormatException e) { + logger.error(e, e); + return null; + } + } +} diff -r 738010779c74 -r 79ad33f41977 flys-client/src/main/java/de/intevation/flys/client/shared/model/DefaultGaugeInfo.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-client/src/main/java/de/intevation/flys/client/shared/model/DefaultGaugeInfo.java Fri Sep 14 13:14:45 2012 +0000 @@ -0,0 +1,112 @@ +package de.intevation.flys.client.shared.model; + +import java.io.Serializable; + +/** + * @author Björn Ricks + */ +public class DefaultGaugeInfo implements GaugeInfo { + + private String name; + private Double start; + private Double end; + private Double aeo; + private Double datum; + private Double minq; + private Double maxq; + private Double minw; + private Double maxw; + private boolean kmup; + + public DefaultGaugeInfo() { + } + + public DefaultGaugeInfo( + String name, + boolean kmup, + Double start, + Double end, + Double datum, + Double aeo, + Double minq, + Double maxq, + Double minw, + Double maxw) + { + this.name = name; + this.start = start; + this.end = end; + this.datum = datum; + this.aeo = aeo; + this.minq = minq; + this.maxq = maxq; + this.minw = minw; + this.maxw = maxw; + } + /** + * Returns the name of the gauge + */ + public String getName() { + return this.name; + } + + /** + * Returns the start KM of the gauge or null if not available + */ + public Double getKmStart() { + return this.start; + } + + /** + * Returns the end KM of the gauge or null if not available + */ + public Double getKmEnd() { + return this.end; + } + + /** + * Returns the mimimum Q value at this gauge or null if not available + */ + public Double getMinQ() { + return this.minq; + } + + /** + * Returns the maximum Q value at this gauge or null if not available + */ + public Double getMaxQ() { + return this.maxq; + } + + /** + * Returns the mimimum W value at this gauge or null if not available + */ + public Double getMinW() { + return this.minw; + } + + /** + * Returns the maximim W value at this gauge or null if not available + */ + public Double getMaxW() { + return this.maxw; + } + + /** + * Returns the datum value or null if not available + */ + public Double getDatum() { + return this.datum; + } + + /** + * Returns the aeo value or null if not available + */ + public Double getAeo() { + return this.aeo; + } + + public boolean isKmUp() { + return this.kmup; + } +} diff -r 738010779c74 -r 79ad33f41977 flys-client/src/main/java/de/intevation/flys/client/shared/model/DefaultRiverInfo.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-client/src/main/java/de/intevation/flys/client/shared/model/DefaultRiverInfo.java Fri Sep 14 13:14:45 2012 +0000 @@ -0,0 +1,98 @@ +package de.intevation.flys.client.shared.model; + +import java.io.Serializable; +import java.util.List; + +/** + * @author Björn Ricks + */ + +public class DefaultRiverInfo implements RiverInfo { + + private String name; + private boolean kmup; + private Double start; + private Double end; + private String wstunit; + private Double minq; + private Double maxq; + + private List gaugeinfo; + + public DefaultRiverInfo() { + } + + public DefaultRiverInfo( + String name, + boolean kmup, + Double start, + Double end, + String wstunit, + Double minq, + Double maxq, + List gaugeinfo) + { + this.name = name; + this.kmup = kmup; + this.start = start; + this.end = end; + this.wstunit = wstunit; + this.minq = minq; + this.maxq = maxq; + this.gaugeinfo = gaugeinfo; + } + + + public boolean isKmUp() { + return this.kmup; + } + + /** + * Start KM of the river + */ + public Double getKmStart() { + return this.start; + } + + /** + * End KM of the river + */ + public Double getKmEnd() { + return this.end; + } + + /** + * Returns the name of the river + */ + public String getName() { + return this.name; + } + + /** + * Returns the name of the WST unit + */ + public String getWstUnit() { + return this.wstunit; + } + + /** + * Return all gauge info of the river + */ + public List getGauges() { + return this.gaugeinfo; + } + + /** + * Returns the min q value of the river + */ + public Double getMinQ() { + return this.minq; + } + + /** + * Returns the max q value of the river + */ + public Double getMaxQ() { + return maxq; + } +} diff -r 738010779c74 -r 79ad33f41977 flys-client/src/main/java/de/intevation/flys/client/shared/model/GaugeInfo.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-client/src/main/java/de/intevation/flys/client/shared/model/GaugeInfo.java Fri Sep 14 13:14:45 2012 +0000 @@ -0,0 +1,56 @@ +package de.intevation.flys.client.shared.model; + +import java.io.Serializable; + +/** + * @author Björn Ricks + */ +public interface GaugeInfo extends Serializable { + + /** + * Returns the name of the gauge + */ + String getName(); + + /** + * Returns the start KM of the gauge or null if not available + */ + Double getKmStart(); + + /** + * Returns the end KM of the gauge or null if not available + */ + Double getKmEnd(); + + /** + * Returns the mimimum Q value at this gauge or null if not available + */ + Double getMinQ(); + + /** + * Returns the maximum Q value at this gauge or null if not available + */ + Double getMaxQ(); + + /** + * Returns the mimimum W value at this gauge or null if not available + */ + Double getMinW(); + + /** + * Returns the maximim W value at this gauge or null if not available + */ + Double getMaxW(); + + /** + * Returns the datum value or null if not available + */ + Double getDatum(); + + /** + * Returns the aeo value or null if not available + */ + Double getAeo(); + + boolean isKmUp(); +} diff -r 738010779c74 -r 79ad33f41977 flys-client/src/main/java/de/intevation/flys/client/shared/model/RiverInfo.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-client/src/main/java/de/intevation/flys/client/shared/model/RiverInfo.java Fri Sep 14 13:14:45 2012 +0000 @@ -0,0 +1,50 @@ +package de.intevation.flys.client.shared.model; + +import java.io.Serializable; +import java.util.List; + +/** + * @author Björn Ricks + */ + +public interface RiverInfo extends Serializable { + + boolean isKmUp(); + + /** + * Start KM of the river + */ + Double getKmStart(); + + /** + * End KM of the river + */ + Double getKmEnd(); + + /** + * Returns the name of the river + */ + String getName(); + + /** + * Returns the name of the WST unit + */ + String getWstUnit(); + + /** + * Return all gauge info of the river + */ + List getGauges(); + + /** + * Returns the min q value of the river + */ + Double getMinQ(); + + /** + * Returns the max q value of the river + */ + Double getMaxQ(); +} + +