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