Mercurial > dive4elements > river
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 :