comparison 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
comparison
equal deleted inserted replaced
300:9a0e1289bab6 301:1a00cb4998a8
1 package de.intevation.flys.artifacts.services;
2
3 import java.math.BigDecimal;
4 import java.util.List;
5
6 import org.apache.log4j.Logger;
7
8 import org.w3c.dom.Document;
9 import org.w3c.dom.Element;
10
11 import de.intevation.artifacts.CallMeta;
12
13 import de.intevation.artifacts.common.ArtifactNamespaceContext;
14 import de.intevation.artifacts.common.utils.XMLUtils;
15 import de.intevation.artifacts.common.utils.XMLUtils.ElementCreator;
16
17 import de.intevation.artifactdatabase.DefaultService;
18
19 import de.intevation.flys.model.Annotation;
20 import de.intevation.flys.model.Attribute;
21 import de.intevation.flys.model.Position;
22 import de.intevation.flys.model.Range;
23
24 import de.intevation.flys.artifacts.model.AnnotationsFactory;
25
26
27 /**
28 * This service provides information about distances of a specified river.
29 *
30 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
31 */
32 public class DistanceInfoService extends DefaultService {
33
34 /** The logger used in this service.*/
35 private static Logger logger = Logger.getLogger(DistanceInfoService.class);
36
37
38 /**
39 * The default constructor.
40 */
41 public DistanceInfoService() {
42 }
43
44
45 public Document process(
46 Document data,
47 Object globalContext,
48 CallMeta callMeta)
49 {
50 logger.debug("DistanceInfoService.process");
51
52 Document result = XMLUtils.newDocument();
53
54 String river = XMLUtils.xpathString(
55 data, "/art:river/text()", ArtifactNamespaceContext.INSTANCE);
56
57 if (river == null || river.trim().length() == 0) {
58 logger.warn("No river specified. Cannot return distance info!");
59 return result;
60 }
61
62 logger.debug("Search distances for river: " + river);
63
64 ElementCreator ec = new ElementCreator(
65 result,
66 ArtifactNamespaceContext.NAMESPACE_URI,
67 ArtifactNamespaceContext.NAMESPACE_PREFIX);
68
69 List<Annotation> annotations = AnnotationsFactory.getAnnotations(river);
70
71 if (annotations == null || annotations.size() == 0) {
72 logger.warn("No information found for the specified river!");
73 return result;
74 }
75
76 Element all = ec.create("distances");
77
78 for (Annotation a: annotations) {
79 Element distance = buildDistanceNode(ec, a);
80
81 if (distance != null) {
82 all.appendChild(distance);
83 }
84 }
85
86 result.appendChild(all);
87
88 return result;
89 }
90
91
92 /**
93 * This method build an Element for a distance info.
94 *
95 * @param ec The ElementCreator.
96 * @param anno The Annotation that provides information about the distance.
97 *
98 * @return an Element that contains information about a distance.
99 */
100 protected Element buildDistanceNode(ElementCreator ec, Annotation anno) {
101 Position pos = anno.getPosition();
102 Range range = anno.getRange();
103 Attribute attr = anno.getAttribute();
104
105 BigDecimal a = range.getA();
106 BigDecimal b = range.getB();
107
108 Element distance = ec.create("distance");
109 ec.addAttr(distance, "description", pos.getValue(), true);
110 ec.addAttr(distance, "from", a != null ? a.toString() : "", true);
111 ec.addAttr(distance, "to", b != null ? b.toString() : "", true);
112 ec.addAttr(distance, "riverside", attr.getValue(), true);
113
114 return distance;
115 }
116 }
117 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org