# HG changeset patch # User Ingo Weinzierl # Date 1302526443 0 # Node ID 1a00cb4998a89bab011b2ddd6dfd020eb9a105f1 # Parent 9a0e1289bab6e35232f46f362aac6ebbae2eea02 Implemented a service that retrieves distance information for a specific river. flys-artifacts/trunk@1660 c6561f87-3c4e-4783-a992-168aeb5c3f6f diff -r 9a0e1289bab6 -r 1a00cb4998a8 flys-artifacts/ChangeLog --- 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 + + * 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 * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: diff -r 9a0e1289bab6 -r 1a00cb4998a8 flys-artifacts/doc/conf/conf.xml --- 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 + de.intevation.artifactdatabase.DefaultServiceFactory diff -r 9a0e1289bab6 -r 1a00cb4998a8 flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/AnnotationsFactory.java --- /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 Ingo Weinzierl + */ +public class AnnotationsFactory { + + public static List getAnnotations(River river) { + return getAnnotations(river.getName()); + } + + + public static List 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 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 : diff -r 9a0e1289bab6 -r 1a00cb4998a8 flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/DistanceInfoService.java --- /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 Ingo Weinzierl + */ +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 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 :