diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/DistanceInfoService.java @ 301:1a00cb4998a8

Implemented a service that retrieves distance information for a specific river. flys-artifacts/trunk@1660 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Mon, 11 Apr 2011 12:54:03 +0000
parents
children aeeb9054b7cf
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	Mon Apr 11 12:54:03 2011 +0000
@@ -0,0 +1,117 @@
+package de.intevation.flys.artifacts.services;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import de.intevation.artifacts.CallMeta;
+
+import de.intevation.artifacts.common.ArtifactNamespaceContext;
+import de.intevation.artifacts.common.utils.XMLUtils;
+import de.intevation.artifacts.common.utils.XMLUtils.ElementCreator;
+
+import de.intevation.artifactdatabase.DefaultService;
+
+import de.intevation.flys.model.Annotation;
+import de.intevation.flys.model.Attribute;
+import de.intevation.flys.model.Position;
+import de.intevation.flys.model.Range;
+
+import de.intevation.flys.artifacts.model.AnnotationsFactory;
+
+
+/**
+ * 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 DefaultService {
+
+    /** The logger used in this service.*/
+    private static Logger logger = Logger.getLogger(DistanceInfoService.class);
+
+
+    /**
+     * The default constructor.
+     */
+    public DistanceInfoService() {
+    }
+
+
+    public Document process(
+        Document data,
+        Object   globalContext,
+        CallMeta callMeta)
+    {
+        logger.debug("DistanceInfoService.process");
+
+        Document result = XMLUtils.newDocument();
+
+        String river = XMLUtils.xpathString(
+            data, "/art:river/text()", ArtifactNamespaceContext.INSTANCE);
+
+        if (river == null || river.trim().length() == 0) {
+            logger.warn("No river specified. Cannot return distance info!");
+            return result;
+        }
+
+        logger.debug("Search distances for river: " + river);
+
+        ElementCreator ec = new ElementCreator(
+            result,
+            ArtifactNamespaceContext.NAMESPACE_URI,
+            ArtifactNamespaceContext.NAMESPACE_PREFIX);
+
+        List<Annotation> annotations = AnnotationsFactory.getAnnotations(river);
+
+        if (annotations == null || annotations.size() == 0) {
+            logger.warn("No information found for the specified river!");
+            return result;
+        }
+
+        Element all = ec.create("distances");
+
+        for (Annotation a: annotations) {
+            Element distance = buildDistanceNode(ec, a);
+
+            if (distance != null) {
+                all.appendChild(distance);
+            }
+        }
+
+        result.appendChild(all);
+
+        return result;
+    }
+
+
+    /**
+     * This method build an Element for a distance info.
+     *
+     * @param ec The ElementCreator.
+     * @param anno The Annotation that provides information about the distance.
+     *
+     * @return an Element that contains information about a distance.
+     */
+    protected Element buildDistanceNode(ElementCreator ec, Annotation anno) {
+        Position  pos   = anno.getPosition();
+        Range     range = anno.getRange();
+        Attribute attr  = anno.getAttribute();
+
+        BigDecimal a = range.getA();
+        BigDecimal b = range.getB();
+
+        Element distance = ec.create("distance");
+        ec.addAttr(distance, "description", pos.getValue(), true);
+        ec.addAttr(distance, "from", a != null ? a.toString() : "", true);
+        ec.addAttr(distance, "to", b != null ? b.toString() : "", true);
+        ec.addAttr(distance, "riverside", attr.getValue(), true);
+
+        return distance;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org