comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/FixingsOverviewService.java @ 2564:3f038d54bc87

FixingsOverviewService: Made the filter mechanisms available via the incoming XML document. flys-artifacts/trunk@4090 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 20 Feb 2012 19:13:19 +0000
parents b3f6d49cdc80
children 938e2f6c0c9a
comparison
equal deleted inserted replaced
2563:59c920e73d8a 2564:3f038d54bc87
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.FixingsOverview.Fixing.Filter;
9
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;
17 import de.intevation.flys.artifacts.model.FixingsOverview.SectorRangeFilter;
18
8 import de.intevation.flys.artifacts.model.FixingsOverview; 19 import de.intevation.flys.artifacts.model.FixingsOverview;
9 import de.intevation.flys.artifacts.model.FixingsOverviewFactory; 20 import de.intevation.flys.artifacts.model.FixingsOverviewFactory;
10 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
11 import org.apache.log4j.Logger; 29 import org.apache.log4j.Logger;
12 30
13 import org.w3c.dom.Document; 31 import org.w3c.dom.Document;
14 import org.w3c.dom.Element; 32 import org.w3c.dom.Element;
33 import org.w3c.dom.Node;
15 import org.w3c.dom.NodeList; 34 import org.w3c.dom.NodeList;
16 35
17 public class FixingsOverviewService 36 public class FixingsOverviewService
18 extends FLYSService 37 extends FLYSService
19 { 38 {
40 : ""; 59 : "";
41 60
42 FixingsOverview overview = FixingsOverviewFactory.getOverview(river); 61 FixingsOverview overview = FixingsOverviewFactory.getOverview(river);
43 62
44 if (overview != null) { 63 if (overview != null) {
45 overview.generateOverview(document); 64 Range range = getRange(data);
65 Filter filter = getFilter(data);
66 overview.generateOverview(document, range, filter);
46 } 67 }
47 else { 68 else {
48 log.warn("No overview for river '" + river + "' available."); 69 log.warn("No overview for river '" + river + "' available.");
49 } 70 }
50 71
51 return document; 72 return document;
52 } 73 }
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 }
53 } 215 }
54 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : 216 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org