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.

http://dive4elements.wald.intevation.org