Mercurial > dive4elements > river
comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/FixingsOverviewService.java @ 2564:3f038d54bc87
FixingsOverviewService: Made the filter mechanisms available via the incoming XML document.
flys-artifacts/trunk@4090 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Mon, 20 Feb 2012 19:13:19 +0000 |
parents | b3f6d49cdc80 |
children | 938e2f6c0c9a |
comparison
equal
deleted
inserted
replaced
2563:59c920e73d8a | 2564:3f038d54bc87 |
---|---|
3 import de.intevation.artifacts.CallMeta; | 3 import de.intevation.artifacts.CallMeta; |
4 import de.intevation.artifacts.GlobalContext; | 4 import de.intevation.artifacts.GlobalContext; |
5 | 5 |
6 import de.intevation.artifacts.common.utils.XMLUtils; | 6 import de.intevation.artifacts.common.utils.XMLUtils; |
7 | 7 |
8 import de.intevation.flys.artifacts.model.FixingsOverview.Fixing.Filter; | |
9 | |
10 import de.intevation.flys.artifacts.model.FixingsOverview.AndFilter; | |
11 import de.intevation.flys.artifacts.model.FixingsOverview.DateFilter; | |
12 import de.intevation.flys.artifacts.model.FixingsOverview.DateRangeFilter; | |
13 import de.intevation.flys.artifacts.model.FixingsOverview.IdFilter; | |
14 import de.intevation.flys.artifacts.model.FixingsOverview.NotFilter; | |
15 import de.intevation.flys.artifacts.model.FixingsOverview.OrFilter; | |
16 import de.intevation.flys.artifacts.model.FixingsOverview.Range; | |
17 import de.intevation.flys.artifacts.model.FixingsOverview.SectorRangeFilter; | |
18 | |
8 import de.intevation.flys.artifacts.model.FixingsOverview; | 19 import de.intevation.flys.artifacts.model.FixingsOverview; |
9 import de.intevation.flys.artifacts.model.FixingsOverviewFactory; | 20 import de.intevation.flys.artifacts.model.FixingsOverviewFactory; |
10 | 21 |
22 import java.text.ParsePosition; | |
23 import java.text.SimpleDateFormat; | |
24 | |
25 import java.util.ArrayList; | |
26 import java.util.Date; | |
27 import java.util.List; | |
28 | |
11 import org.apache.log4j.Logger; | 29 import org.apache.log4j.Logger; |
12 | 30 |
13 import org.w3c.dom.Document; | 31 import org.w3c.dom.Document; |
14 import org.w3c.dom.Element; | 32 import org.w3c.dom.Element; |
33 import org.w3c.dom.Node; | |
15 import org.w3c.dom.NodeList; | 34 import org.w3c.dom.NodeList; |
16 | 35 |
17 public class FixingsOverviewService | 36 public class FixingsOverviewService |
18 extends FLYSService | 37 extends FLYSService |
19 { | 38 { |
40 : ""; | 59 : ""; |
41 | 60 |
42 FixingsOverview overview = FixingsOverviewFactory.getOverview(river); | 61 FixingsOverview overview = FixingsOverviewFactory.getOverview(river); |
43 | 62 |
44 if (overview != null) { | 63 if (overview != null) { |
45 overview.generateOverview(document); | 64 Range range = getRange(data); |
65 Filter filter = getFilter(data); | |
66 overview.generateOverview(document, range, filter); | |
46 } | 67 } |
47 else { | 68 else { |
48 log.warn("No overview for river '" + river + "' available."); | 69 log.warn("No overview for river '" + river + "' available."); |
49 } | 70 } |
50 | 71 |
51 return document; | 72 return document; |
52 } | 73 } |
74 | |
75 public static Range getRange(Document data) { | |
76 | |
77 NodeList ranges = data.getElementsByTagName("range"); | |
78 | |
79 if (ranges.getLength() < 1) { | |
80 return FixingsOverview.FULL_EXTENT; | |
81 } | |
82 | |
83 Element range = (Element)ranges.item(0); | |
84 | |
85 String from = range.getAttribute("from").trim(); | |
86 String to = range.getAttribute("to" ).trim(); | |
87 | |
88 double start = -Double.MAX_VALUE; | |
89 double end = Double.MAX_VALUE; | |
90 | |
91 if (from.length() > 0) { | |
92 try { | |
93 start = Double.parseDouble(from); | |
94 } | |
95 catch (NumberFormatException nfe) { | |
96 log.warn("Invalid from value: " + from); | |
97 } | |
98 } | |
99 | |
100 if (to.length() > 0) { | |
101 try { | |
102 end = Double.parseDouble(to); | |
103 } | |
104 catch (NumberFormatException nfe) { | |
105 log.warn("Invalid to value: " + to); | |
106 } | |
107 } | |
108 | |
109 if (start > end) { | |
110 double t = start; | |
111 start = end; | |
112 end = t; | |
113 } | |
114 | |
115 return new Range(start, end); | |
116 } | |
117 | |
118 public static Filter getFilter(Document data) { | |
119 | |
120 NodeList filters = data.getElementsByTagName("filter"); | |
121 | |
122 return filters.getLength() < 1 | |
123 ? FixingsOverview.ACCEPT | |
124 : buildFilter((Element)filters.item(0)); | |
125 } | |
126 | |
127 public static Filter buildFilter(Element root) { | |
128 List<Filter> filters = buildRecursiveFilter(root); | |
129 switch (filters.size()) { | |
130 case 0: return FixingsOverview.ACCEPT; | |
131 case 1: return filters.get(0); | |
132 default: return new AndFilter(filters); | |
133 } | |
134 } | |
135 | |
136 private static final Date parseDate(String text) { | |
137 SimpleDateFormat format = | |
138 new SimpleDateFormat(FixingsOverview.DATE_FORMAT); | |
139 return format.parse(text, new ParsePosition(0)); | |
140 } | |
141 | |
142 public static List<Filter> buildRecursiveFilter(Element root) { | |
143 List<Filter> filters = new ArrayList<Filter>(); | |
144 | |
145 NodeList children = root.getChildNodes(); | |
146 | |
147 for (int i = 0, N = children.getLength(); i < N; ++i) { | |
148 Node child = children.item(i); | |
149 if (child.getNodeType() != Node.ELEMENT_NODE) { | |
150 continue; | |
151 } | |
152 | |
153 Element element = (Element)child; | |
154 String name = element.getLocalName(); | |
155 | |
156 if ("and".equals(name)) { | |
157 filters.add(new AndFilter(buildRecursiveFilter(element))); | |
158 } | |
159 else if ("or".equals(name)) { | |
160 filters.add(new OrFilter(buildRecursiveFilter(element))); | |
161 } | |
162 else if ("not".equals(name)) { | |
163 List<Filter> childrenFilters = buildRecursiveFilter(element); | |
164 if (!childrenFilters.isEmpty()) { | |
165 filters.add(new NotFilter(childrenFilters.get(0))); | |
166 } | |
167 } | |
168 else if ("column".equals(name)) { | |
169 String cid = element.getAttribute("cid").trim(); | |
170 if (cid.length() > 0) { | |
171 try { | |
172 filters.add(new IdFilter(Integer.parseInt(cid))); | |
173 } | |
174 catch (NumberFormatException nfe) { | |
175 } | |
176 } | |
177 } | |
178 else if ("date".equals(name)) { | |
179 String when = element.getAttribute("when").trim(); | |
180 if (when.length() > 0) { | |
181 Date date = parseDate(when); | |
182 if (date != null) { | |
183 filters.add(new DateFilter(date)); | |
184 } | |
185 } | |
186 } | |
187 else if ("date-range".equals(name)) { | |
188 String from = element.getAttribute("from").trim(); | |
189 String to = element.getAttribute("to" ).trim(); | |
190 if (from.length() > 0 && to.length() > 0) { | |
191 Date start = parseDate(from); | |
192 Date end = parseDate(to); | |
193 if (start != null && end != null) { | |
194 filters.add(new DateRangeFilter(start, end)); | |
195 } | |
196 } | |
197 } | |
198 else if ("sector-range".equals(name)) { | |
199 String from = element.getAttribute("from").trim(); | |
200 String to = element.getAttribute("to" ).trim(); | |
201 if (from.length() > 0 && to.length() > 0) { | |
202 try { | |
203 filters.add(new SectorRangeFilter( | |
204 Integer.parseInt(from), | |
205 Integer.parseInt(to))); | |
206 } | |
207 catch (NumberFormatException nfe) { | |
208 } | |
209 } | |
210 } | |
211 } | |
212 | |
213 return filters; | |
214 } | |
53 } | 215 } |
54 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : | 216 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |