ingo@2466: package de.intevation.flys.client.server;
ingo@2466: 
ingo@2466: import java.util.ArrayList;
ingo@2466: import java.util.List;
ingo@2466: 
ingo@2466: import javax.xml.xpath.XPathConstants;
ingo@2466: 
ingo@2466: import org.w3c.dom.Document;
ingo@2466: import org.w3c.dom.Element;
ingo@2466: import org.w3c.dom.NodeList;
ingo@2466: 
ingo@2466: import org.apache.log4j.Logger;
ingo@2466: 
ingo@2466: import com.google.gwt.user.server.rpc.RemoteServiceServlet;
ingo@2466: 
ingo@2466: import de.intevation.artifacts.common.ArtifactNamespaceContext;
ingo@2466: import de.intevation.artifacts.common.utils.XMLUtils;
ingo@2466: 
ingo@2466: import de.intevation.artifacts.httpclient.exceptions.ConnectionException;
ingo@2466: import de.intevation.artifacts.httpclient.http.HttpClient;
ingo@2466: import de.intevation.artifacts.httpclient.http.HttpClientImpl;
ingo@2466: 
ingo@2466: import de.intevation.flys.client.shared.exceptions.ServerException;
ingo@2466: import de.intevation.flys.client.client.services.GaugeInfoService;
ingo@2466: import de.intevation.flys.client.shared.model.Gauge;
ingo@2466: import de.intevation.flys.client.shared.model.GaugeImpl;
ingo@2466: 
ingo@2466: 
ingo@2466: /**
ingo@2466:  * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
ingo@2466:  */
ingo@2466: public class GaugeInfoServiceImpl
ingo@2466: extends      RemoteServiceServlet
ingo@2466: implements   GaugeInfoService
ingo@2466: {
ingo@2466:     private static final Logger logger =
ingo@2466:         Logger.getLogger(GaugeInfoServiceImpl.class);
ingo@2466: 
ingo@2466: 
ingo@2466:     public static final String ERROR_NO_GAUGES_FOUND =
ingo@2466:         "error_no_gaugeinfo_found";
ingo@2466: 
ingo@2466:     public static final String XPATH_GAUGES = "art:service/art:gauge";
ingo@2466: 
ingo@2466: 
ingo@2466:     public List<Gauge> getGaugeInfo(String rivername, String refnumber)
ingo@2466:     throws ServerException
ingo@2466:     {
ingo@2466:         logger.info("GaugeInfoServiceImpl.getGaugeInfo");
ingo@2466: 
ingo@2466:         String url = getServletContext().getInitParameter("server-url");
ingo@2466: 
ingo@2466:         Document doc = XMLUtils.newDocument();
ingo@2466: 
ingo@2466:         XMLUtils.ElementCreator ec = new XMLUtils.ElementCreator(
ingo@2466:             doc,
ingo@2466:             ArtifactNamespaceContext.NAMESPACE_URI,
ingo@2466:             ArtifactNamespaceContext.NAMESPACE_PREFIX);
ingo@2466: 
ingo@2466:         Element river = ec.create("river");
ingo@2466:         ec.addAttr(river, "name", rivername);
ingo@2466: 
ingo@2466:         if (refnumber != null && refnumber.length() > 0) {
ingo@2466:             Element filter = ec.create("filter");
ingo@2466:             Element gauge  = ec.create("gauge");
ingo@2466:             gauge.setTextContent(refnumber);
ingo@2466: 
ingo@2466:             filter.appendChild(gauge);
ingo@2466:             river.appendChild(filter);
ingo@2466:         }
ingo@2466: 
ingo@2466:         doc.appendChild(river);
ingo@2466: 
ingo@2466:         HttpClient client = new HttpClientImpl(url);
ingo@2466: 
ingo@2466:         try {
ingo@2466:             Document result = client.callService(url, "gaugeinfo", doc);
ingo@2466: 
ingo@2466:             logger.debug("Extract gauge info now.");
ingo@2466:             List<Gauge> gauges = extractGauges(result);
ingo@2466: 
ingo@2466:             if (gauges != null && gauges.size() > 0) {
ingo@2466:                 return gauges;
ingo@2466:             }
ingo@2466:         }
ingo@2466:         catch (ConnectionException ce) {
ingo@2466:             logger.error(ce, ce);
ingo@2466:         }
ingo@2466: 
ingo@2466:         throw new ServerException(ERROR_NO_GAUGES_FOUND);
ingo@2466:     }
ingo@2466: 
ingo@2466: 
ingo@2466:     /**
ingo@2466:      * Extracts all wq info objects from <i>result</i> document.
ingo@2466:      *
ingo@2466:      * @param result The document retrieved by the server.
ingo@2466:      *
ingo@2466:      * @return a list of WQInfoObjects.
ingo@2466:      */
ingo@2466:     protected List<Gauge> extractGauges(Document result)
ingo@2466:     throws    ServerException
ingo@2466:     {
ingo@2466:         List<Gauge> gauges = new ArrayList<Gauge>();
ingo@2466: 
ingo@2466:         NodeList list = (NodeList) XMLUtils.xpath(
ingo@2466:             result,
ingo@2466:             XPATH_GAUGES,
ingo@2466:             XPathConstants.NODESET,
ingo@2466:             ArtifactNamespaceContext.INSTANCE);
ingo@2466: 
ingo@2466:         if (list == null || list.getLength() == 0) {
ingo@2466:             logger.warn("No gauges found.");
ingo@2466: 
ingo@2466:             throw new ServerException(ERROR_NO_GAUGES_FOUND);
ingo@2466:         }
ingo@2466: 
ingo@2466:         int num = list.getLength();
ingo@2466:         logger.debug("Response contains " + num + " objects.");
ingo@2466: 
ingo@2466:         for (int i = 0; i < num; i++) {
ingo@2466:             Gauge obj = buildGauge((Element) list.item(i));
ingo@2466: 
ingo@2466:             if (obj != null) {
ingo@2466:                 gauges.add(obj);
ingo@2466:             }
ingo@2466:         }
ingo@2466: 
ingo@2466:         logger.debug("Retrieved " + gauges.size() + " gauges.");
ingo@2466: 
ingo@2466:         return gauges;
ingo@2466:     }
ingo@2466: 
ingo@2466: 
ingo@2466:     protected Gauge buildGauge(Element ele) {
ingo@2466:         String name     = ele.getAttribute("name");
ingo@2466:         String lowerStr = ele.getAttribute("lower");
ingo@2466:         String upperStr = ele.getAttribute("upper");
ingo@2466: 
ingo@2466:         if (lowerStr != null && upperStr != null) {
ingo@2466:             try {
ingo@2466:                 return new GaugeImpl(
ingo@2466:                     name,
ingo@2466:                     Double.valueOf(lowerStr),
ingo@2466:                     Double.valueOf(upperStr));
ingo@2466:             }
ingo@2466:             catch (NumberFormatException nfe) {
ingo@2466:                 logger.warn("Error while Gauge creation: " + nfe.getMessage());
ingo@2466:             }
ingo@2466:         }
ingo@2466: 
ingo@2466:         return null;
ingo@2466:     }
ingo@2466: }
ingo@2466: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :