Mercurial > dive4elements > river
diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/DistanceInfoService.java @ 430:7ab81ff32111 2.3
merged flys-artifacts/2.3
author | Thomas Arendsen Hein <thomas@intevation.de> |
---|---|
date | Fri, 28 Sep 2012 12:14:10 +0200 |
parents | 4aa078e28cfd |
children | 02c0cce0e469 |
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:10 2012 +0200 @@ -0,0 +1,126 @@ +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.backend.SessionHolder; +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; + +import org.hibernate.Session; + +/** + * 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); + + Session session = SessionHolder.acquire(); + try { + 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); + } + finally { + session.close(); + SessionHolder.release(); + } + + 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 :