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 :

http://dive4elements.wald.intevation.org