changeset 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 9a0e1289bab6
children f526f02e8ce2
files flys-artifacts/ChangeLog flys-artifacts/doc/conf/conf.xml flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/AnnotationsFactory.java flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/DistanceInfoService.java
diffstat 4 files changed, 178 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/flys-artifacts/ChangeLog	Wed Apr 06 10:01:49 2011 +0000
+++ b/flys-artifacts/ChangeLog	Mon Apr 11 12:54:03 2011 +0000
@@ -1,3 +1,14 @@
+2011-04-11  Ingo Weinzierl <ingo@intevation.de>
+
+	* src/main/java/de/intevation/flys/artifacts/model/AnnotationsFactory.java:
+	  New. A factory that returns the annotations of a specific river.
+
+	* src/main/java/de/intevation/flys/artifacts/services/DistanceInfoService.java:
+	  New. This service provides a document that contains information about
+	  distances of a river.
+
+	* doc/conf/conf.xml: Registered the DistanceInfoService.
+
 2011-04-06  Ingo Weinzierl <ingo@intevation.de>
 
 	* src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java:
--- a/flys-artifacts/doc/conf/conf.xml	Wed Apr 06 10:01:49 2011 +0000
+++ b/flys-artifacts/doc/conf/conf.xml	Mon Apr 11 12:54:03 2011 +0000
@@ -24,6 +24,10 @@
                 name="rivers"
                 service="de.intevation.flys.artifacts.services.RiverService"
                 description="This service returns a list of provided rivers by the artifact server.">de.intevation.artifactdatabase.DefaultServiceFactory</service-factory>
+            <service-factory
+                name="distanceinfo"
+                service="de.intevation.flys.artifacts.services.DistanceInfoService"
+                description="Returns a list of distances supported by a specific river.">de.intevation.artifactdatabase.DefaultServiceFactory</service-factory>
         </service-factories>
 
     </factories>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/AnnotationsFactory.java	Mon Apr 11 12:54:03 2011 +0000
@@ -0,0 +1,46 @@
+package de.intevation.flys.artifacts.model;
+
+import java.util.List;
+
+import de.intevation.flys.backend.SessionFactoryProvider;
+
+import de.intevation.flys.model.Annotation;
+import de.intevation.flys.model.Range;
+import de.intevation.flys.model.River;
+
+import org.hibernate.SessionFactory;
+import org.hibernate.Session;
+import org.hibernate.Query;
+
+
+/**
+ * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
+ */
+public class AnnotationsFactory {
+
+    public static List<Annotation> getAnnotations(River river) {
+        return getAnnotations(river.getName());
+    }
+
+
+    public static List<Annotation> getAnnotations(String river) {
+        SessionFactory sf = SessionFactoryProvider.getSessionFactory();
+        Session session   = sf.openSession();
+
+        try {
+            Query rangesQuery = session.createQuery(
+                "from Range where river.name=:name");
+            rangesQuery.setParameter("name", river);
+            List<Range> ranges = rangesQuery.list();
+
+            Query query = session.createQuery(
+                "from Annotation where range in (:ranges)");
+            query.setParameterList("ranges", ranges);
+            return query.list();
+        }
+        finally {
+            session.close();
+        }
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :
--- /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