Mercurial > dive4elements > river
diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/DistanceInfoService.java @ 3318:dbe2f85bf160
merged flys-artifacts/2.8
author | Thomas Arendsen Hein <thomas@intevation.de> |
---|---|
date | Fri, 28 Sep 2012 12:14:35 +0200 |
parents | 9136fc8f35f0 |
children |
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:35 2012 +0200 @@ -0,0 +1,141 @@ +package de.intevation.flys.artifacts.services; + +import java.util.Iterator; + +import org.apache.log4j.Logger; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +import de.intevation.artifacts.CallMeta; +import de.intevation.artifacts.GlobalContext; + +import de.intevation.artifacts.common.ArtifactNamespaceContext; +import de.intevation.artifacts.common.utils.XMLUtils; + +import de.intevation.flys.model.FastAnnotations; + +import de.intevation.flys.artifacts.model.LocationProvider; + + +/** + * 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 FLYSService { + + /** The logger used in this service. */ + private static Logger logger = Logger.getLogger(DistanceInfoService.class); + + public static final String RIVER_XPATH = "/art:river/text()"; + + public static final String FILTER_XPATH = "/art:river/art:filter/text()"; + + + /** + * The default constructor. + */ + public DistanceInfoService() { + } + + + @Override + public Document doProcess( + Document data, + GlobalContext globalContext, + CallMeta callMeta + ) { + logger.debug("DistanceInfoService.process"); + + String river = XMLUtils.xpathString( + data, RIVER_XPATH, ArtifactNamespaceContext.INSTANCE); + + String filterName = XMLUtils.xpathString( + data, FILTER_XPATH, ArtifactNamespaceContext.INSTANCE); + + if (river == null || (river = river.trim()).length() == 0) { + logger.warn("No river specified. Cannot return distance info!"); + return XMLUtils.newDocument(); + } + + logger.debug("Search distances for river: " + river); + + FastAnnotations fas = LocationProvider.getAnnotations(river); + + FastAnnotations.Filter filter = selectFilter(filterName); + + return buildDocument(fas.filter(filter)); + } + + protected Document buildDocument( + Iterator<FastAnnotations.Annotation> iter + ) { + Document result = XMLUtils.newDocument(); + + Element all = result.createElement("distances"); + + while (iter.hasNext()) { + all.appendChild(buildNode(result, iter.next())); + } + + result.appendChild(all); + + return result; + } + + protected static FastAnnotations.Filter selectFilter(String name) { + + if (name != null) { + if ("locations".equals(name)) return FastAnnotations.IS_POINT; + if ("distances".equals(name)) return FastAnnotations.IS_RANGE; + if ("measuringpoint".equals(name)) + return new FastAnnotations.NameFilter("Messstelle"); + } + + return FastAnnotations.ALL; + } + + /** + * Builds an Element for a distance info. + * + * @param an The Annotation that provides information about the distance. + * + * @return an Element that contains information about a distance. + */ + protected static Element buildNode( + Document document, + FastAnnotations.Annotation an + ) { + Element distance = document.createElement("distance"); + + distance.setAttribute("description", an.getPosition()); + + String riverSide = an.getAttribute(); + + if (riverSide != null && riverSide.length() > 0) { + distance.setAttribute("riverside", riverSide); + } + + distance.setAttribute("from", String.valueOf(an.getA())); + + double b = an.getB(); + double bottom = an.getBottom(); + double top = an.getTop(); + + if (!Double.isNaN(b)) { + distance.setAttribute("to", String.valueOf(b)); + } + + if (!Double.isNaN(bottom)) { + distance.setAttribute("bottom", String.valueOf(bottom)); + } + + if (!Double.isNaN(top)) { + distance.setAttribute("top", String.valueOf(top)); + } + + return distance; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :