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