comparison flys-artifacts/src/main/java/org/dive4elements/river/artifacts/model/FixingsFilterBuilder.java @ 5831:bd047b71ab37

Repaired internal references
author Sascha L. Teichmann <teichmann@intevation.de>
date Thu, 25 Apr 2013 12:06:39 +0200
parents flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/FixingsFilterBuilder.java@0f7abd95c6e2
children
comparison
equal deleted inserted replaced
5830:160f53ee0870 5831:bd047b71ab37
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 :

http://dive4elements.wald.intevation.org