comparison artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/FixingsFilterBuilder.java @ 9415:9744ce3c3853

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

http://dive4elements.wald.intevation.org