bjoern@3713: package de.intevation.flys.client.server;
bjoern@3713:
bjoern@3713: import java.util.ArrayList;
bjoern@3713: import javax.xml.xpath.XPathConstants;
bjoern@3713:
bjoern@3713: import org.apache.log4j.Logger;
bjoern@3713:
bjoern@3713: import org.w3c.dom.Document;
bjoern@3713: import org.w3c.dom.Element;
bjoern@3713: import org.w3c.dom.NodeList;
bjoern@3713:
bjoern@3713: import de.intevation.artifacts.common.ArtifactNamespaceContext;
bjoern@3713: import de.intevation.artifacts.common.utils.XMLUtils;
bjoern@3713: import de.intevation.artifacts.httpclient.exceptions.ConnectionException;
bjoern@3713: import de.intevation.artifacts.httpclient.http.HttpClient;
bjoern@3713: import de.intevation.artifacts.httpclient.http.HttpClientImpl;
bjoern@3713:
bjoern@3713: import de.intevation.flys.client.client.services.GaugeOverviewInfoService;
bjoern@3713: import de.intevation.flys.client.shared.exceptions.ServerException;
bjoern@3713: import de.intevation.flys.client.shared.model.DefaultGaugeInfo;
bjoern@3713: import de.intevation.flys.client.shared.model.DefaultRiverInfo;
bjoern@3713: import de.intevation.flys.client.shared.model.GaugeInfo;
bjoern@3713: import de.intevation.flys.client.shared.model.RiverInfo;
bjoern@3713:
bjoern@3713: /**
bjoern@3713: * @author Björn Ricks
bjoern@3713: */
bjoern@3713: public class GaugeOverviewInfoServiceImpl
bjoern@3713: extends RemoteServiceServlet
bjoern@3713: implements GaugeOverviewInfoService
bjoern@3713: {
bjoern@3713: private static final Logger logger =
bjoern@3713: Logger.getLogger(GaugeOverviewInfoServiceImpl.class);
bjoern@3713:
bjoern@3713: public static final String ERROR_NO_RIVERINFO_FOUND =
bjoern@3713: "error_no_gaugeoverviewinfo_found";
bjoern@3713:
bjoern@3713: private static final String XPATH_RIVER = "/art:gauge-info/art:river";
bjoern@3713:
bjoern@3713: private static final String XPATH_GAUGES = "/art:gauge-info/art:gauges/art:gauge";
bjoern@3713:
bjoern@3713: public RiverInfo getRiverInfo(String river) throws ServerException {
bjoern@3713: logger.info("RiverInfoServiceImpl.getRiverInfo");
bjoern@3713:
bjoern@3713: String url = getServletContext().getInitParameter("server-url");
bjoern@3713:
bjoern@3713: Document doc = XMLUtils.newDocument();
bjoern@3713:
bjoern@3713: XMLUtils.ElementCreator ec = new XMLUtils.ElementCreator(
bjoern@3713: doc,
bjoern@3713: ArtifactNamespaceContext.NAMESPACE_URI,
bjoern@3713: ArtifactNamespaceContext.NAMESPACE_PREFIX);
bjoern@3713:
bjoern@3713: Element riverele = ec.create("river");
bjoern@3713: riverele.setTextContent(river);
bjoern@3713:
bjoern@3713: doc.appendChild(riverele);
bjoern@3713:
bjoern@3713: HttpClient client = new HttpClientImpl(url);
bjoern@3713:
bjoern@3713: try {
bjoern@3713: Document result = client.callService(url, "gaugeoverviewinfo", doc);
bjoern@3713:
bjoern@3713: Element riverresp = (Element) XMLUtils.xpath(
bjoern@3713: result,
bjoern@3713: XPATH_RIVER,
bjoern@3713: XPathConstants.NODE,
bjoern@3713: ArtifactNamespaceContext.INSTANCE);
bjoern@3713:
bjoern@3713: String rname = riverresp.getAttributeNS(
bjoern@3713: ArtifactNamespaceContext.NAMESPACE_URI, "name");
bjoern@3713: String rkmup = riverresp.getAttributeNS(
bjoern@3713: ArtifactNamespaceContext.NAMESPACE_URI, "kmup");
bjoern@3713: String rstart = riverresp.getAttributeNS(
bjoern@3713: ArtifactNamespaceContext.NAMESPACE_URI, "start");
bjoern@3713: String rend = riverresp.getAttributeNS(
bjoern@3713: ArtifactNamespaceContext.NAMESPACE_URI, "end");
bjoern@3713: String rwstunit = riverresp.getAttributeNS(
bjoern@3713: ArtifactNamespaceContext.NAMESPACE_URI, "wstunit");
bjoern@3713: String rminq = riverresp.getAttributeNS(
bjoern@3713: ArtifactNamespaceContext.NAMESPACE_URI, "minq");
bjoern@3713: String rmaxq = riverresp.getAttributeNS(
bjoern@3713: ArtifactNamespaceContext.NAMESPACE_URI, "maxq");
bjoern@3713:
bjoern@3713: logger.debug("River is " + rname);
bjoern@3713:
bjoern@3713: boolean kmup = rkmup.equalsIgnoreCase("true");
bjoern@3713:
bjoern@3713: NodeList gaugenodes = (NodeList) XMLUtils.xpath(
bjoern@3713: result,
bjoern@3713: XPATH_GAUGES,
bjoern@3713: XPathConstants.NODESET,
bjoern@3713: ArtifactNamespaceContext.INSTANCE);
bjoern@3713:
bjoern@3713: int num = gaugenodes == null ? 0 : gaugenodes.getLength();
bjoern@3713:
bjoern@3713: ArrayList gauges = new ArrayList(num);
bjoern@3713:
bjoern@3713: if (num == 0) {
bjoern@3713: logger.warn("No gauge info found.");
bjoern@3713: }
bjoern@3713: else {
bjoern@3713: logger.debug("Found " + num + " gauges.");
bjoern@3713:
bjoern@3713: for (int i = 0; i < num; i++) {
bjoern@3713: Element gaugeele = (Element)gaugenodes.item(i);
bjoern@3713:
bjoern@3713: String gname = gaugeele.getAttributeNS(
bjoern@3713: ArtifactNamespaceContext.NAMESPACE_URI, "name");
bjoern@3713: String gstart = gaugeele.getAttributeNS(
bjoern@3713: ArtifactNamespaceContext.NAMESPACE_URI, "start");
bjoern@3713: String gend = gaugeele.getAttributeNS(
bjoern@3713: ArtifactNamespaceContext.NAMESPACE_URI, "end");
bjoern@3713: String gdatum = gaugeele.getAttributeNS(
bjoern@3713: ArtifactNamespaceContext.NAMESPACE_URI, "datum");
bjoern@3713: String gaeo = gaugeele.getAttributeNS(
bjoern@3713: ArtifactNamespaceContext.NAMESPACE_URI, "aeo");
bjoern@3713: String gminq = gaugeele.getAttributeNS(
bjoern@3713: ArtifactNamespaceContext.NAMESPACE_URI, "minq");
bjoern@3713: String gminw = gaugeele.getAttributeNS(
bjoern@3713: ArtifactNamespaceContext.NAMESPACE_URI, "minw");
bjoern@3713: String gmaxq = gaugeele.getAttributeNS(
bjoern@3713: ArtifactNamespaceContext.NAMESPACE_URI, "maxq");
bjoern@3713: String gmaxw = gaugeele.getAttributeNS(
bjoern@3713: ArtifactNamespaceContext.NAMESPACE_URI, "maxw");
bjoern@3826: String gstation = gaugeele.getAttributeNS(
bjoern@3826: ArtifactNamespaceContext.NAMESPACE_URI, "station");
bjoern@3713:
bjoern@3713: logger.debug("Found gauge with name " + gname);
bjoern@3713:
bjoern@3713: GaugeInfo gaugeinfo = new DefaultGaugeInfo(
bjoern@3713: gname,
bjoern@3713: kmup,
bjoern@3826: parseDouble(gstation),
bjoern@3713: parseDouble(gstart),
bjoern@3713: parseDouble(gend),
bjoern@3713: parseDouble(gdatum),
bjoern@3713: parseDouble(gaeo),
bjoern@3713: parseDouble(gminq),
bjoern@3713: parseDouble(gmaxq),
bjoern@3713: parseDouble(gminw),
bjoern@3831: parseDouble(gmaxw),
bjoern@3831: rwstunit
bjoern@3713: );
bjoern@3713:
bjoern@3713: gauges.add(gaugeinfo);
bjoern@3713: }
bjoern@3713: }
bjoern@3713:
bjoern@3713: RiverInfo riverinfo = new DefaultRiverInfo(
bjoern@3713: rname,
bjoern@3713: kmup,
bjoern@3713: parseDouble(rstart),
bjoern@3713: parseDouble(rend),
bjoern@3713: rwstunit,
bjoern@3713: parseDouble(rminq),
bjoern@3713: parseDouble(rmaxq),
bjoern@3713: gauges);
bjoern@3713:
bjoern@3713: logger.debug("Finished RiverInfoService.");
bjoern@3713:
bjoern@3713: return riverinfo;
bjoern@3713: }
bjoern@3713: catch (ConnectionException ce) {
bjoern@3713: logger.error(ce, ce);
bjoern@3713: }
bjoern@3713:
bjoern@3713: logger.warn("No gauge found");
bjoern@3713: throw new ServerException(ERROR_NO_RIVERINFO_FOUND);
bjoern@3713: }
bjoern@3713:
bjoern@3713: /**
bjoern@3713: * Avoids NullPointerException when parsing double value
bjoern@3713: */
bjoern@3713: private Double parseDouble(String value) {
bjoern@3713: if (value == null || value.isEmpty()) {
bjoern@3713: return null;
bjoern@3713: }
bjoern@3713: try {
bjoern@3713: return Double.valueOf(value);
bjoern@3713: }
bjoern@3713: catch(NumberFormatException e) {
bjoern@3713: logger.error(e, e);
bjoern@3713: return null;
bjoern@3713: }
bjoern@3713: }
bjoern@3713: }