Mercurial > dive4elements > river
comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/datacage/templating/Builder.java @ 5305:e60f65540cc2
Added filter to elements in datacage templating. (most work done by Sascha T.).
author | Raimund Renkert <rrenkert@intevation.de> |
---|---|
date | Thu, 14 Mar 2013 17:09:44 +0100 |
parents | 9c388de4b4d5 |
children | d0f5bc8064f1 |
comparison
equal
deleted
inserted
replaced
5304:ffa5eaad3a7b | 5305:e60f65540cc2 |
---|---|
234 connectionsStack.pop(); | 234 connectionsStack.pop(); |
235 } | 235 } |
236 } | 236 } |
237 } | 237 } |
238 | 238 |
239 | |
240 protected ResultData createFilteredResultData(ResultData rd, String filter) { | |
241 if (filter == null) return rd; | |
242 | |
243 List<Object []> rows = rd.getRows(); | |
244 String [] columns = rd.getColumnLabels(); | |
245 | |
246 List<Object []> filtered = new ArrayList<Object[]>(rows.size()); | |
247 | |
248 for (Object [] row: rows) { | |
249 frames.enter(); | |
250 try { | |
251 frames.put(columns, row); | |
252 boolean traverse = filter == null; | |
253 | |
254 if (!traverse) { | |
255 Boolean b = evaluateXPathToBoolean(filter); | |
256 traverse = b != null && b; | |
257 } | |
258 if (traverse) { | |
259 filtered.add(row); | |
260 } | |
261 } | |
262 finally { | |
263 frames.leave(); | |
264 } | |
265 } | |
266 return new ResultData(rd.getColumnLabels(), filtered); | |
267 } | |
268 | |
239 /** | 269 /** |
240 * Kind of foreach over results of a statement within a context. | 270 * Kind of foreach over results of a statement within a context. |
241 */ | 271 */ |
242 protected void elements(Node parent, Element current) | 272 protected void elements(Node parent, Element current) |
243 throws SQLException | 273 throws SQLException |
247 if (connectionsStack.isEmpty()) { | 277 if (connectionsStack.isEmpty()) { |
248 log.warn("dc:elements without having results"); | 278 log.warn("dc:elements without having results"); |
249 return; | 279 return; |
250 } | 280 } |
251 | 281 |
282 String filter = current.getAttribute("filter"); | |
283 | |
284 if ((filter = filter.trim()).length() == 0) { | |
285 filter = null; | |
286 } | |
287 | |
252 NodeList subs = current.getChildNodes(); | 288 NodeList subs = current.getChildNodes(); |
253 int S = subs.getLength(); | 289 int S = subs.getLength(); |
254 | 290 |
255 if (S == 0) { | 291 if (S == 0) { |
256 log.debug("dc:elements has no children"); | 292 log.debug("dc:elements has no children"); |
257 return; | 293 return; |
258 } | 294 } |
259 | 295 |
296 Pair<Builder.NamedConnection, ResultData> pair = | |
297 connectionsStack.peek(); | |
298 | |
260 ResultData rd = connectionsStack.peek().getB(); | 299 ResultData rd = connectionsStack.peek().getB(); |
261 | 300 ResultData orig = rd; |
262 String [] columns = rd.getColumnLabels(); | 301 |
263 | 302 if (filter != null) { |
264 //if (log.isDebugEnabled()) { | 303 ResultData rdCopy = createFilteredResultData(rd, filter); |
265 // log.debug("pushing vars: " | 304 pair.setB(rdCopy); |
266 // + java.util.Arrays.toString(columns)); | 305 rd = rdCopy; |
267 //} | 306 } |
268 | 307 try { |
269 for (Object [] row: rd.getRows()) { | 308 String [] columns = rd.getColumnLabels(); |
270 frames.enter(); | 309 |
271 try { | 310 //if (log.isDebugEnabled()) { |
272 frames.put(columns, row); | 311 // log.debug("pushing vars: " |
273 //if (log.isDebugEnabled()) { | 312 // + java.util.Arrays.toString(columns)); |
274 // log.debug("current vars: " + frames.dump()); | 313 //} |
275 //} | 314 |
276 for (int i = 0; i < S; ++i) { | 315 for (Object [] row: rd.getRows()) { |
277 build(parent, subs.item(i)); | 316 frames.enter(); |
278 } | 317 try { |
279 } | 318 frames.put(columns, row); |
280 finally { | 319 //if (log.isDebugEnabled()) { |
281 frames.leave(); | 320 // log.debug("current vars: " + frames.dump()); |
282 } | 321 //} |
322 for (int i = 0; i < S; ++i) { | |
323 build(parent, subs.item(i)); | |
324 } | |
325 } | |
326 finally { | |
327 frames.leave(); | |
328 } | |
329 } | |
330 } | |
331 finally { | |
332 if (filter != null) { | |
333 pair.setB(orig); | |
334 } | |
283 } | 335 } |
284 } | 336 } |
285 | 337 |
286 /** | 338 /** |
287 * Create element. | 339 * Create element. |