Mercurial > dive4elements > river
comparison artifacts/src/main/java/org/dive4elements/river/artifacts/model/FixingsFilterBuilder.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/model/FixingsFilterBuilder.java@bd047b71ab37 |
children | 4897a58c8746 |
comparison
equal
deleted
inserted
replaced
5837:d9901a08d0a6 | 5838:5aa05a7a34b7 |
---|---|
1 package org.dive4elements.river.artifacts.model; | |
2 | |
3 import org.dive4elements.river.artifacts.model.FixingsOverview.AndFilter; | |
4 import org.dive4elements.river.artifacts.model.FixingsOverview.DateFilter; | |
5 import org.dive4elements.river.artifacts.model.FixingsOverview.DateRangeFilter; | |
6 | |
7 import org.dive4elements.river.artifacts.model.FixingsOverview.Fixing.Filter; | |
8 | |
9 import org.dive4elements.river.artifacts.model.FixingsOverview.IdFilter; | |
10 import org.dive4elements.river.artifacts.model.FixingsOverview.IdsFilter; | |
11 import org.dive4elements.river.artifacts.model.FixingsOverview.KmFilter; | |
12 import org.dive4elements.river.artifacts.model.FixingsOverview.NotFilter; | |
13 import org.dive4elements.river.artifacts.model.FixingsOverview.OrFilter; | |
14 import org.dive4elements.river.artifacts.model.FixingsOverview.SectorFilter; | |
15 import org.dive4elements.river.artifacts.model.FixingsOverview.SectorRangeFilter; | |
16 | |
17 import java.text.ParsePosition; | |
18 import java.text.SimpleDateFormat; | |
19 | |
20 import java.util.ArrayList; | |
21 import java.util.Date; | |
22 import java.util.List; | |
23 | |
24 import org.apache.log4j.Logger; | |
25 | |
26 import org.w3c.dom.Document; | |
27 import org.w3c.dom.Element; | |
28 import org.w3c.dom.Node; | |
29 import org.w3c.dom.NodeList; | |
30 | |
31 public class FixingsFilterBuilder | |
32 { | |
33 private static Logger log = Logger.getLogger(FixingsFilterBuilder.class); | |
34 | |
35 protected Filter filter; | |
36 protected Range range; | |
37 | |
38 protected Document document; | |
39 | |
40 public FixingsFilterBuilder() { | |
41 } | |
42 | |
43 public FixingsFilterBuilder(Document document) { | |
44 this.document = document; | |
45 } | |
46 | |
47 public Filter getFilter() { | |
48 if (filter == null) { | |
49 filter = buildFilter(); | |
50 } | |
51 return filter; | |
52 } | |
53 | |
54 public Range getRange() { | |
55 if (range == null) { | |
56 range = buildRange(); | |
57 } | |
58 return range; | |
59 } | |
60 | |
61 public Document getDocument() { | |
62 return document; | |
63 } | |
64 | |
65 protected Range buildRange() { | |
66 | |
67 NodeList ranges = document.getElementsByTagName("range"); | |
68 | |
69 if (ranges.getLength() < 1) { | |
70 return FixingsOverview.FULL_EXTENT; | |
71 } | |
72 | |
73 Element range = (Element)ranges.item(0); | |
74 | |
75 String from = range.getAttribute("from").trim(); | |
76 String to = range.getAttribute("to" ).trim(); | |
77 | |
78 double start = -Double.MAX_VALUE; | |
79 double end = Double.MAX_VALUE; | |
80 | |
81 if (from.length() > 0) { | |
82 try { | |
83 start = Double.parseDouble(from); | |
84 } | |
85 catch (NumberFormatException nfe) { | |
86 log.warn("Invalid from value: " + from); | |
87 } | |
88 } | |
89 | |
90 if (to.length() > 0) { | |
91 try { | |
92 end = Double.parseDouble(to); | |
93 } | |
94 catch (NumberFormatException nfe) { | |
95 log.warn("Invalid to value: " + to); | |
96 } | |
97 } | |
98 | |
99 if (start > end) { | |
100 double t = start; | |
101 start = end; | |
102 end = t; | |
103 } | |
104 | |
105 return new Range(start, end); | |
106 } | |
107 | |
108 protected Filter buildFilter() { | |
109 NodeList filters = document.getElementsByTagName("filter"); | |
110 | |
111 return filters.getLength() < 1 | |
112 ? FixingsOverview.ACCEPT | |
113 : buildFilter((Element)filters.item(0)); | |
114 } | |
115 | |
116 protected static Filter buildFilter(Element root) { | |
117 List<Filter> filters = buildRecursiveFilter(root); | |
118 switch (filters.size()) { | |
119 case 0: return FixingsOverview.ACCEPT; | |
120 case 1: return filters.get(0); | |
121 default: return new AndFilter(filters); | |
122 } | |
123 } | |
124 | |
125 protected static final Date parseDate(String text) { | |
126 SimpleDateFormat format = | |
127 new SimpleDateFormat(FixingsOverview.DATE_FORMAT); | |
128 return format.parse(text, new ParsePosition(0)); | |
129 } | |
130 | |
131 protected static List<Filter> buildRecursiveFilter(Element root) { | |
132 List<Filter> filters = new ArrayList<Filter>(); | |
133 | |
134 NodeList children = root.getChildNodes(); | |
135 | |
136 for (int i = 0, N = children.getLength(); i < N; ++i) { | |
137 Node child = children.item(i); | |
138 if (child.getNodeType() != Node.ELEMENT_NODE) { | |
139 continue; | |
140 } | |
141 | |
142 Element element = (Element)child; | |
143 String name = element.getLocalName(); | |
144 | |
145 if ("and".equals(name)) { | |
146 filters.add(new AndFilter(buildRecursiveFilter(element))); | |
147 } | |
148 else if ("or".equals(name)) { | |
149 filters.add(new OrFilter(buildRecursiveFilter(element))); | |
150 } | |
151 else if ("not".equals(name)) { | |
152 List<Filter> childrenFilters = buildRecursiveFilter(element); | |
153 if (!childrenFilters.isEmpty()) { | |
154 filters.add(new NotFilter(childrenFilters.get(0))); | |
155 } | |
156 } | |
157 else if ("column".equals(name)) { | |
158 String cid = element.getAttribute("cid").trim(); | |
159 if (cid.length() > 0) { | |
160 try { | |
161 filters.add(new IdFilter(Integer.parseInt(cid))); | |
162 } | |
163 catch (NumberFormatException nfe) { | |
164 log.warn(nfe); | |
165 } | |
166 } | |
167 } | |
168 else if ("columns".equals(name)) { | |
169 String cidsS = element.getAttribute("cids").trim(); | |
170 String [] parts = cidsS.split("\\s+"); | |
171 List<Integer> ids = new ArrayList<Integer>(); | |
172 for (String part: parts) { | |
173 try { | |
174 ids.add(Integer.valueOf(part)); | |
175 } | |
176 catch (NumberFormatException nfe) { | |
177 log.warn(nfe); | |
178 } | |
179 } | |
180 int [] cids = new int[ids.size()]; | |
181 for (int j = 0; j < cids.length; ++j) { | |
182 cids[j] = ids.get(j); | |
183 } | |
184 filters.add(new IdsFilter(cids)); | |
185 } | |
186 else if ("date".equals(name)) { | |
187 String when = element.getAttribute("when").trim(); | |
188 if (when.length() > 0) { | |
189 Date date = parseDate(when); | |
190 if (date != null) { | |
191 filters.add(new DateFilter(date)); | |
192 } | |
193 } | |
194 } | |
195 else if ("date-range".equals(name)) { | |
196 String from = element.getAttribute("from").trim(); | |
197 String to = element.getAttribute("to" ).trim(); | |
198 if (from.length() > 0 && to.length() > 0) { | |
199 Date start = parseDate(from); | |
200 Date end = parseDate(to); | |
201 if (start != null && end != null) { | |
202 filters.add(new DateRangeFilter(start, end)); | |
203 } | |
204 } | |
205 } | |
206 else if ("sector-range".equals(name)) { | |
207 String from = element.getAttribute("from").trim(); | |
208 String to = element.getAttribute("to" ).trim(); | |
209 if (from.length() > 0 && to.length() > 0) { | |
210 try { | |
211 filters.add(new SectorRangeFilter( | |
212 Integer.parseInt(from), | |
213 Integer.parseInt(to))); | |
214 } | |
215 catch (NumberFormatException nfe) { | |
216 log.warn(nfe); | |
217 } | |
218 } | |
219 } | |
220 else if ("sector".equals(name)) { | |
221 String value = element.getAttribute("value").trim(); | |
222 if (value.length() > 0) { | |
223 try { | |
224 filters.add(new SectorFilter(Integer.parseInt(value))); | |
225 } | |
226 catch (NumberFormatException nfe) { | |
227 log.warn(nfe); | |
228 } | |
229 } | |
230 } | |
231 else if ("position".equals(name)) { | |
232 String km = element.getAttribute("km").trim(); | |
233 if (km.length() > 0) { | |
234 try { | |
235 filters.add(new KmFilter(Double.parseDouble(km))); | |
236 } | |
237 catch (NumberFormatException nfe) { | |
238 log.warn(nfe); | |
239 } | |
240 } | |
241 } | |
242 } | |
243 | |
244 return filters; | |
245 } | |
246 } | |
247 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |