comparison artifacts/src/main/java/org/dive4elements/river/artifacts/services/GaugeInfoService.java @ 5838:5aa05a7a34b7

Rename modules to more fitting names.
author Sascha L. Teichmann <teichmann@intevation.de>
date Thu, 25 Apr 2013 15:23:37 +0200
parents flys-artifacts/src/main/java/org/dive4elements/river/artifacts/services/GaugeInfoService.java@bd047b71ab37
children 4897a58c8746
comparison
equal deleted inserted replaced
5837:d9901a08d0a6 5838:5aa05a7a34b7
1 package org.dive4elements.river.artifacts.services;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import org.w3c.dom.Document;
7 import org.w3c.dom.Element;
8
9 import org.apache.log4j.Logger;
10
11 import org.dive4elements.artifacts.common.ArtifactNamespaceContext;
12 import org.dive4elements.artifacts.common.utils.XMLUtils;
13 import org.dive4elements.artifacts.common.utils.XMLUtils.ElementCreator;
14
15 import org.dive4elements.artifacts.CallMeta;
16 import org.dive4elements.artifacts.GlobalContext;
17
18 import org.dive4elements.river.model.Gauge;
19 import org.dive4elements.river.model.Range;
20 import org.dive4elements.river.model.River;
21
22 import org.dive4elements.river.artifacts.model.RiverFactory;
23
24
25 /**
26 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
27 */
28 public class GaugeInfoService extends FLYSService {
29
30 interface Filter {
31 boolean apply(Gauge gauge);
32 }
33
34
35 private static final class ReferenceNumberFilter implements Filter {
36 private long refNr;
37
38 public ReferenceNumberFilter(long refNr) {
39 this.refNr = refNr;
40 }
41
42 @Override
43 public boolean apply(Gauge gauge) {
44 if (logger.isDebugEnabled()) {
45 logger.debug("Test gauge '" + gauge.getName() + "'");
46 }
47
48 return gauge != null && gauge.getOfficialNumber() == refNr;
49 }
50 } // end of ReferenceNumberFilter class
51
52
53 /** The logger that is used by this service.*/
54 private static Logger logger = Logger.getLogger(GaugeInfoService.class);
55
56
57 public static final String XPATH_RIVERNAME = "/art:river/@name";
58
59 public static final String XPATH_REFERENCE_NR
60 = "/art:river/art:filter/art:gauge/text()";
61
62
63 public GaugeInfoService() {
64 }
65
66
67 @Override
68 public Document doProcess(
69 Document data,
70 GlobalContext context,
71 CallMeta callMeta
72 ) {
73 logger.debug("GaugeInfoService.process");
74
75 if (logger.isDebugEnabled()) {
76 logger.debug(XMLUtils.toString(data));
77 }
78
79 River river = getRiverFromRequest(data);
80
81 List<Filter> filters = getFilters(data);
82 List<Gauge> allGauges = river.getGauges();
83 List<Gauge> filtered = new ArrayList<Gauge>();
84
85 for (Gauge g: allGauges) {
86 for (Filter f: filters) {
87 if (f.apply(g)) {
88 filtered.add(g);
89 break;
90 }
91 }
92 }
93
94 return buildInfoDocument(filtered);
95 }
96
97
98 protected River getRiverFromRequest(Document data) {
99 String rivername = XMLUtils.xpathString(
100 data,
101 XPATH_RIVERNAME,
102 ArtifactNamespaceContext.INSTANCE);
103
104 logger.debug("Return Gauge info for River '" + rivername + "'");
105
106 return rivername != null ? RiverFactory.getRiver(rivername) : null;
107 }
108
109
110 protected List<Filter> getFilters(Document data) {
111 List<Filter> filters = new ArrayList<Filter>();
112
113 String refNr = XMLUtils.xpathString(
114 data,
115 XPATH_REFERENCE_NR,
116 ArtifactNamespaceContext.INSTANCE);
117
118 if (refNr != null && refNr.length() > 0) {
119 try {
120 filters.add(
121 new ReferenceNumberFilter(Long.parseLong(refNr)));
122 }
123 catch (NumberFormatException nfe) {
124 logger.warn(nfe, nfe);
125 }
126 }
127
128 return filters;
129 }
130
131
132 protected Document buildInfoDocument(List<Gauge> gauges) {
133 Document doc = XMLUtils.newDocument();
134
135 ElementCreator cr = new ElementCreator(
136 doc,
137 ArtifactNamespaceContext.NAMESPACE_URI,
138 ArtifactNamespaceContext.NAMESPACE_PREFIX);
139
140 Element service = cr.create("service");
141
142 logger.debug("Append " + gauges.size() + " gauges to info doc.");
143
144 for (Gauge g: gauges) {
145 Range r = g.getRange();
146
147 Element el = cr.create("gauge");
148 cr.addAttr(el, "name", g.getName());
149 cr.addAttr(el, "lower", String.valueOf(r.getA().doubleValue()));
150 cr.addAttr(el, "upper", String.valueOf(r.getB().doubleValue()));
151
152 service.appendChild(el);
153 }
154
155 doc.appendChild(service);
156
157 return doc;
158 }
159 }
160 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org