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

http://dive4elements.wald.intevation.org