diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/DistanceInfoService.java @ 3318:dbe2f85bf160

merged flys-artifacts/2.8
author Thomas Arendsen Hein <thomas@intevation.de>
date Fri, 28 Sep 2012 12:14:35 +0200
parents 9136fc8f35f0
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/DistanceInfoService.java	Fri Sep 28 12:14:35 2012 +0200
@@ -0,0 +1,141 @@
+package de.intevation.flys.artifacts.services;
+
+import java.util.Iterator;
+
+import org.apache.log4j.Logger;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import de.intevation.artifacts.CallMeta;
+import de.intevation.artifacts.GlobalContext;
+
+import de.intevation.artifacts.common.ArtifactNamespaceContext;
+import de.intevation.artifacts.common.utils.XMLUtils;
+
+import de.intevation.flys.model.FastAnnotations;
+
+import de.intevation.flys.artifacts.model.LocationProvider;
+
+
+/**
+ * This service provides information about distances of a specified river.
+ *
+ * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
+ */
+public class DistanceInfoService extends FLYSService {
+
+    /** The logger used in this service. */
+    private static Logger logger = Logger.getLogger(DistanceInfoService.class);
+
+    public static final String RIVER_XPATH = "/art:river/text()";
+
+    public static final String FILTER_XPATH = "/art:river/art:filter/text()";
+
+
+    /**
+     * The default constructor.
+     */
+    public DistanceInfoService() {
+    }
+
+
+    @Override
+    public Document doProcess(
+        Document      data,
+        GlobalContext globalContext,
+        CallMeta      callMeta
+    ) {
+        logger.debug("DistanceInfoService.process");
+
+        String river = XMLUtils.xpathString(
+            data, RIVER_XPATH, ArtifactNamespaceContext.INSTANCE);
+
+        String filterName  = XMLUtils.xpathString(
+            data, FILTER_XPATH, ArtifactNamespaceContext.INSTANCE);
+
+        if (river == null || (river = river.trim()).length() == 0) {
+            logger.warn("No river specified. Cannot return distance info!");
+            return XMLUtils.newDocument();
+        }
+
+        logger.debug("Search distances for river: " + river);
+
+        FastAnnotations fas = LocationProvider.getAnnotations(river);
+
+        FastAnnotations.Filter filter = selectFilter(filterName);
+
+        return buildDocument(fas.filter(filter));
+    }
+
+    protected Document buildDocument(
+        Iterator<FastAnnotations.Annotation> iter
+    ) {
+        Document result = XMLUtils.newDocument();
+
+        Element all = result.createElement("distances");
+
+        while (iter.hasNext()) {
+            all.appendChild(buildNode(result, iter.next()));
+        }
+
+        result.appendChild(all);
+
+        return result;
+    }
+
+    protected static FastAnnotations.Filter selectFilter(String name) {
+
+        if (name != null) {
+            if ("locations".equals(name)) return FastAnnotations.IS_POINT;
+            if ("distances".equals(name)) return FastAnnotations.IS_RANGE;
+            if ("measuringpoint".equals(name))
+                return new FastAnnotations.NameFilter("Messstelle");
+        }
+
+        return FastAnnotations.ALL;
+    }
+
+    /**
+     * Builds an Element for a distance info.
+     *
+     * @param an The Annotation that provides information about the distance.
+     *
+     * @return an Element that contains information about a distance.
+     */
+    protected static Element buildNode(
+        Document                   document,
+        FastAnnotations.Annotation an
+    ) {
+        Element distance = document.createElement("distance");
+
+        distance.setAttribute("description", an.getPosition());
+
+        String riverSide = an.getAttribute();
+
+        if (riverSide != null && riverSide.length() > 0) {
+            distance.setAttribute("riverside", riverSide);
+        }
+
+        distance.setAttribute("from", String.valueOf(an.getA()));
+
+        double b      = an.getB();
+        double bottom = an.getBottom();
+        double top    = an.getTop();
+
+        if (!Double.isNaN(b)) {
+            distance.setAttribute("to", String.valueOf(b));
+        }
+
+        if (!Double.isNaN(bottom)) {
+            distance.setAttribute("bottom", String.valueOf(bottom));
+        }
+
+        if (!Double.isNaN(top)) {
+            distance.setAttribute("top", String.valueOf(top));
+        }
+
+        return distance;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org