annotate artifacts/src/main/java/org/dive4elements/river/artifacts/datacage/templating/Builder.java @ 9232:5030c46d8cb4

Implemented xpath function that selectes the 'mean year' of a fixation-artifact. Needs to provide the ArtifactDatabase to the builder implementation.
author gernotbelger
date Fri, 06 Jul 2018 13:09:54 +0200
parents 175f113ed939
children
rev   line source
5863
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
1 /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
2 * Software engineering by Intevation GmbH
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
3 *
5994
af13ceeba52a Removed trailing whitespace.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5974
diff changeset
4 * This file is Free Software under the GNU AGPL (>=v3)
5863
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
5 * and comes with ABSOLUTELY NO WARRANTY! Check out the
5994
af13ceeba52a Removed trailing whitespace.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5974
diff changeset
6 * documentation coming with Dive4Elements River for details.
5863
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
7 */
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
8
5831
bd047b71ab37 Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5779
diff changeset
9 package org.dive4elements.river.artifacts.datacage.templating;
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
10
9232
5030c46d8cb4 Implemented xpath function that selectes the 'mean year' of a fixation-artifact.
gernotbelger
parents: 8959
diff changeset
11 import org.dive4elements.artifacts.CallContext;
5831
bd047b71ab37 Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5779
diff changeset
12 import org.dive4elements.artifacts.common.utils.XMLUtils;
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
13
5831
bd047b71ab37 Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5779
diff changeset
14 import org.dive4elements.river.utils.Pair;
1818
e3eb1ea885a7 Simplified code in Datacage builder by using the new pair.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1716
diff changeset
15
6399
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
16 import java.lang.reflect.InvocationTargetException;
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
17 import java.lang.reflect.Method;
4740
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
18 import java.sql.Connection;
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
19 import java.sql.SQLException;
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
20
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
21 import java.util.ArrayDeque;
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
22 import java.util.ArrayList;
5974
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
23 import java.util.Arrays;
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
24 import java.util.Collection;
5890
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
25 import java.util.Collections;
4740
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
26 import java.util.Deque;
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
27 import java.util.HashMap;
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
28 import java.util.List;
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
29 import java.util.Map;
5890
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
30 import java.util.TreeMap;
4740
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
31
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
32 import java.util.regex.Matcher;
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
33 import java.util.regex.Pattern;
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
34
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
35 import javax.xml.namespace.QName;
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
36
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
37 import javax.xml.xpath.XPath;
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
38 import javax.xml.xpath.XPathConstants;
5449
504a62887217 Datacage: Compile XPath expressions and reuse them. With the introduction of filters in dc:elements XPath expressions are evalutated very often so compiling them should reduce the overhead significantly.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5443
diff changeset
39 import javax.xml.xpath.XPathExpression;
4740
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
40 import javax.xml.xpath.XPathExpressionException;
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
41 import javax.xml.xpath.XPathFactory;
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
42
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
43 import org.apache.log4j.Logger;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
44
5485
3b5e1535a459 Datacage: Experimental support for '{XPath}' expressions in attributes similiar to XSLT. Using this feature you can shorten the written template a lot because it reduces the necessity to create dynamic attributes with <dc:attribute>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5449
diff changeset
45 import org.w3c.dom.Attr;
4740
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
46 import org.w3c.dom.Document;
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
47 import org.w3c.dom.Element;
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
48 import org.w3c.dom.Node;
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
49 import org.w3c.dom.NodeList;
5494
773899d00234 Fix new attribute evaluation
Andre Heinecke <aheinecke@intevation.de>
parents: 5485
diff changeset
50 import org.w3c.dom.NamedNodeMap;
4740
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
51
4526
1f38fa929986 Cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4353
diff changeset
52
4897
9c388de4b4d5 Builder: Doc, comments.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4896
diff changeset
53 /** Handles and evaluate meta-data template against dbs. */
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
54 public class Builder
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
55 {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
56 private static Logger log = Logger.getLogger(Builder.class);
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
57
7960
fbab10c21e0b Datacage: Make it possible to group a value tuple into more than one group.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7677
diff changeset
58 public static final Pattern MAGIC_EXPR_SEPARATOR =
fbab10c21e0b Datacage: Make it possible to group a value tuple into more than one group.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7677
diff changeset
59 Pattern.compile("#!#");
fbab10c21e0b Datacage: Make it possible to group a value tuple into more than one group.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7677
diff changeset
60
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
61 public static final Pattern STRIP_LINE_INDENT =
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
62 Pattern.compile("\\s*\\r?\\n\\s*");
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
63
5485
3b5e1535a459 Datacage: Experimental support for '{XPath}' expressions in attributes similiar to XSLT. Using this feature you can shorten the written template a lot because it reduces the necessity to create dynamic attributes with <dc:attribute>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5449
diff changeset
64 public static final Pattern BRACKET_XPATH =
3b5e1535a459 Datacage: Experimental support for '{XPath}' expressions in attributes similiar to XSLT. Using this feature you can shorten the written template a lot because it reduces the necessity to create dynamic attributes with <dc:attribute>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5449
diff changeset
65 Pattern.compile("\\{([^}]+)\\}");
3b5e1535a459 Datacage: Experimental support for '{XPath}' expressions in attributes similiar to XSLT. Using this feature you can shorten the written template a lot because it reduces the necessity to create dynamic attributes with <dc:attribute>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5449
diff changeset
66
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
67 public static final String DC_NAMESPACE_URI =
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
68 "http://www.intevation.org/2011/Datacage";
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
69
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
70 private static final Document EVAL_DOCUMENT =
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
71 XMLUtils.newDocument();
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
72
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
73 private static final XPathFactory XPATH_FACTORY =
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
74 XPathFactory.newInstance();
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
75
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
76 protected Document template;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
77
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
78 protected Map<String, CompiledStatement> compiledStatements;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
79
5443
3d7e552cc396 Datacage: Index macros with a map. Reduces excessive linear scanning for macros when calling them.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5442
diff changeset
80 protected Map<String, Element> macros;
3d7e552cc396 Datacage: Index macros with a map. Reduces excessive linear scanning for macros when calling them.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5442
diff changeset
81
7669
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
82 private static final class KV implements Comparable<KV> {
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
83
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
84 private Comparable<Object> key;
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
85 private Object [] data;
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
86
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
87 public KV(Comparable<Object> key, Object [] data) {
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
88 this.key = key;
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
89 this.data = data;
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
90 }
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
91
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
92 @Override
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
93 public int compareTo(KV other) {
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
94 return key.compareTo(other.key);
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
95 }
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
96
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
97 public Object [] getData() {
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
98 return data;
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
99 }
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
100 }
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
101
4526
1f38fa929986 Cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4353
diff changeset
102 /** Connection to either of the databases. */
1011
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
103 public static class NamedConnection {
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
104
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
105 protected String name;
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
106 protected Connection connection;
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
107 protected boolean cached;
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
108
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
109 public NamedConnection() {
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
110 }
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
111
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
112 public NamedConnection(
3076
5642a83420f2 FLYS artifacts: Removed trailing whitespace.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1890
diff changeset
113 String name,
1011
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
114 Connection connection
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
115 ) {
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
116 this(name, connection, true);
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
117 }
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
118
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
119 public NamedConnection(
3076
5642a83420f2 FLYS artifacts: Removed trailing whitespace.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1890
diff changeset
120 String name,
1011
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
121 Connection connection,
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
122 boolean cached
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
123 ) {
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
124 this.name = name;
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
125 this.connection = connection;
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
126 this.cached = cached;
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
127 }
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
128 } // class NamedConnection
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
129
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
130 public class BuildHelper
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
131 {
1818
e3eb1ea885a7 Simplified code in Datacage builder by using the new pair.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1716
diff changeset
132 protected Node output;
e3eb1ea885a7 Simplified code in Datacage builder by using the new pair.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1716
diff changeset
133 protected Document owner;
e3eb1ea885a7 Simplified code in Datacage builder by using the new pair.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1716
diff changeset
134 protected StackFrames frames;
e3eb1ea885a7 Simplified code in Datacage builder by using the new pair.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1716
diff changeset
135 protected List<NamedConnection> connections;
e3eb1ea885a7 Simplified code in Datacage builder by using the new pair.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1716
diff changeset
136 protected Map<String, CompiledStatement.Instance> statements;
e3eb1ea885a7 Simplified code in Datacage builder by using the new pair.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1716
diff changeset
137 protected Deque<Pair<NamedConnection, ResultData>> connectionsStack;
4890
bf38ea4cb0f7 Added bodies to macros. Use the bodies of <dc:call-macro><body></dc:call-macro> as <dc:macro-body/> in tthe macro. Example:
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4740
diff changeset
138 protected Deque<NodeList> macroBodies;
5890
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
139 protected Deque<Object> groupExprStack;
5442
9575264f801d Only create one FunctionResolver per BuildHelper. Creatin new ones over and over again is excessive.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5433
diff changeset
140 protected FunctionResolver functionResolver;
5449
504a62887217 Datacage: Compile XPath expressions and reuse them. With the introduction of filters in dc:elements XPath expressions are evalutated very often so compiling them should reduce the overhead significantly.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5443
diff changeset
141 protected Map<String, XPathExpression> expressions;
9232
5030c46d8cb4 Implemented xpath function that selectes the 'mean year' of a fixation-artifact.
gernotbelger
parents: 8959
diff changeset
142 private final CallContext context;
5449
504a62887217 Datacage: Compile XPath expressions and reuse them. With the introduction of filters in dc:elements XPath expressions are evalutated very often so compiling them should reduce the overhead significantly.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5443
diff changeset
143
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
144
9232
5030c46d8cb4 Implemented xpath function that selectes the 'mean year' of a fixation-artifact.
gernotbelger
parents: 8959
diff changeset
145 public BuildHelper( final Node output, final List<NamedConnection> connections, final Map<String, Object> parameters, CallContext context ) {
1011
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
146 if (connections.isEmpty()) {
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
147 throw new IllegalArgumentException("no connections given.");
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
148 }
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
149
9232
5030c46d8cb4 Implemented xpath function that selectes the 'mean year' of a fixation-artifact.
gernotbelger
parents: 8959
diff changeset
150 connectionsStack = new ArrayDeque<Pair<NamedConnection, ResultData>>();
1011
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
151 frames = new StackFrames(parameters);
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
152 owner = getOwnerDocument(output);
5443
3d7e552cc396 Datacage: Index macros with a map. Reduces excessive linear scanning for macros when calling them.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5442
diff changeset
153 macroBodies = new ArrayDeque<NodeList>();
5890
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
154 groupExprStack = new ArrayDeque<Object>();
5449
504a62887217 Datacage: Compile XPath expressions and reuse them. With the introduction of filters in dc:elements XPath expressions are evalutated very often so compiling them should reduce the overhead significantly.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5443
diff changeset
155 expressions = new HashMap<String, XPathExpression>();
9232
5030c46d8cb4 Implemented xpath function that selectes the 'mean year' of a fixation-artifact.
gernotbelger
parents: 8959
diff changeset
156 statements = new HashMap<String, CompiledStatement.Instance>();
5030c46d8cb4 Implemented xpath function that selectes the 'mean year' of a fixation-artifact.
gernotbelger
parents: 8959
diff changeset
157
5030c46d8cb4 Implemented xpath function that selectes the 'mean year' of a fixation-artifact.
gernotbelger
parents: 8959
diff changeset
158 this.connections = connections;
5030c46d8cb4 Implemented xpath function that selectes the 'mean year' of a fixation-artifact.
gernotbelger
parents: 8959
diff changeset
159 this.output = output;
5030c46d8cb4 Implemented xpath function that selectes the 'mean year' of a fixation-artifact.
gernotbelger
parents: 8959
diff changeset
160 this.context = context;
5030c46d8cb4 Implemented xpath function that selectes the 'mean year' of a fixation-artifact.
gernotbelger
parents: 8959
diff changeset
161
5030c46d8cb4 Implemented xpath function that selectes the 'mean year' of a fixation-artifact.
gernotbelger
parents: 8959
diff changeset
162 // Important call this at the end of constructor, it might call back
5030c46d8cb4 Implemented xpath function that selectes the 'mean year' of a fixation-artifact.
gernotbelger
parents: 8959
diff changeset
163 functionResolver = new FunctionResolver(this);
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
164 }
9232
5030c46d8cb4 Implemented xpath function that selectes the 'mean year' of a fixation-artifact.
gernotbelger
parents: 8959
diff changeset
165
5030c46d8cb4 Implemented xpath function that selectes the 'mean year' of a fixation-artifact.
gernotbelger
parents: 8959
diff changeset
166 public final CallContext getContext() {
5030c46d8cb4 Implemented xpath function that selectes the 'mean year' of a fixation-artifact.
gernotbelger
parents: 8959
diff changeset
167 return this.context;
5030c46d8cb4 Implemented xpath function that selectes the 'mean year' of a fixation-artifact.
gernotbelger
parents: 8959
diff changeset
168 }
5030c46d8cb4 Implemented xpath function that selectes the 'mean year' of a fixation-artifact.
gernotbelger
parents: 8959
diff changeset
169
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
170 public void build() throws SQLException {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
171 try {
5779
ebec12def170 Datacage: Add a pool of builders to make it multi threadable.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5532
diff changeset
172 // XXX: Thread safety is now established by the builder pool.
ebec12def170 Datacage: Add a pool of builders to make it multi threadable.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5532
diff changeset
173 //synchronized (template) {
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
174 for (Node current: rootsToList()) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
175 build(output, current);
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
176 }
5779
ebec12def170 Datacage: Add a pool of builders to make it multi threadable.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5532
diff changeset
177 //}
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
178 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
179 finally {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
180 closeStatements();
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
181 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
182 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
183
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
184 protected void closeStatements() {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
185 for (CompiledStatement.Instance csi: statements.values()) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
186 csi.close();
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
187 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
188 statements.clear();
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
189 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
190
1890
9144e5a5027b (Picky) cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1859
diff changeset
191 /**
4896
27d58b7b5edd Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4893
diff changeset
192 * Return first statement node in NodeList, respecting
4897
9c388de4b4d5 Builder: Doc, comments.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4896
diff changeset
193 * macros but not doing evaluation (e.g. of <dc:if>s).
4896
27d58b7b5edd Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4893
diff changeset
194 */
27d58b7b5edd Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4893
diff changeset
195 private Node findStatementNode(NodeList nodes) {
6399
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
196 return findSelectNode(nodes, "statement");
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
197 }
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
198
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
199 private Node findPropertiesNode(NodeList nodes) {
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
200 return findSelectNode(nodes, "properties");
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
201 }
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
202
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
203 private Node findSelectNode(NodeList nodes, String selectName) {
4896
27d58b7b5edd Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4893
diff changeset
204 int S = nodes.getLength();
27d58b7b5edd Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4893
diff changeset
205
27d58b7b5edd Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4893
diff changeset
206 // Check direct children and take special care of macros.
27d58b7b5edd Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4893
diff changeset
207 for (int i = 0; i < S; ++i) {
27d58b7b5edd Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4893
diff changeset
208 Node node = nodes.item(i);
27d58b7b5edd Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4893
diff changeset
209 String ns;
27d58b7b5edd Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4893
diff changeset
210 // Regular statement node.
27d58b7b5edd Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4893
diff changeset
211 if (node.getNodeType() == Node.ELEMENT_NODE
6399
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
212 && node.getLocalName().equals(selectName)
4896
27d58b7b5edd Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4893
diff changeset
213 && (ns = node.getNamespaceURI()) != null
27d58b7b5edd Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4893
diff changeset
214 && ns.equals(DC_NAMESPACE_URI)) {
27d58b7b5edd Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4893
diff changeset
215 return node;
27d58b7b5edd Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4893
diff changeset
216 }
27d58b7b5edd Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4893
diff changeset
217 // Macro node. Descend.
27d58b7b5edd Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4893
diff changeset
218 else if (node.getNodeType() == Node.ELEMENT_NODE
27d58b7b5edd Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4893
diff changeset
219 && node.getLocalName().equals("call-macro")
27d58b7b5edd Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4893
diff changeset
220 && (ns = node.getNamespaceURI()) != null
27d58b7b5edd Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4893
diff changeset
221 && ns.equals(DC_NAMESPACE_URI)) {
27d58b7b5edd Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4893
diff changeset
222
27d58b7b5edd Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4893
diff changeset
223 String macroName = ((Element)node).getAttribute("name");
27d58b7b5edd Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4893
diff changeset
224 Node inMacroNode =
8856
5e38e2924c07 Fix code style.
Tom Gottfried <tom@intevation.de>
parents: 8491
diff changeset
225 findSelectNode(
5e38e2924c07 Fix code style.
Tom Gottfried <tom@intevation.de>
parents: 8491
diff changeset
226 getMacroChildren(macroName), selectName);
4896
27d58b7b5edd Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4893
diff changeset
227 if (inMacroNode != null) {
27d58b7b5edd Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4893
diff changeset
228 return inMacroNode;
27d58b7b5edd Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4893
diff changeset
229 }
27d58b7b5edd Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4893
diff changeset
230 }
27d58b7b5edd Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4893
diff changeset
231
27d58b7b5edd Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4893
diff changeset
232 }
27d58b7b5edd Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4893
diff changeset
233
27d58b7b5edd Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4893
diff changeset
234 return null;
27d58b7b5edd Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4893
diff changeset
235 }
27d58b7b5edd Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4893
diff changeset
236
6399
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
237 private String[][] extractProperties(Element propertiesNode) {
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
238 ArrayList<String[]> props = new ArrayList<String[]>();
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
239 NodeList list = propertiesNode.getElementsByTagNameNS(
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
240 DC_NAMESPACE_URI, "property");
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
241 for (int i = 0, L = list.getLength(); i < L; ++i) {
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
242 Element property = (Element)list.item(i);
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
243 String name = property.getAttribute("name");
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
244 if (name.isEmpty()) {
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
245 log.warn("dc:property without name");
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
246 continue;
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
247 }
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
248 String alias = property.getAttribute("alias");
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
249 if (alias.isEmpty()) {
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
250 alias = name;
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
251 }
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
252 props.add(new String [] { name, alias });
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
253 }
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
254 return props.toArray(new String[props.size()][]);
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
255 }
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
256
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
257 /**
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
258 * Handle a dc:context node.
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
259 */
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
260 protected void containerContext(Node parent, Element current)
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
261 throws SQLException
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
262 {
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
263 log.debug("dc:container-context");
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
264
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
265 String container = expand(current.getAttribute("container"));
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
266
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
267 if (container.isEmpty()) {
8856
5e38e2924c07 Fix code style.
Tom Gottfried <tom@intevation.de>
parents: 8491
diff changeset
268 log.warn(
5e38e2924c07 Fix code style.
Tom Gottfried <tom@intevation.de>
parents: 8491
diff changeset
269 "dc:container-context: no 'container' attribute found");
6399
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
270 return;
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
271 }
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
272
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
273 NodeList subs = current.getChildNodes();
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
274 Node propertiesNode = findPropertiesNode(subs);
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
275
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
276 if (propertiesNode == null) {
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
277 log.warn("dc:container-context: cannot find properties.");
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
278 return;
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
279 }
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
280
8856
5e38e2924c07 Fix code style.
Tom Gottfried <tom@intevation.de>
parents: 8491
diff changeset
281 String [][] properties = extractProperties(
5e38e2924c07 Fix code style.
Tom Gottfried <tom@intevation.de>
parents: 8491
diff changeset
282 (Element)propertiesNode);
6399
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
283
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
284 if (properties.length == 0) {
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
285 log.warn("dc:properties: No properties defined.");
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
286 }
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
287
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
288 Object [] result = new Object[1];
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
289 if (!frames.getStore(container, result)) {
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
290 log.warn("dc:container-context: cannot find container.");
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
291 return;
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
292 }
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
293 Object c = result[0];
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
294 if (c instanceof Object []) {
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
295 c = Arrays.asList((Object [])c);
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
296 }
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
297 if (!(c instanceof Collection)) {
8856
5e38e2924c07 Fix code style.
Tom Gottfried <tom@intevation.de>
parents: 8491
diff changeset
298 log.warn(
5e38e2924c07 Fix code style.
Tom Gottfried <tom@intevation.de>
parents: 8491
diff changeset
299 "dc:container-context: container is not a collection.");
6399
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
300 return;
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
301 }
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
302
6402
da1d1df9ab23 Datacage: Stop execution of dc:container-context earlier if there are nor results at all.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6399
diff changeset
303 Collection<?> collection = (Collection<?>)c;
da1d1df9ab23 Datacage: Stop execution of dc:container-context earlier if there are nor results at all.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6399
diff changeset
304
da1d1df9ab23 Datacage: Stop execution of dc:container-context earlier if there are nor results at all.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6399
diff changeset
305 // only descent if there are results
da1d1df9ab23 Datacage: Stop execution of dc:container-context earlier if there are nor results at all.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6399
diff changeset
306 if (collection.isEmpty()) {
da1d1df9ab23 Datacage: Stop execution of dc:container-context earlier if there are nor results at all.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6399
diff changeset
307 return;
da1d1df9ab23 Datacage: Stop execution of dc:container-context earlier if there are nor results at all.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6399
diff changeset
308 }
da1d1df9ab23 Datacage: Stop execution of dc:container-context earlier if there are nor results at all.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6399
diff changeset
309
6399
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
310 String [] columnNames = new String[properties.length];
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
311 for (int i = 0; i < columnNames.length; ++i) {
6455
201d90f56d98 Fixed container context variables: to upper case.
Raimund Renkert <rrenkert@intevation.de>
parents: 6402
diff changeset
312 columnNames[i] = properties[i][1].toUpperCase();
6399
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
313 }
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
314
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
315 ResultData rd = new ResultData(columnNames);
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
316
6402
da1d1df9ab23 Datacage: Stop execution of dc:container-context earlier if there are nor results at all.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6399
diff changeset
317 for (Object obj: collection) {
6399
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
318 Object [] row = new Object[properties.length];
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
319 for (int i = 0; i < properties.length; ++i) {
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
320 row[i] = getProperty(obj, properties[i][0]);
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
321 }
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
322 rd.add(row);
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
323 }
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
324
6402
da1d1df9ab23 Datacage: Stop execution of dc:container-context earlier if there are nor results at all.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6399
diff changeset
325 // A bit of a fake because the data is not from a
da1d1df9ab23 Datacage: Stop execution of dc:container-context earlier if there are nor results at all.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6399
diff changeset
326 // real connection.
da1d1df9ab23 Datacage: Stop execution of dc:container-context earlier if there are nor results at all.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6399
diff changeset
327 NamedConnection connection = connectionsStack.isEmpty()
da1d1df9ab23 Datacage: Stop execution of dc:container-context earlier if there are nor results at all.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6399
diff changeset
328 ? connections.get(0)
da1d1df9ab23 Datacage: Stop execution of dc:container-context earlier if there are nor results at all.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6399
diff changeset
329 : connectionsStack.peek().getA();
6399
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
330
6402
da1d1df9ab23 Datacage: Stop execution of dc:container-context earlier if there are nor results at all.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6399
diff changeset
331 connectionsStack.push(
da1d1df9ab23 Datacage: Stop execution of dc:container-context earlier if there are nor results at all.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6399
diff changeset
332 new Pair<NamedConnection, ResultData>(connection, rd));
da1d1df9ab23 Datacage: Stop execution of dc:container-context earlier if there are nor results at all.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6399
diff changeset
333 try {
da1d1df9ab23 Datacage: Stop execution of dc:container-context earlier if there are nor results at all.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6399
diff changeset
334 for (int i = 0, S = subs.getLength(); i < S; ++i) {
da1d1df9ab23 Datacage: Stop execution of dc:container-context earlier if there are nor results at all.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6399
diff changeset
335 build(parent, subs.item(i));
6399
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
336 }
6402
da1d1df9ab23 Datacage: Stop execution of dc:container-context earlier if there are nor results at all.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6399
diff changeset
337 }
da1d1df9ab23 Datacage: Stop execution of dc:container-context earlier if there are nor results at all.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6399
diff changeset
338 finally {
da1d1df9ab23 Datacage: Stop execution of dc:container-context earlier if there are nor results at all.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6399
diff changeset
339 connectionsStack.pop();
6399
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
340 }
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
341 }
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
342
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
343 /** Poor man's bean access. */
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
344 private Object getProperty(Object obj, String name) {
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
345 String mname =
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
346 "get" + Character.toUpperCase(name.charAt(0))
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
347 + name.substring(1);
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
348
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
349 try {
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
350 Method meth = obj.getClass().getMethod(mname);
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
351 return meth.invoke(obj);
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
352 }
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
353 catch (InvocationTargetException ite) {
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
354 log.warn(ite);
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
355 }
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
356 catch (IllegalAccessException iae) {
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
357 log.warn(iae);
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
358 }
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
359 catch (NoSuchMethodException nsme) {
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
360 log.warn(nsme);
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
361 }
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
362 return null;
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
363 }
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
364
4896
27d58b7b5edd Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4893
diff changeset
365 /**
5509
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
366 * Handle a dc:context node.
1890
9144e5a5027b (Picky) cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1859
diff changeset
367 */
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
368 protected void context(Node parent, Element current)
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
369 throws SQLException
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
370 {
1023
5cb84ceee2a0 Datacage: Templates now can nest <dc:elements> into other elements in the body of <dc:context>
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
371 log.debug("dc:context");
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
372
1023
5cb84ceee2a0 Datacage: Templates now can nest <dc:elements> into other elements in the body of <dc:context>
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
373 NodeList subs = current.getChildNodes();
4896
27d58b7b5edd Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4893
diff changeset
374 Node stmntNode = findStatementNode(subs);
1023
5cb84ceee2a0 Datacage: Templates now can nest <dc:elements> into other elements in the body of <dc:context>
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
375
5cb84ceee2a0 Datacage: Templates now can nest <dc:elements> into other elements in the body of <dc:context>
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
376 if (stmntNode == null) {
5cb84ceee2a0 Datacage: Templates now can nest <dc:elements> into other elements in the body of <dc:context>
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
377 log.warn("dc:context: cannot find statement");
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
378 return;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
379 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
380
1890
9144e5a5027b (Picky) cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1859
diff changeset
381 String stmntText = stmntNode.getTextContent();
9144e5a5027b (Picky) cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1859
diff changeset
382
1011
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
383 String con = current.getAttribute("connection");
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
384
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
385 String key = con + "-" + stmntText;
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
386
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
387 CompiledStatement.Instance csi = statements.get(key);
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
388
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
389 if (csi == null) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
390 CompiledStatement cs = compiledStatements.get(stmntText);
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
391 csi = cs.new Instance();
1011
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
392 statements.put(key, csi);
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
393 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
394
1011
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
395 NamedConnection connection = connectionsStack.isEmpty()
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
396 ? connections.get(0)
1818
e3eb1ea885a7 Simplified code in Datacage builder by using the new pair.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1716
diff changeset
397 : connectionsStack.peek().getA();
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
398
1011
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
399 if (con.length() > 0) {
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
400 for (NamedConnection nc: connections) {
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
401 if (con.equals(nc.name)) {
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
402 connection = nc;
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
403 break;
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
404 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
405 }
1011
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
406 }
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
407
1023
5cb84ceee2a0 Datacage: Templates now can nest <dc:elements> into other elements in the body of <dc:context>
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
408 ResultData rd = csi.execute(
5cb84ceee2a0 Datacage: Templates now can nest <dc:elements> into other elements in the body of <dc:context>
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
409 connection.connection,
5cb84ceee2a0 Datacage: Templates now can nest <dc:elements> into other elements in the body of <dc:context>
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
410 frames,
5cb84ceee2a0 Datacage: Templates now can nest <dc:elements> into other elements in the body of <dc:context>
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
411 connection.cached);
1011
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
412
1023
5cb84ceee2a0 Datacage: Templates now can nest <dc:elements> into other elements in the body of <dc:context>
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
413 // only descent if there are results
5cb84ceee2a0 Datacage: Templates now can nest <dc:elements> into other elements in the body of <dc:context>
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
414 if (!rd.isEmpty()) {
4051
58bdf95df5e4 More dead code removal. Minor code clean ups.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 3571
diff changeset
415 connectionsStack.push(
58bdf95df5e4 More dead code removal. Minor code clean ups.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 3571
diff changeset
416 new Pair<NamedConnection, ResultData>(connection, rd));
1023
5cb84ceee2a0 Datacage: Templates now can nest <dc:elements> into other elements in the body of <dc:context>
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
417 try {
6399
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
418 for (int i = 0, S = subs.getLength(); i < S; ++i) {
1023
5cb84ceee2a0 Datacage: Templates now can nest <dc:elements> into other elements in the body of <dc:context>
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
419 build(parent, subs.item(i));
1011
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
420 }
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
421 }
1023
5cb84ceee2a0 Datacage: Templates now can nest <dc:elements> into other elements in the body of <dc:context>
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
422 finally {
5cb84ceee2a0 Datacage: Templates now can nest <dc:elements> into other elements in the body of <dc:context>
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
423 connectionsStack.pop();
5cb84ceee2a0 Datacage: Templates now can nest <dc:elements> into other elements in the body of <dc:context>
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
424 }
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
425 }
1023
5cb84ceee2a0 Datacage: Templates now can nest <dc:elements> into other elements in the body of <dc:context>
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
426 }
5cb84ceee2a0 Datacage: Templates now can nest <dc:elements> into other elements in the body of <dc:context>
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
427
5433
df32d7518f55 Expose function dc:has-result to Function Resolver.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5432
diff changeset
428 public boolean hasResult() {
df32d7518f55 Expose function dc:has-result to Function Resolver.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5432
diff changeset
429 return !connectionsStack.isEmpty()
df32d7518f55 Expose function dc:has-result to Function Resolver.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5432
diff changeset
430 && !connectionsStack.peek().getB().isEmpty();
df32d7518f55 Expose function dc:has-result to Function Resolver.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5432
diff changeset
431 }
5305
e60f65540cc2 Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents: 4897
diff changeset
432
5892
9a3ca7532f2a Datacage: Repaired and simplified dc:filter code.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5890
diff changeset
433 protected ResultData createFilteredResultData(
9a3ca7532f2a Datacage: Repaired and simplified dc:filter code.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5890
diff changeset
434 ResultData rd,
9a3ca7532f2a Datacage: Repaired and simplified dc:filter code.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5890
diff changeset
435 String filter
9a3ca7532f2a Datacage: Repaired and simplified dc:filter code.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5890
diff changeset
436 ) {
5305
e60f65540cc2 Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents: 4897
diff changeset
437 if (filter == null) return rd;
e60f65540cc2 Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents: 4897
diff changeset
438
5892
9a3ca7532f2a Datacage: Repaired and simplified dc:filter code.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5890
diff changeset
439 XPathExpression x;
9a3ca7532f2a Datacage: Repaired and simplified dc:filter code.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5890
diff changeset
440 try {
9a3ca7532f2a Datacage: Repaired and simplified dc:filter code.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5890
diff changeset
441 x = getXPathExpression(filter);
9a3ca7532f2a Datacage: Repaired and simplified dc:filter code.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5890
diff changeset
442 }
9a3ca7532f2a Datacage: Repaired and simplified dc:filter code.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5890
diff changeset
443 catch (XPathExpressionException xee) {
8959
175f113ed939 Do not silently eat exceptions!
gernotbelger
parents: 8856
diff changeset
444 log.warn("Invalid filter expression '" + filter + "'.", xee);
5892
9a3ca7532f2a Datacage: Repaired and simplified dc:filter code.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5890
diff changeset
445 return rd;
9a3ca7532f2a Datacage: Repaired and simplified dc:filter code.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5890
diff changeset
446 }
9a3ca7532f2a Datacage: Repaired and simplified dc:filter code.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5890
diff changeset
447
5305
e60f65540cc2 Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents: 4897
diff changeset
448 List<Object []> rows = rd.getRows();
e60f65540cc2 Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents: 4897
diff changeset
449 String [] columns = rd.getColumnLabels();
e60f65540cc2 Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents: 4897
diff changeset
450
e60f65540cc2 Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents: 4897
diff changeset
451 List<Object []> filtered = new ArrayList<Object[]>(rows.size());
e60f65540cc2 Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents: 4897
diff changeset
452
e60f65540cc2 Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents: 4897
diff changeset
453 for (Object [] row: rows) {
e60f65540cc2 Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents: 4897
diff changeset
454 frames.enter();
e60f65540cc2 Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents: 4897
diff changeset
455 try {
e60f65540cc2 Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents: 4897
diff changeset
456 frames.put(columns, row);
5892
9a3ca7532f2a Datacage: Repaired and simplified dc:filter code.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5890
diff changeset
457 Object result = x.evaluate(
9a3ca7532f2a Datacage: Repaired and simplified dc:filter code.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5890
diff changeset
458 EVAL_DOCUMENT, XPathConstants.BOOLEAN);
5305
e60f65540cc2 Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents: 4897
diff changeset
459
5892
9a3ca7532f2a Datacage: Repaired and simplified dc:filter code.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5890
diff changeset
460 if (result instanceof Boolean && (Boolean)result) {
5305
e60f65540cc2 Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents: 4897
diff changeset
461 filtered.add(row);
e60f65540cc2 Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents: 4897
diff changeset
462 }
e60f65540cc2 Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents: 4897
diff changeset
463 }
5892
9a3ca7532f2a Datacage: Repaired and simplified dc:filter code.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5890
diff changeset
464 catch (XPathExpressionException xee) {
9a3ca7532f2a Datacage: Repaired and simplified dc:filter code.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5890
diff changeset
465 log.warn("unable to apply filter expression '" +
7573
bfec104f20c7 Builder: Slightly more verbose errormessage.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 7235
diff changeset
466 filter + "' to dataset. " + xee.getMessage(), xee);
5892
9a3ca7532f2a Datacage: Repaired and simplified dc:filter code.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5890
diff changeset
467 }
5305
e60f65540cc2 Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents: 4897
diff changeset
468 finally {
e60f65540cc2 Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents: 4897
diff changeset
469 frames.leave();
e60f65540cc2 Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents: 4897
diff changeset
470 }
e60f65540cc2 Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents: 4897
diff changeset
471 }
5892
9a3ca7532f2a Datacage: Repaired and simplified dc:filter code.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5890
diff changeset
472 return new ResultData(columns, filtered);
5305
e60f65540cc2 Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents: 4897
diff changeset
473 }
e60f65540cc2 Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents: 4897
diff changeset
474
5509
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
475 protected void filter(Node parent, Element current)
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
476 throws SQLException
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
477 {
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
478 String expr = current.getAttribute("expr");
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
479
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
480 if ((expr = expr.trim()).length() == 0) {
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
481 expr = null;
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
482 }
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
483
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
484 NodeList subs = current.getChildNodes();
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
485 int S = subs.getLength();
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
486 if (S == 0) {
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
487 log.debug("dc:filter has no children");
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
488 return;
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
489 }
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
490
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
491 ResultData orig = null;
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
492 Pair<Builder.NamedConnection, ResultData> pair = null;
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
493
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
494 if (expr != null && !connectionsStack.isEmpty()) {
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
495 pair = connectionsStack.peek();
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
496 orig = pair.getB();
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
497 pair.setB(createFilteredResultData(orig, expr));
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
498 }
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
499
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
500 try {
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
501 for (int i = 0; i < S; ++i) {
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
502 build(parent, subs.item(i));
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
503 }
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
504 }
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
505 finally {
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
506 if (orig != null) {
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
507 pair.setB(orig);
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
508 }
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
509 }
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
510 }
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
511
5890
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
512 protected Map<Object, ResultData> createGroupedResultData(
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
513 ResultData rd,
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
514 String expr,
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
515 String type
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
516 ) {
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
517 List<Object []> rows = rd.getRows();
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
518 String [] columns = rd.getColumnLabels();
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
519
7960
fbab10c21e0b Datacage: Make it possible to group a value tuple into more than one group.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7677
diff changeset
520 String [] exprs = MAGIC_EXPR_SEPARATOR.split(expr);
fbab10c21e0b Datacage: Make it possible to group a value tuple into more than one group.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7677
diff changeset
521
fbab10c21e0b Datacage: Make it possible to group a value tuple into more than one group.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7677
diff changeset
522 XPathExpression [] xs = new XPathExpression[exprs.length];
fbab10c21e0b Datacage: Make it possible to group a value tuple into more than one group.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7677
diff changeset
523
5890
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
524 try {
7960
fbab10c21e0b Datacage: Make it possible to group a value tuple into more than one group.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7677
diff changeset
525 for (int i = 0; i < exprs.length; ++i) {
fbab10c21e0b Datacage: Make it possible to group a value tuple into more than one group.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7677
diff changeset
526 xs[i] = getXPathExpression(exprs[i]);
fbab10c21e0b Datacage: Make it possible to group a value tuple into more than one group.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7677
diff changeset
527 }
5890
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
528 }
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
529 catch (XPathExpressionException xee) {
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
530 log.warn("Invalid expression '" + expr + "'.");
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
531 return Collections.<Object, ResultData>emptyMap();
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
532 }
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
533
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
534 QName returnType = typeToQName(type);
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
535
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
536 Map<Object, ResultData> groups = new TreeMap<Object, ResultData>();
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
537
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
538 for (Object [] row: rows) {
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
539 frames.enter();
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
540 try {
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
541 frames.put(columns, row);
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
542
7960
fbab10c21e0b Datacage: Make it possible to group a value tuple into more than one group.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7677
diff changeset
543 for (XPathExpression x: xs) {
fbab10c21e0b Datacage: Make it possible to group a value tuple into more than one group.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7677
diff changeset
544 Object key = x.evaluate(EVAL_DOCUMENT, returnType);
fbab10c21e0b Datacage: Make it possible to group a value tuple into more than one group.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7677
diff changeset
545 ResultData group = groups.get(key);
5890
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
546
7960
fbab10c21e0b Datacage: Make it possible to group a value tuple into more than one group.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7677
diff changeset
547 if (group == null) {
fbab10c21e0b Datacage: Make it possible to group a value tuple into more than one group.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7677
diff changeset
548 group = new ResultData(rd.getColumnLabels());
fbab10c21e0b Datacage: Make it possible to group a value tuple into more than one group.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7677
diff changeset
549 groups.put(key, group);
fbab10c21e0b Datacage: Make it possible to group a value tuple into more than one group.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7677
diff changeset
550 }
fbab10c21e0b Datacage: Make it possible to group a value tuple into more than one group.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7677
diff changeset
551 group.add(row);
5890
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
552 }
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
553 }
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
554 catch (XPathExpressionException xxe) {
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
555 log.warn("unable to apply expression '" +
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
556 expr + "' to dataset.");
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
557 }
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
558 finally {
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
559 frames.leave();
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
560 }
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
561 }
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
562 return groups;
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
563 }
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
564
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
565 protected void group(Node parent, Element current)
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
566 throws SQLException
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
567 {
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
568 log.debug("dc:group");
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
569
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
570 if (connectionsStack.isEmpty()) {
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
571 log.debug("dc:group without having results");
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
572 return;
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
573 }
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
574
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
575 NodeList subs = current.getChildNodes();
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
576 int S = subs.getLength();
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
577
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
578 if (S == 0) {
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
579 log.debug("dc:group has no children");
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
580 return;
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
581 }
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
582
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
583 String expr = current.getAttribute("expr").trim();
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
584 String type = current.getAttribute("type").trim();
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
585
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
586 Pair<Builder.NamedConnection, ResultData> pair =
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
587 connectionsStack.peek();
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
588
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
589 ResultData orig = connectionsStack.peek().getB();
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
590
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
591 Map<Object, ResultData> groups =
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
592 createGroupedResultData(orig, expr, type);
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
593
6050
06450ef553cc DC: fixed dc:group
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5994
diff changeset
594 boolean debug = log.isDebugEnabled();
5890
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
595
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
596 try {
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
597 for (Map.Entry<Object, ResultData> entry: groups.entrySet()) {
6050
06450ef553cc DC: fixed dc:group
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5994
diff changeset
598 Object key = entry.getKey();
06450ef553cc DC: fixed dc:group
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5994
diff changeset
599 ResultData rd = entry.getValue();
5890
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
600 pair.setB(rd);
6050
06450ef553cc DC: fixed dc:group
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5994
diff changeset
601 groupExprStack.push(key);
06450ef553cc DC: fixed dc:group
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5994
diff changeset
602 if (debug) {
06450ef553cc DC: fixed dc:group
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5994
diff changeset
603 log.debug("group key: " + key);
06450ef553cc DC: fixed dc:group
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5994
diff changeset
604 }
5890
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
605 try {
6050
06450ef553cc DC: fixed dc:group
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5994
diff changeset
606 for (int i = 0; i < S; ++i) {
06450ef553cc DC: fixed dc:group
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5994
diff changeset
607 build(parent, subs.item(i));
5890
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
608 }
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
609 }
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
610 finally {
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
611 groupExprStack.pop();
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
612 }
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
613 }
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
614 }
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
615 finally {
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
616 pair.setB(orig);
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
617 }
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
618 }
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
619
7669
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
620
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
621 protected ResultData createSortedResultData(
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
622 ResultData orig,
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
623 String expr,
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
624 String type
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
625 ) {
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
626 XPathExpression x;
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
627 try {
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
628 x = getXPathExpression(expr);
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
629 }
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
630 catch (XPathExpressionException xee) {
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
631 log.warn("Invalid sort expression '" + expr + "'.");
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
632 return orig;
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
633 }
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
634
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
635 QName returnType = typeToQName(type);
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
636
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
637 List<Object []> rows = orig.getRows();
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
638 String [] columns = orig.getColumnLabels();
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
639
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
640 List<KV> sorted = new ArrayList<KV>(rows.size());
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
641
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
642 for (Object [] row: rows) {
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
643 frames.enter();
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
644 try {
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
645 frames.put(columns, row);
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
646 Object key = x.evaluate(EVAL_DOCUMENT, returnType);
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
647
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
648 if (key instanceof Comparable) {
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
649 sorted.add(new KV((Comparable<Object>)key, row));
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
650 }
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
651 }
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
652 catch (XPathExpressionException xee) {
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
653 log.warn("unable to apply expression '" +
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
654 expr + "' to dataset. " + xee.getMessage(), xee);
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
655 }
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
656 finally {
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
657 frames.leave();
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
658 }
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
659 }
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
660 Collections.sort(sorted);
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
661 List<Object []> result = new ArrayList<Object []>(sorted.size());
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
662 for (KV kv: sorted) {
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
663 result.add(kv.getData());
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
664 }
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
665 return new ResultData(columns, result);
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
666 }
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
667
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
668 protected void sort(Node parent, Element current)
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
669 throws SQLException
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
670 {
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
671 log.debug("dc:sort");
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
672
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
673 if (connectionsStack.isEmpty()) {
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
674 log.debug("dc:sort without having results");
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
675 return;
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
676 }
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
677
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
678 String expr = current.getAttribute("expr").trim();
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
679 String type = current.getAttribute("type").trim();
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
680
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
681 if (expr.isEmpty()) {
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
682 log.warn("missing 'expr' in dc:sort");
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
683 return;
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
684 }
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
685
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
686 Pair<Builder.NamedConnection, ResultData> pair =
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
687 connectionsStack.peek();
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
688
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
689 ResultData orig = connectionsStack.peek().getB();
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
690
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
691 ResultData sorted = createSortedResultData(orig, expr, type);
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
692
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
693 NodeList subs = current.getChildNodes();
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
694
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
695 pair.setB(sorted);
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
696 try {
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
697 for (int i = 0, S = subs.getLength(); i < S; ++i) {
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
698 build(parent, subs.item(i));
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
699 }
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
700 }
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
701 finally {
7677
36e28ec7ff16 dc:sort: Removed unnecessary if check. Forgot to push before tag.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7669
diff changeset
702 pair.setB(orig);
7669
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
703 }
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
704 }
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
705
5890
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
706 public Object getGroupKey() {
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
707 return groupExprStack.isEmpty()
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
708 ? null
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
709 : groupExprStack.peek();
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
710 }
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
711
6087
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
712 protected void virtualColumn(Node parent, Element current)
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
713 throws SQLException
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
714 {
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
715 log.debug("dc:virtual-column");
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
716
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
717 if (connectionsStack.isEmpty()) {
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
718 log.debug("dc:virtual-column without having results");
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
719 return;
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
720 }
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
721
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
722 NodeList subs = current.getChildNodes();
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
723 int S = subs.getLength();
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
724
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
725 if (S == 0) {
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
726 log.debug("dc:virtual-column has no children");
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
727 return;
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
728 }
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
729
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
730 String name = expand(current.getAttribute("name"));
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
731 String expr = current.getAttribute("expr").trim();
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
732 String type = current.getAttribute("type").trim();
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
733
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
734 QName returnType = typeToQName(type);
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
735
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
736 XPathExpression x;
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
737 try {
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
738 x = getXPathExpression(expr);
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
739 }
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
740 catch (XPathExpressionException xee) {
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
741 log.warn("Invalid expression '" + expr + "'.");
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
742 return;
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
743 }
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
744
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
745 Pair<Builder.NamedConnection, ResultData> pair =
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
746 connectionsStack.peek();
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
747
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
748 ResultData orig = connectionsStack.peek().getB();
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
749
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
750 int index = orig.indexOfColumn(name);
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
751
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
752 ResultData rd = index >= 0 // Already has column with this name?
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
753 ? replaceColumn(orig, index, x, returnType)
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
754 : addColumn(orig, name, x, returnType);
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
755
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
756 pair.setB(rd);
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
757 try {
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
758 for (int i = 0; i < S; ++i) {
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
759 build(parent, subs.item(i));
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
760 }
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
761 }
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
762 finally {
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
763 pair.setB(orig);
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
764 }
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
765 }
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
766
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
767 protected ResultData addColumn(
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
768 ResultData rd,
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
769 String name,
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
770 XPathExpression expr,
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
771 QName returnType
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
772 ) {
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
773 String [] origColumns = rd.getColumnLabels();
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
774 int index = origColumns.length;
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
775 String [] newColumns = Arrays.copyOf(origColumns, index+1);
6093
4b634935a2ad Datacage: Fixed fix for <dc:virtual-column>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6092
diff changeset
776 newColumns[index] = name.toUpperCase();
6087
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
777 ResultData result = new ResultData(newColumns);
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
778 fillResult(result, rd, index, index+1, expr, returnType);
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
779 return result;
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
780 }
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
781
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
782 protected ResultData replaceColumn(
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
783 ResultData rd,
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
784 int index,
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
785 XPathExpression expr,
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
786 QName returnType
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
787 ) {
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
788 String [] columns = rd.getColumnLabels();
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
789 ResultData result = new ResultData(columns);
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
790 fillResult(result, rd, index, columns.length, expr, returnType);
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
791 return result;
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
792 }
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
793
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
794 protected void fillResult(
6092
bdb316f7c552 Datacage: Fixed addColumn in <dc:virtual-column>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6087
diff changeset
795 ResultData result,
bdb316f7c552 Datacage: Fixed addColumn in <dc:virtual-column>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6087
diff changeset
796 ResultData rd,
bdb316f7c552 Datacage: Fixed addColumn in <dc:virtual-column>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6087
diff changeset
797 int index,
bdb316f7c552 Datacage: Fixed addColumn in <dc:virtual-column>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6087
diff changeset
798 int size,
6087
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
799 XPathExpression expr,
6092
bdb316f7c552 Datacage: Fixed addColumn in <dc:virtual-column>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6087
diff changeset
800 QName returnType
6087
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
801 ) {
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
802 String [] origColumns = rd.getColumnLabels();
6092
bdb316f7c552 Datacage: Fixed addColumn in <dc:virtual-column>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6087
diff changeset
803 for (Object [] row: rd.getRows()) {
6087
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
804 frames.enter();
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
805 try {
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
806 frames.put(origColumns, row);
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
807 Object value = expr.evaluate(EVAL_DOCUMENT, returnType);
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
808 Object [] copy = Arrays.copyOf(row, size);
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
809 copy[index] = value;
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
810 result.add(copy);
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
811 }
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
812 catch (XPathExpressionException xxe) {
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
813 log.warn("unable to apply expression '" +
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
814 expr + "' to dataset.", xxe);
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
815 }
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
816 finally {
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
817 frames.leave();
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
818 }
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
819 }
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
820 }
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
821
5974
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
822 protected void iterate(Node parent, Element current)
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
823 throws SQLException
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
824 {
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
825 log.debug("dc:iterate");
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
826 String container = expand(current.getAttribute("container"));
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
827 String var = expand(current.getAttribute("var")).toUpperCase();
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
828
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
829 if (container.isEmpty()) {
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
830 log.warn("'container' not set.");
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
831 return;
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
832 }
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
833
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
834 if (var.isEmpty()) {
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
835 log.warn("'var' not set.");
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
836 return;
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
837 }
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
838
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
839 Object [] result = new Object[1];
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
840
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
841 if (frames.getStore(container, result)) {
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
842 Object c = result[0];
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
843 if (c instanceof Object []) {
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
844 c = Arrays.asList((Object [])c);
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
845 }
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
846 if (c instanceof Collection) {
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
847 frames.enter();
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
848 try {
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
849 Collection<?> col = (Collection<?>)c;
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
850 for (Object o: col) {
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
851 if (o instanceof String) {
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
852 o = ((String)o).toLowerCase();
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
853 }
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
854 frames.put(var, o);
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
855 NodeList subs = current.getChildNodes();
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
856 for (int i = 0, N = subs.getLength(); i < N; ++i) {
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
857 build(parent, subs.item(i));
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
858 }
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
859 }
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
860 }
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
861 finally {
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
862 frames.leave();
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
863 }
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
864 }
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
865 }
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
866 }
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
867
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
868
1890
9144e5a5027b (Picky) cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1859
diff changeset
869 /**
9144e5a5027b (Picky) cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1859
diff changeset
870 * Kind of foreach over results of a statement within a context.
9144e5a5027b (Picky) cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1859
diff changeset
871 */
5522
eeac800eb4cd Datacage: Rename <dc:elements> to <dc:for-each>. We should have done this much earlier.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5517
diff changeset
872 protected void foreach(Node parent, Element current)
1023
5cb84ceee2a0 Datacage: Templates now can nest <dc:elements> into other elements in the body of <dc:context>
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
873 throws SQLException
5cb84ceee2a0 Datacage: Templates now can nest <dc:elements> into other elements in the body of <dc:context>
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
874 {
5522
eeac800eb4cd Datacage: Rename <dc:elements> to <dc:for-each>. We should have done this much earlier.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5517
diff changeset
875 log.debug("dc:for-each");
1023
5cb84ceee2a0 Datacage: Templates now can nest <dc:elements> into other elements in the body of <dc:context>
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
876
1818
e3eb1ea885a7 Simplified code in Datacage builder by using the new pair.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1716
diff changeset
877 if (connectionsStack.isEmpty()) {
5525
fcf28185ca30 Datacage: Removed 'filter' attribute from <dc:for-each> because there is the <dc:filter> element now.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5522
diff changeset
878 log.debug("dc:for-each without having results");
1023
5cb84ceee2a0 Datacage: Templates now can nest <dc:elements> into other elements in the body of <dc:context>
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
879 return;
5cb84ceee2a0 Datacage: Templates now can nest <dc:elements> into other elements in the body of <dc:context>
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
880 }
5cb84ceee2a0 Datacage: Templates now can nest <dc:elements> into other elements in the body of <dc:context>
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
881
5cb84ceee2a0 Datacage: Templates now can nest <dc:elements> into other elements in the body of <dc:context>
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
882 NodeList subs = current.getChildNodes();
5cb84ceee2a0 Datacage: Templates now can nest <dc:elements> into other elements in the body of <dc:context>
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
883 int S = subs.getLength();
5cb84ceee2a0 Datacage: Templates now can nest <dc:elements> into other elements in the body of <dc:context>
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
884
5cb84ceee2a0 Datacage: Templates now can nest <dc:elements> into other elements in the body of <dc:context>
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
885 if (S == 0) {
5522
eeac800eb4cd Datacage: Rename <dc:elements> to <dc:for-each>. We should have done this much earlier.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5517
diff changeset
886 log.debug("dc:for-each has no children");
1023
5cb84ceee2a0 Datacage: Templates now can nest <dc:elements> into other elements in the body of <dc:context>
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
887 return;
5cb84ceee2a0 Datacage: Templates now can nest <dc:elements> into other elements in the body of <dc:context>
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
888 }
5cb84ceee2a0 Datacage: Templates now can nest <dc:elements> into other elements in the body of <dc:context>
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
889
5305
e60f65540cc2 Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents: 4897
diff changeset
890 Pair<Builder.NamedConnection, ResultData> pair =
e60f65540cc2 Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents: 4897
diff changeset
891 connectionsStack.peek();
1023
5cb84ceee2a0 Datacage: Templates now can nest <dc:elements> into other elements in the body of <dc:context>
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
892
5509
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
893 ResultData rd = pair.getB();
5305
e60f65540cc2 Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents: 4897
diff changeset
894
5525
fcf28185ca30 Datacage: Removed 'filter' attribute from <dc:for-each> because there is the <dc:filter> element now.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5522
diff changeset
895 String [] columns = rd.getColumnLabels();
fcf28185ca30 Datacage: Removed 'filter' attribute from <dc:for-each> because there is the <dc:filter> element now.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5522
diff changeset
896
fcf28185ca30 Datacage: Removed 'filter' attribute from <dc:for-each> because there is the <dc:filter> element now.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5522
diff changeset
897 for (Object [] row: rd.getRows()) {
fcf28185ca30 Datacage: Removed 'filter' attribute from <dc:for-each> because there is the <dc:filter> element now.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5522
diff changeset
898 frames.enter();
fcf28185ca30 Datacage: Removed 'filter' attribute from <dc:for-each> because there is the <dc:filter> element now.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5522
diff changeset
899 try {
fcf28185ca30 Datacage: Removed 'filter' attribute from <dc:for-each> because there is the <dc:filter> element now.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5522
diff changeset
900 frames.put(columns, row);
fcf28185ca30 Datacage: Removed 'filter' attribute from <dc:for-each> because there is the <dc:filter> element now.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5522
diff changeset
901 for (int i = 0; i < S; ++i) {
fcf28185ca30 Datacage: Removed 'filter' attribute from <dc:for-each> because there is the <dc:filter> element now.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5522
diff changeset
902 build(parent, subs.item(i));
1023
5cb84ceee2a0 Datacage: Templates now can nest <dc:elements> into other elements in the body of <dc:context>
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
903 }
5cb84ceee2a0 Datacage: Templates now can nest <dc:elements> into other elements in the body of <dc:context>
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
904 }
5525
fcf28185ca30 Datacage: Removed 'filter' attribute from <dc:for-each> because there is the <dc:filter> element now.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5522
diff changeset
905 finally {
fcf28185ca30 Datacage: Removed 'filter' attribute from <dc:for-each> because there is the <dc:filter> element now.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5522
diff changeset
906 frames.leave();
fcf28185ca30 Datacage: Removed 'filter' attribute from <dc:for-each> because there is the <dc:filter> element now.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5522
diff changeset
907 }
1011
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
908 }
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
909 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
910
1890
9144e5a5027b (Picky) cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1859
diff changeset
911 /**
9144e5a5027b (Picky) cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1859
diff changeset
912 * Create element.
9144e5a5027b (Picky) cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1859
diff changeset
913 */
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
914 protected void element(Node parent, Element current)
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
915 throws SQLException
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
916 {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
917 String attr = expand(current.getAttribute("name"));
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
918
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
919 if (log.isDebugEnabled()) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
920 log.debug("dc:element -> '" + attr + "'");
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
921 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
922
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
923 if (attr.length() == 0) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
924 log.warn("no name attribute found");
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
925 return;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
926 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
927
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
928 Element element = owner.createElement(attr);
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
929
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
930 NodeList children = current.getChildNodes();
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
931 for (int i = 0, N = children.getLength(); i < N; ++i) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
932 build(element, children.item(i));
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
933 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
934
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
935 parent.appendChild(element);
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
936 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
937
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
938 protected void text(Node parent, Element current)
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
939 throws SQLException
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
940 {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
941 log.debug("dc:text");
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
942 String value = expand(current.getTextContent());
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
943 parent.appendChild(owner.createTextNode(value));
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
944 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
945
6077
c7777feea223 Datacage: Introduced <dc:message>This is my message!</dc:message>. The message are logged at INFO level to help debugging.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6050
diff changeset
946 protected void message(Node parent, Element current)
c7777feea223 Datacage: Introduced <dc:message>This is my message!</dc:message>. The message are logged at INFO level to help debugging.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6050
diff changeset
947 throws SQLException
c7777feea223 Datacage: Introduced <dc:message>This is my message!</dc:message>. The message are logged at INFO level to help debugging.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6050
diff changeset
948 {
c7777feea223 Datacage: Introduced <dc:message>This is my message!</dc:message>. The message are logged at INFO level to help debugging.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6050
diff changeset
949 log.debug("dc:message");
6455
201d90f56d98 Fixed container context variables: to upper case.
Raimund Renkert <rrenkert@intevation.de>
parents: 6402
diff changeset
950 if (log.isDebugEnabled()) {
6080
4bd8bbbcdf68 Datacage: Introduced dc:dump-variables() and modified dc:message to use XPath expansion.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6077
diff changeset
951 String value = current.getTextContent();
4bd8bbbcdf68 Datacage: Introduced dc:dump-variables() and modified dc:message to use XPath expansion.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6077
diff changeset
952 if (value.indexOf('{') >= 0) { // Performance tweak
4bd8bbbcdf68 Datacage: Introduced dc:dump-variables() and modified dc:message to use XPath expansion.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6077
diff changeset
953 value = expandXPathValue(value);
4bd8bbbcdf68 Datacage: Introduced dc:dump-variables() and modified dc:message to use XPath expansion.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6077
diff changeset
954 }
6455
201d90f56d98 Fixed container context variables: to upper case.
Raimund Renkert <rrenkert@intevation.de>
parents: 6402
diff changeset
955 log.debug("MESSAGE: " + value);
6077
c7777feea223 Datacage: Introduced <dc:message>This is my message!</dc:message>. The message are logged at INFO level to help debugging.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6050
diff changeset
956 }
c7777feea223 Datacage: Introduced <dc:message>This is my message!</dc:message>. The message are logged at INFO level to help debugging.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6050
diff changeset
957 }
c7777feea223 Datacage: Introduced <dc:message>This is my message!</dc:message>. The message are logged at INFO level to help debugging.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6050
diff changeset
958
1890
9144e5a5027b (Picky) cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1859
diff changeset
959 /**
9144e5a5027b (Picky) cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1859
diff changeset
960 * Add attribute to an element
3571
64a59cca1887 Cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 3076
diff changeset
961 * @see Element
1890
9144e5a5027b (Picky) cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1859
diff changeset
962 */
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
963 protected void attribute(Node parent, Element current) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
964
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
965 if (parent.getNodeType() != Node.ELEMENT_NODE) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
966 log.warn("need element here");
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
967 return;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
968 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
969
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
970 String name = expand(current.getAttribute("name"));
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
971 String value = expand(current.getAttribute("value"));
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
972
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
973 Element element = (Element)parent;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
974
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
975 element.setAttribute(name, value);
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
976 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
977
4893
54762b8ef016 Builder: Doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4891
diff changeset
978 /**
54762b8ef016 Builder: Doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4891
diff changeset
979 * Call-Macro node.
54762b8ef016 Builder: Doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4891
diff changeset
980 * Evaluate child-nodes of the given macro element (not its text).
54762b8ef016 Builder: Doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4891
diff changeset
981 */
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
982 protected void callMacro(Node parent, Element current)
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
983 throws SQLException
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
984 {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
985 String name = current.getAttribute("name");
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
986
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
987 if (name.length() == 0) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
988 log.warn("missing 'name' attribute in 'call-macro'");
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
989 return;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
990 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
991
5443
3d7e552cc396 Datacage: Index macros with a map. Reduces excessive linear scanning for macros when calling them.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5442
diff changeset
992 Element macro = macros.get(name);
4890
bf38ea4cb0f7 Added bodies to macros. Use the bodies of <dc:call-macro><body></dc:call-macro> as <dc:macro-body/> in tthe macro. Example:
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4740
diff changeset
993
bf38ea4cb0f7 Added bodies to macros. Use the bodies of <dc:call-macro><body></dc:call-macro> as <dc:macro-body/> in tthe macro. Example:
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4740
diff changeset
994 if (macro != null) {
bf38ea4cb0f7 Added bodies to macros. Use the bodies of <dc:call-macro><body></dc:call-macro> as <dc:macro-body/> in tthe macro. Example:
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4740
diff changeset
995 macroBodies.push(current.getChildNodes());
bf38ea4cb0f7 Added bodies to macros. Use the bodies of <dc:call-macro><body></dc:call-macro> as <dc:macro-body/> in tthe macro. Example:
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4740
diff changeset
996 try {
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
997 NodeList subs = macro.getChildNodes();
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
998 for (int j = 0, M = subs.getLength(); j < M; ++j) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
999 build(parent, subs.item(j));
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1000 }
4890
bf38ea4cb0f7 Added bodies to macros. Use the bodies of <dc:call-macro><body></dc:call-macro> as <dc:macro-body/> in tthe macro. Example:
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4740
diff changeset
1001 }
bf38ea4cb0f7 Added bodies to macros. Use the bodies of <dc:call-macro><body></dc:call-macro> as <dc:macro-body/> in tthe macro. Example:
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4740
diff changeset
1002 finally {
bf38ea4cb0f7 Added bodies to macros. Use the bodies of <dc:call-macro><body></dc:call-macro> as <dc:macro-body/> in tthe macro. Example:
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4740
diff changeset
1003 macroBodies.pop();
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1004 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1005 }
4890
bf38ea4cb0f7 Added bodies to macros. Use the bodies of <dc:call-macro><body></dc:call-macro> as <dc:macro-body/> in tthe macro. Example:
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4740
diff changeset
1006 else {
bf38ea4cb0f7 Added bodies to macros. Use the bodies of <dc:call-macro><body></dc:call-macro> as <dc:macro-body/> in tthe macro. Example:
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4740
diff changeset
1007 log.warn("no macro '" + name + "' found.");
bf38ea4cb0f7 Added bodies to macros. Use the bodies of <dc:call-macro><body></dc:call-macro> as <dc:macro-body/> in tthe macro. Example:
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4740
diff changeset
1008 }
bf38ea4cb0f7 Added bodies to macros. Use the bodies of <dc:call-macro><body></dc:call-macro> as <dc:macro-body/> in tthe macro. Example:
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4740
diff changeset
1009 }
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1010
4890
bf38ea4cb0f7 Added bodies to macros. Use the bodies of <dc:call-macro><body></dc:call-macro> as <dc:macro-body/> in tthe macro. Example:
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4740
diff changeset
1011 protected void macroBody(Node parent, Element current)
bf38ea4cb0f7 Added bodies to macros. Use the bodies of <dc:call-macro><body></dc:call-macro> as <dc:macro-body/> in tthe macro. Example:
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4740
diff changeset
1012 throws SQLException
bf38ea4cb0f7 Added bodies to macros. Use the bodies of <dc:call-macro><body></dc:call-macro> as <dc:macro-body/> in tthe macro. Example:
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4740
diff changeset
1013 {
bf38ea4cb0f7 Added bodies to macros. Use the bodies of <dc:call-macro><body></dc:call-macro> as <dc:macro-body/> in tthe macro. Example:
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4740
diff changeset
1014 if (!macroBodies.isEmpty()) {
bf38ea4cb0f7 Added bodies to macros. Use the bodies of <dc:call-macro><body></dc:call-macro> as <dc:macro-body/> in tthe macro. Example:
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4740
diff changeset
1015 NodeList children = macroBodies.peek();
bf38ea4cb0f7 Added bodies to macros. Use the bodies of <dc:call-macro><body></dc:call-macro> as <dc:macro-body/> in tthe macro. Example:
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4740
diff changeset
1016 for (int i = 0, N = children.getLength(); i < N; ++i) {
bf38ea4cb0f7 Added bodies to macros. Use the bodies of <dc:call-macro><body></dc:call-macro> as <dc:macro-body/> in tthe macro. Example:
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4740
diff changeset
1017 build(parent, children.item(i));
bf38ea4cb0f7 Added bodies to macros. Use the bodies of <dc:call-macro><body></dc:call-macro> as <dc:macro-body/> in tthe macro. Example:
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4740
diff changeset
1018 }
bf38ea4cb0f7 Added bodies to macros. Use the bodies of <dc:call-macro><body></dc:call-macro> as <dc:macro-body/> in tthe macro. Example:
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4740
diff changeset
1019 }
bf38ea4cb0f7 Added bodies to macros. Use the bodies of <dc:call-macro><body></dc:call-macro> as <dc:macro-body/> in tthe macro. Example:
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4740
diff changeset
1020 else {
bf38ea4cb0f7 Added bodies to macros. Use the bodies of <dc:call-macro><body></dc:call-macro> as <dc:macro-body/> in tthe macro. Example:
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4740
diff changeset
1021 log.warn("no current macro");
bf38ea4cb0f7 Added bodies to macros. Use the bodies of <dc:call-macro><body></dc:call-macro> as <dc:macro-body/> in tthe macro. Example:
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4740
diff changeset
1022 }
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1023 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1024
4896
27d58b7b5edd Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4893
diff changeset
1025 /** Get macro node children, not resolving bodies. */
27d58b7b5edd Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4893
diff changeset
1026 protected NodeList getMacroChildren(String name) {
27d58b7b5edd Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4893
diff changeset
1027
6097
a02d27da17ca Datacage: Macros are indexed, so there is no need to linear scan all template nodes to find them.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6096
diff changeset
1028 Element macro = macros.get(name);
a02d27da17ca Datacage: Macros are indexed, so there is no need to linear scan all template nodes to find them.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6096
diff changeset
1029 return macro != null
a02d27da17ca Datacage: Macros are indexed, so there is no need to linear scan all template nodes to find them.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6096
diff changeset
1030 ? macro.getChildNodes()
a02d27da17ca Datacage: Macros are indexed, so there is no need to linear scan all template nodes to find them.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6096
diff changeset
1031 : null;
4896
27d58b7b5edd Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4893
diff changeset
1032 }
27d58b7b5edd Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4893
diff changeset
1033
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1034 protected void ifClause(Node parent, Element current)
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1035 throws SQLException
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1036 {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1037 String test = current.getAttribute("test");
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1038
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1039 if (test.length() == 0) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1040 log.warn("missing 'test' attribute in 'if'");
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1041 return;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1042 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1043
4737
718adea968e2 Add <dc:variable name="variable" expr="xpath"/> construct to datacage language.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4614
diff changeset
1044 Boolean result = evaluateXPathToBoolean(test);
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1045
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1046 if (result != null && result.booleanValue()) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1047 NodeList subs = current.getChildNodes();
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1048 for (int i = 0, N = subs.getLength(); i < N; ++i) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1049 build(parent, subs.item(i));
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1050 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1051 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1052 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1053
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1054 protected void choose(Node parent, Element current)
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1055 throws SQLException
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1056 {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1057 Node branch = null;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1058
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1059 NodeList children = current.getChildNodes();
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1060 for (int i = 0, N = children.getLength(); i < N; ++i) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1061 Node child = children.item(i);
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1062 String ns = child.getNamespaceURI();
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1063 if (ns == null
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1064 || !ns.equals(DC_NAMESPACE_URI)
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1065 || child.getNodeType() != Node.ELEMENT_NODE
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1066 ) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1067 continue;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1068 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1069 String name = child.getLocalName();
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1070 if ("when".equals(name)) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1071 Element when = (Element)child;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1072 String test = when.getAttribute("test");
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1073 if (test.length() == 0) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1074 log.warn("no 'test' attribute found for when");
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1075 continue;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1076 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1077
4737
718adea968e2 Add <dc:variable name="variable" expr="xpath"/> construct to datacage language.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4614
diff changeset
1078 Boolean result = evaluateXPathToBoolean(test);
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1079 if (result != null && result.booleanValue()) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1080 branch = child;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1081 break;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1082 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1083
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1084 continue;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1085 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1086 else if ("otherwise".equals(name)) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1087 branch = child;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1088 // No break here.
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1089 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1090 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1091
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1092 if (branch != null) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1093 NodeList subs = branch.getChildNodes();
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1094 for (int i = 0, N = subs.getLength(); i < N; ++i) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1095 build(parent, subs.item(i));
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1096 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1097 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1098 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1099
5449
504a62887217 Datacage: Compile XPath expressions and reuse them. With the introduction of filters in dc:elements XPath expressions are evalutated very often so compiling them should reduce the overhead significantly.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5443
diff changeset
1100 protected XPathExpression getXPathExpression(String expr)
504a62887217 Datacage: Compile XPath expressions and reuse them. With the introduction of filters in dc:elements XPath expressions are evalutated very often so compiling them should reduce the overhead significantly.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5443
diff changeset
1101 throws XPathExpressionException
504a62887217 Datacage: Compile XPath expressions and reuse them. With the introduction of filters in dc:elements XPath expressions are evalutated very often so compiling them should reduce the overhead significantly.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5443
diff changeset
1102 {
504a62887217 Datacage: Compile XPath expressions and reuse them. With the introduction of filters in dc:elements XPath expressions are evalutated very often so compiling them should reduce the overhead significantly.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5443
diff changeset
1103 XPathExpression x = expressions.get(expr);
504a62887217 Datacage: Compile XPath expressions and reuse them. With the introduction of filters in dc:elements XPath expressions are evalutated very often so compiling them should reduce the overhead significantly.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5443
diff changeset
1104 if (x == null) {
504a62887217 Datacage: Compile XPath expressions and reuse them. With the introduction of filters in dc:elements XPath expressions are evalutated very often so compiling them should reduce the overhead significantly.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5443
diff changeset
1105 XPath xpath = XPATH_FACTORY.newXPath();
504a62887217 Datacage: Compile XPath expressions and reuse them. With the introduction of filters in dc:elements XPath expressions are evalutated very often so compiling them should reduce the overhead significantly.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5443
diff changeset
1106 xpath.setXPathVariableResolver(frames);
504a62887217 Datacage: Compile XPath expressions and reuse them. With the introduction of filters in dc:elements XPath expressions are evalutated very often so compiling them should reduce the overhead significantly.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5443
diff changeset
1107 xpath.setXPathFunctionResolver(functionResolver);
504a62887217 Datacage: Compile XPath expressions and reuse them. With the introduction of filters in dc:elements XPath expressions are evalutated very often so compiling them should reduce the overhead significantly.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5443
diff changeset
1108 x = xpath.compile(expr);
504a62887217 Datacage: Compile XPath expressions and reuse them. With the introduction of filters in dc:elements XPath expressions are evalutated very often so compiling them should reduce the overhead significantly.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5443
diff changeset
1109 expressions.put(expr, x);
504a62887217 Datacage: Compile XPath expressions and reuse them. With the introduction of filters in dc:elements XPath expressions are evalutated very often so compiling them should reduce the overhead significantly.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5443
diff changeset
1110 }
504a62887217 Datacage: Compile XPath expressions and reuse them. With the introduction of filters in dc:elements XPath expressions are evalutated very often so compiling them should reduce the overhead significantly.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5443
diff changeset
1111 return x;
504a62887217 Datacage: Compile XPath expressions and reuse them. With the introduction of filters in dc:elements XPath expressions are evalutated very often so compiling them should reduce the overhead significantly.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5443
diff changeset
1112 }
504a62887217 Datacage: Compile XPath expressions and reuse them. With the introduction of filters in dc:elements XPath expressions are evalutated very often so compiling them should reduce the overhead significantly.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5443
diff changeset
1113
4740
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
1114 protected Object evaluateXPath(String expr, QName returnType) {
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1115
7235
03201eaf594f Silence overly spammy debug output
Andre Heinecke <aheinecke@intevation.de>
parents: 6455
diff changeset
1116 /*
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1117 if (log.isDebugEnabled()) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1118 log.debug("evaluate: '" + expr + "'");
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1119 }
7235
03201eaf594f Silence overly spammy debug output
Andre Heinecke <aheinecke@intevation.de>
parents: 6455
diff changeset
1120 */
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1121
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1122 try {
5449
504a62887217 Datacage: Compile XPath expressions and reuse them. With the introduction of filters in dc:elements XPath expressions are evalutated very often so compiling them should reduce the overhead significantly.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5443
diff changeset
1123 XPathExpression x = getXPathExpression(expr);
504a62887217 Datacage: Compile XPath expressions and reuse them. With the introduction of filters in dc:elements XPath expressions are evalutated very often so compiling them should reduce the overhead significantly.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5443
diff changeset
1124 return x.evaluate(EVAL_DOCUMENT, returnType);
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1125 }
4740
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
1126 catch (XPathExpressionException xpee) {
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
1127 log.error("expression: " + expr, xpee);
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1128 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1129 return null;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1130 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1131
4737
718adea968e2 Add <dc:variable name="variable" expr="xpath"/> construct to datacage language.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4614
diff changeset
1132 protected Boolean evaluateXPathToBoolean(String expr) {
718adea968e2 Add <dc:variable name="variable" expr="xpath"/> construct to datacage language.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4614
diff changeset
1133
4740
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
1134 Object result = evaluateXPath(expr, XPathConstants.BOOLEAN);
4737
718adea968e2 Add <dc:variable name="variable" expr="xpath"/> construct to datacage language.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4614
diff changeset
1135
718adea968e2 Add <dc:variable name="variable" expr="xpath"/> construct to datacage language.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4614
diff changeset
1136 return result instanceof Boolean
718adea968e2 Add <dc:variable name="variable" expr="xpath"/> construct to datacage language.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4614
diff changeset
1137 ? (Boolean)result
718adea968e2 Add <dc:variable name="variable" expr="xpath"/> construct to datacage language.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4614
diff changeset
1138 : null;
718adea968e2 Add <dc:variable name="variable" expr="xpath"/> construct to datacage language.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4614
diff changeset
1139 }
718adea968e2 Add <dc:variable name="variable" expr="xpath"/> construct to datacage language.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4614
diff changeset
1140
718adea968e2 Add <dc:variable name="variable" expr="xpath"/> construct to datacage language.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4614
diff changeset
1141 protected void convert(Element current) {
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1142
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1143 String variable = expand(current.getAttribute("var"));
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1144 String type = expand(current.getAttribute("type"));
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1145
1716
3ca999f507b7 flys/issue314: Variables in datacage are now case insensitive.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1029
diff changeset
1146 Object [] result = new Object[1];
3ca999f507b7 flys/issue314: Variables in datacage are now case insensitive.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1029
diff changeset
1147
3ca999f507b7 flys/issue314: Variables in datacage are now case insensitive.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1029
diff changeset
1148 if (frames.getStore(variable, result)) {
3ca999f507b7 flys/issue314: Variables in datacage are now case insensitive.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1029
diff changeset
1149 Object object = TypeConverter.convert(result[0], type);
3ca999f507b7 flys/issue314: Variables in datacage are now case insensitive.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1029
diff changeset
1150 frames.put(variable.toUpperCase(), object);
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1151 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1152 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1153
4740
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
1154
4891
089bc08f720e Builder: Doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4890
diff changeset
1155 /** Put <dc:variable> content as variable on stackframes. */
4737
718adea968e2 Add <dc:variable name="variable" expr="xpath"/> construct to datacage language.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4614
diff changeset
1156 protected void variable(Element current) {
718adea968e2 Add <dc:variable name="variable" expr="xpath"/> construct to datacage language.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4614
diff changeset
1157
718adea968e2 Add <dc:variable name="variable" expr="xpath"/> construct to datacage language.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4614
diff changeset
1158 String varName = expand(current.getAttribute("name"));
718adea968e2 Add <dc:variable name="variable" expr="xpath"/> construct to datacage language.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4614
diff changeset
1159 String expr = current.getAttribute("expr");
4740
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
1160 String type = current.getAttribute("type");
4737
718adea968e2 Add <dc:variable name="variable" expr="xpath"/> construct to datacage language.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4614
diff changeset
1161
718adea968e2 Add <dc:variable name="variable" expr="xpath"/> construct to datacage language.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4614
diff changeset
1162 if (varName.length() == 0 || expr.length() == 0) {
718adea968e2 Add <dc:variable name="variable" expr="xpath"/> construct to datacage language.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4614
diff changeset
1163 log.error("dc:variable 'name' or 'expr' empty.");
718adea968e2 Add <dc:variable name="variable" expr="xpath"/> construct to datacage language.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4614
diff changeset
1164 }
718adea968e2 Add <dc:variable name="variable" expr="xpath"/> construct to datacage language.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4614
diff changeset
1165 else {
4740
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
1166 frames.put(
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
1167 varName.toUpperCase(),
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
1168 evaluateXPath(expr, typeToQName(type)));
4737
718adea968e2 Add <dc:variable name="variable" expr="xpath"/> construct to datacage language.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4614
diff changeset
1169 }
718adea968e2 Add <dc:variable name="variable" expr="xpath"/> construct to datacage language.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4614
diff changeset
1170 }
718adea968e2 Add <dc:variable name="variable" expr="xpath"/> construct to datacage language.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4614
diff changeset
1171
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1172 protected String expand(String s) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1173 Matcher m = CompiledStatement.VAR.matcher(s);
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1174
1716
3ca999f507b7 flys/issue314: Variables in datacage are now case insensitive.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1029
diff changeset
1175 Object [] result = new Object[1];
3ca999f507b7 flys/issue314: Variables in datacage are now case insensitive.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1029
diff changeset
1176
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1177 StringBuffer sb = new StringBuffer();
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1178 while (m.find()) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1179 String key = m.group(1);
1716
3ca999f507b7 flys/issue314: Variables in datacage are now case insensitive.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1029
diff changeset
1180 result[0] = null;
3ca999f507b7 flys/issue314: Variables in datacage are now case insensitive.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1029
diff changeset
1181 if (frames.getStore(key, result)) {
3ca999f507b7 flys/issue314: Variables in datacage are now case insensitive.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1029
diff changeset
1182 m.appendReplacement(
8143
7021753b3797 Datacage: Insert variable values literally into output.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7960
diff changeset
1183 sb,
8491
7bc675e4e6e0 Remove trailing whitespace.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 8143
diff changeset
1184 result[0] != null
8143
7021753b3797 Datacage: Insert variable values literally into output.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7960
diff changeset
1185 ? Matcher.quoteReplacement(result[0].toString())
7021753b3797 Datacage: Insert variable values literally into output.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7960
diff changeset
1186 : "");
1716
3ca999f507b7 flys/issue314: Variables in datacage are now case insensitive.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1029
diff changeset
1187 }
3ca999f507b7 flys/issue314: Variables in datacage are now case insensitive.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1029
diff changeset
1188 else {
3ca999f507b7 flys/issue314: Variables in datacage are now case insensitive.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1029
diff changeset
1189 m.appendReplacement(sb, "\\${" + key + "}");
3ca999f507b7 flys/issue314: Variables in datacage are now case insensitive.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1029
diff changeset
1190 }
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1191 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1192 m.appendTail(sb);
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1193 return sb.toString();
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1194 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1195
6080
4bd8bbbcdf68 Datacage: Introduced dc:dump-variables() and modified dc:message to use XPath expansion.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6077
diff changeset
1196 protected String expandXPathValue(String value) {
4bd8bbbcdf68 Datacage: Introduced dc:dump-variables() and modified dc:message to use XPath expansion.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6077
diff changeset
1197 StringBuffer sb = new StringBuffer();
4bd8bbbcdf68 Datacage: Introduced dc:dump-variables() and modified dc:message to use XPath expansion.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6077
diff changeset
1198 Matcher m = BRACKET_XPATH.matcher(value);
4bd8bbbcdf68 Datacage: Introduced dc:dump-variables() and modified dc:message to use XPath expansion.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6077
diff changeset
1199 while (m.find()) {
4bd8bbbcdf68 Datacage: Introduced dc:dump-variables() and modified dc:message to use XPath expansion.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6077
diff changeset
1200 String expr = m.group(1);
4bd8bbbcdf68 Datacage: Introduced dc:dump-variables() and modified dc:message to use XPath expansion.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6077
diff changeset
1201 Object result = evaluateXPath(expr, XPathConstants.STRING);
4bd8bbbcdf68 Datacage: Introduced dc:dump-variables() and modified dc:message to use XPath expansion.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6077
diff changeset
1202 if (result instanceof String) {
8143
7021753b3797 Datacage: Insert variable values literally into output.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7960
diff changeset
1203 m.appendReplacement(
7021753b3797 Datacage: Insert variable values literally into output.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7960
diff changeset
1204 sb,
7021753b3797 Datacage: Insert variable values literally into output.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7960
diff changeset
1205 Matcher.quoteReplacement((String)result));
6080
4bd8bbbcdf68 Datacage: Introduced dc:dump-variables() and modified dc:message to use XPath expansion.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6077
diff changeset
1206 }
4bd8bbbcdf68 Datacage: Introduced dc:dump-variables() and modified dc:message to use XPath expansion.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6077
diff changeset
1207 else {
4bd8bbbcdf68 Datacage: Introduced dc:dump-variables() and modified dc:message to use XPath expansion.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6077
diff changeset
1208 m.appendReplacement(sb, "");
4bd8bbbcdf68 Datacage: Introduced dc:dump-variables() and modified dc:message to use XPath expansion.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6077
diff changeset
1209 }
4bd8bbbcdf68 Datacage: Introduced dc:dump-variables() and modified dc:message to use XPath expansion.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6077
diff changeset
1210 }
4bd8bbbcdf68 Datacage: Introduced dc:dump-variables() and modified dc:message to use XPath expansion.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6077
diff changeset
1211 m.appendTail(sb);
4bd8bbbcdf68 Datacage: Introduced dc:dump-variables() and modified dc:message to use XPath expansion.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6077
diff changeset
1212 return sb.toString();
4bd8bbbcdf68 Datacage: Introduced dc:dump-variables() and modified dc:message to use XPath expansion.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6077
diff changeset
1213 }
4bd8bbbcdf68 Datacage: Introduced dc:dump-variables() and modified dc:message to use XPath expansion.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6077
diff changeset
1214
5485
3b5e1535a459 Datacage: Experimental support for '{XPath}' expressions in attributes similiar to XSLT. Using this feature you can shorten the written template a lot because it reduces the necessity to create dynamic attributes with <dc:attribute>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5449
diff changeset
1215 protected void evaluateAttributeValue(Attr attr) {
3b5e1535a459 Datacage: Experimental support for '{XPath}' expressions in attributes similiar to XSLT. Using this feature you can shorten the written template a lot because it reduces the necessity to create dynamic attributes with <dc:attribute>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5449
diff changeset
1216 String value = attr.getValue();
6080
4bd8bbbcdf68 Datacage: Introduced dc:dump-variables() and modified dc:message to use XPath expansion.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6077
diff changeset
1217 if (value.indexOf('{') >= 0) { // Performance tweak
4bd8bbbcdf68 Datacage: Introduced dc:dump-variables() and modified dc:message to use XPath expansion.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6077
diff changeset
1218 attr.setValue(expandXPathValue(value));
5485
3b5e1535a459 Datacage: Experimental support for '{XPath}' expressions in attributes similiar to XSLT. Using this feature you can shorten the written template a lot because it reduces the necessity to create dynamic attributes with <dc:attribute>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5449
diff changeset
1219 }
3b5e1535a459 Datacage: Experimental support for '{XPath}' expressions in attributes similiar to XSLT. Using this feature you can shorten the written template a lot because it reduces the necessity to create dynamic attributes with <dc:attribute>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5449
diff changeset
1220 }
3b5e1535a459 Datacage: Experimental support for '{XPath}' expressions in attributes similiar to XSLT. Using this feature you can shorten the written template a lot because it reduces the necessity to create dynamic attributes with <dc:attribute>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5449
diff changeset
1221
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1222 protected void build(Node parent, Node current)
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1223 throws SQLException
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1224 {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1225 String ns = current.getNamespaceURI();
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1226 if (ns != null && ns.equals(DC_NAMESPACE_URI)) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1227 if (current.getNodeType() != Node.ELEMENT_NODE) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1228 log.warn("need elements here");
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1229 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1230 else {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1231 String localName = current.getLocalName();
5517
5800a9497b0b Fix syntax error in builder.
Andre Heinecke <aheinecke@intevation.de>
parents: 5509
diff changeset
1232 Element curr = (Element)current;
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1233 if ("attribute".equals(localName)) {
5509
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
1234 attribute(parent, curr);
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1235 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1236 else if ("context".equals(localName)) {
5509
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
1237 context(parent, curr);
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1238 }
6399
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
1239 else if ("container-context".equals(localName)) {
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
1240 containerContext(parent, curr);
10fe6758dfb0 Datacage: Introduced <dc:container-context>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6097
diff changeset
1241 }
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1242 else if ("if".equals(localName)) {
5509
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
1243 ifClause(parent, curr);
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1244 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1245 else if ("choose".equals(localName)) {
5509
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
1246 choose(parent, curr);
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1247 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1248 else if ("call-macro".equals(localName)) {
5509
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
1249 callMacro(parent, curr);
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1250 }
4890
bf38ea4cb0f7 Added bodies to macros. Use the bodies of <dc:call-macro><body></dc:call-macro> as <dc:macro-body/> in tthe macro. Example:
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4740
diff changeset
1251 else if ("macro-body".equals(localName)) {
5509
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
1252 macroBody(parent, curr);
4890
bf38ea4cb0f7 Added bodies to macros. Use the bodies of <dc:call-macro><body></dc:call-macro> as <dc:macro-body/> in tthe macro. Example:
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4740
diff changeset
1253 }
5509
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
1254 else if ("macro".equals(localName)
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
1255 || "comment".equals(localName)
6455
201d90f56d98 Fixed container context variables: to upper case.
Raimund Renkert <rrenkert@intevation.de>
parents: 6402
diff changeset
1256 || "statement".equals(localName)
201d90f56d98 Fixed container context variables: to upper case.
Raimund Renkert <rrenkert@intevation.de>
parents: 6402
diff changeset
1257 || "properties".equals(localName)) {
5509
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
1258 // Simply ignore them.
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1259 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1260 else if ("element".equals(localName)) {
5509
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
1261 element(parent, curr);
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1262 }
5522
eeac800eb4cd Datacage: Rename <dc:elements> to <dc:for-each>. We should have done this much earlier.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5517
diff changeset
1263 else if ("for-each".equals(localName)) {
eeac800eb4cd Datacage: Rename <dc:elements> to <dc:for-each>. We should have done this much earlier.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5517
diff changeset
1264 foreach(parent, curr);
5509
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
1265 }
5974
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
1266 else if ("iterate".equals(localName)) {
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
1267 iterate(parent, curr);
95cb104a871b Add dc:iterate function
Andre Heinecke <aheinecke@intevation.de>
parents: 5892
diff changeset
1268 }
5509
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
1269 else if ("filter".equals(localName)) {
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
1270 filter(parent, curr);
1023
5cb84ceee2a0 Datacage: Templates now can nest <dc:elements> into other elements in the body of <dc:context>
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
1271 }
5890
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
1272 else if ("group".equals(localName)) {
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
1273 group(parent, curr);
6ea004d51203 Datacage: Introduced <dc:group epxr="xpath" type="type"> ... </dc:group> and XPath function dc:group-key().
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5887
diff changeset
1274 }
7669
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
1275 else if ("sort".equals(localName)) {
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
1276 sort(parent, curr);
f1abd257f933 Datacage: Added <dc:sort>
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7573
diff changeset
1277 }
6087
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
1278 else if ("virtual-column".equals(localName)) {
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
1279 virtualColumn(parent, curr);
47775e3a8cf6 Datacage: Introduced <dc:virtual-column name="colname" type="type" expr="XPath">
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6080
diff changeset
1280 }
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1281 else if ("text".equals(localName)) {
5509
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
1282 text(parent, curr);
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1283 }
6077
c7777feea223 Datacage: Introduced <dc:message>This is my message!</dc:message>. The message are logged at INFO level to help debugging.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6050
diff changeset
1284 else if ("message".equals(localName)) {
c7777feea223 Datacage: Introduced <dc:message>This is my message!</dc:message>. The message are logged at INFO level to help debugging.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6050
diff changeset
1285 message(parent, curr);
c7777feea223 Datacage: Introduced <dc:message>This is my message!</dc:message>. The message are logged at INFO level to help debugging.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6050
diff changeset
1286 }
4737
718adea968e2 Add <dc:variable name="variable" expr="xpath"/> construct to datacage language.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4614
diff changeset
1287 else if ("variable".equals(localName)) {
5509
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
1288 variable(curr);
1017
8637756275e5 Added a <dc:comment> tag to place comments in the meta data templates.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1015
diff changeset
1289 }
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1290 else if ("convert".equals(localName)) {
5509
627584bc0586 Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5494
diff changeset
1291 convert(curr);
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1292 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1293 else {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1294 log.warn("unknown '" + localName + "' -> ignore");
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1295 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1296 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1297 return;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1298 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1299
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1300 if (current.getNodeType() == Node.TEXT_NODE) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1301 String txt = current.getNodeValue();
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1302 if (txt != null && txt.trim().length() == 0) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1303 return;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1304 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1305 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1306
4353
daf0919df76d Ignore comments in meta data xml template
Björn Ricks <bjoern.ricks@intevation.de>
parents: 4051
diff changeset
1307 if (current.getNodeType() == Node.COMMENT_NODE) {
daf0919df76d Ignore comments in meta data xml template
Björn Ricks <bjoern.ricks@intevation.de>
parents: 4051
diff changeset
1308 // Ignore XML comments
daf0919df76d Ignore comments in meta data xml template
Björn Ricks <bjoern.ricks@intevation.de>
parents: 4051
diff changeset
1309 return;
daf0919df76d Ignore comments in meta data xml template
Björn Ricks <bjoern.ricks@intevation.de>
parents: 4051
diff changeset
1310 }
daf0919df76d Ignore comments in meta data xml template
Björn Ricks <bjoern.ricks@intevation.de>
parents: 4051
diff changeset
1311
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1312 Node copy = owner.importNode(current, false);
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1313
5494
773899d00234 Fix new attribute evaluation
Andre Heinecke <aheinecke@intevation.de>
parents: 5485
diff changeset
1314 NodeList children = current.getChildNodes();
773899d00234 Fix new attribute evaluation
Andre Heinecke <aheinecke@intevation.de>
parents: 5485
diff changeset
1315 for (int i = 0, N = children.getLength(); i < N; ++i) {
773899d00234 Fix new attribute evaluation
Andre Heinecke <aheinecke@intevation.de>
parents: 5485
diff changeset
1316 build(copy, children.item(i));
5485
3b5e1535a459 Datacage: Experimental support for '{XPath}' expressions in attributes similiar to XSLT. Using this feature you can shorten the written template a lot because it reduces the necessity to create dynamic attributes with <dc:attribute>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5449
diff changeset
1317 }
5494
773899d00234 Fix new attribute evaluation
Andre Heinecke <aheinecke@intevation.de>
parents: 5485
diff changeset
1318 if (copy.getNodeType() == Node.ELEMENT_NODE) {
773899d00234 Fix new attribute evaluation
Andre Heinecke <aheinecke@intevation.de>
parents: 5485
diff changeset
1319 NamedNodeMap nnm = ((Element)copy).getAttributes();
773899d00234 Fix new attribute evaluation
Andre Heinecke <aheinecke@intevation.de>
parents: 5485
diff changeset
1320 for (int i = 0, N = nnm.getLength(); i < N; ++i) {
773899d00234 Fix new attribute evaluation
Andre Heinecke <aheinecke@intevation.de>
parents: 5485
diff changeset
1321 Node n = nnm.item(i);
773899d00234 Fix new attribute evaluation
Andre Heinecke <aheinecke@intevation.de>
parents: 5485
diff changeset
1322 if (n.getNodeType() == Node.ATTRIBUTE_NODE) {
773899d00234 Fix new attribute evaluation
Andre Heinecke <aheinecke@intevation.de>
parents: 5485
diff changeset
1323 evaluateAttributeValue((Attr)n);
773899d00234 Fix new attribute evaluation
Andre Heinecke <aheinecke@intevation.de>
parents: 5485
diff changeset
1324 }
5485
3b5e1535a459 Datacage: Experimental support for '{XPath}' expressions in attributes similiar to XSLT. Using this feature you can shorten the written template a lot because it reduces the necessity to create dynamic attributes with <dc:attribute>.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5449
diff changeset
1325 }
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1326 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1327 parent.appendChild(copy);
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1328 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1329 } // class BuildHelper
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1330
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1331
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1332 public Builder() {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1333 compiledStatements = new HashMap<String, CompiledStatement>();
5443
3d7e552cc396 Datacage: Index macros with a map. Reduces excessive linear scanning for macros when calling them.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5442
diff changeset
1334 macros = new HashMap<String, Element>();
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1335 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1336
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1337 public Builder(Document template) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1338 this();
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1339 this.template = template;
5443
3d7e552cc396 Datacage: Index macros with a map. Reduces excessive linear scanning for macros when calling them.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5442
diff changeset
1340 extractMacros();
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1341 compileStatements();
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1342 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1343
4740
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
1344 protected static QName typeToQName(String type) {
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
1345 if ("number" .equals(type)) return XPathConstants.NUMBER;
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
1346 if ("bool" .equals(type)) return XPathConstants.BOOLEAN;
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
1347 if ("node" .equals(type)) return XPathConstants.NODE;
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
1348 if ("nodeset".equals(type)) return XPathConstants.NODESET;
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
1349 return XPathConstants.STRING;
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
1350 }
fb135e1dfa35 Added 'type' attribute to <dc:variable/> element. If an optional 'type' attribute is given
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4737
diff changeset
1351
4614
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4526
diff changeset
1352 /** Handle <dc:statement> elements. */
8959
175f113ed939 Do not silently eat exceptions!
gernotbelger
parents: 8856
diff changeset
1353 // FIXME: this prohibits using local variables inside of statements!
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1354 protected void compileStatements() {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1355
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1356 NodeList nodes = template.getElementsByTagNameNS(
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1357 DC_NAMESPACE_URI, "statement");
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1358
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1359 for (int i = 0, N = nodes.getLength(); i < N; ++i) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1360 Element stmntElement = (Element)nodes.item(i);
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1361 String stmnt = trimStatement(stmntElement.getTextContent());
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1362 if (stmnt == null || stmnt.length() == 0) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1363 throw new IllegalArgumentException("found empty statement");
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1364 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1365 CompiledStatement cs = new CompiledStatement(stmnt);
1029
3f3988bb6284 Picky Cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1023
diff changeset
1366 // For faster lookup store a shortend string into the template.
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1367 stmnt = "s" + i;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1368 stmntElement.setTextContent(stmnt);
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1369 compiledStatements.put(stmnt, cs);
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1370 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1371 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1372
5443
3d7e552cc396 Datacage: Index macros with a map. Reduces excessive linear scanning for macros when calling them.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5442
diff changeset
1373 protected void extractMacros() {
3d7e552cc396 Datacage: Index macros with a map. Reduces excessive linear scanning for macros when calling them.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5442
diff changeset
1374 NodeList ms = template.getElementsByTagNameNS(
3d7e552cc396 Datacage: Index macros with a map. Reduces excessive linear scanning for macros when calling them.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5442
diff changeset
1375 DC_NAMESPACE_URI, "macro");
3d7e552cc396 Datacage: Index macros with a map. Reduces excessive linear scanning for macros when calling them.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5442
diff changeset
1376
3d7e552cc396 Datacage: Index macros with a map. Reduces excessive linear scanning for macros when calling them.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5442
diff changeset
1377 for (int i = 0, N = ms.getLength(); i < N; ++i) {
3d7e552cc396 Datacage: Index macros with a map. Reduces excessive linear scanning for macros when calling them.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5442
diff changeset
1378 Element m = (Element)ms.item(i);
3d7e552cc396 Datacage: Index macros with a map. Reduces excessive linear scanning for macros when calling them.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5442
diff changeset
1379 macros.put(m.getAttribute("name"), m);
3d7e552cc396 Datacage: Index macros with a map. Reduces excessive linear scanning for macros when calling them.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5442
diff changeset
1380 }
3d7e552cc396 Datacage: Index macros with a map. Reduces excessive linear scanning for macros when calling them.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5442
diff changeset
1381 }
3d7e552cc396 Datacage: Index macros with a map. Reduces excessive linear scanning for macros when calling them.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5442
diff changeset
1382
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1383 protected List<Node> rootsToList() {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1384
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1385 NodeList roots = template.getElementsByTagNameNS(
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1386 DC_NAMESPACE_URI, "template");
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1387
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1388 List<Node> elements = new ArrayList<Node>();
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1389
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1390 for (int i = 0, N = roots.getLength(); i < N; ++i) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1391 NodeList rootChildren = roots.item(i).getChildNodes();
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1392 for (int j = 0, M = rootChildren.getLength(); j < M; ++j) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1393 Node child = rootChildren.item(j);
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1394 if (child.getNodeType() == Node.ELEMENT_NODE) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1395 elements.add(child);
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1396 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1397 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1398 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1399
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1400 return elements;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1401 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1402
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1403 protected static final String trimStatement(String stmnt) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1404 if (stmnt == null) return null;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1405 //XXX: Maybe a bit to radical for multiline strings?
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1406 return STRIP_LINE_INDENT.matcher(stmnt.trim()).replaceAll(" ");
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1407 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1408
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1409 protected static Document getOwnerDocument(Node node) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1410 Document document = node.getOwnerDocument();
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1411 return document != null ? document : (Document)node;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1412 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1413
9232
5030c46d8cb4 Implemented xpath function that selectes the 'mean year' of a fixation-artifact.
gernotbelger
parents: 8959
diff changeset
1414 public void build( final List<NamedConnection> connections, final Node output, final Map<String, Object> parameters, final CallContext context ) throws SQLException
1011
aca3b46160cb Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
1415 {
5887
88fca576e9e6 Datacage: Added some time meassuremnt for templating.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5863
diff changeset
1416 long startTime = System.currentTimeMillis();
88fca576e9e6 Datacage: Added some time meassuremnt for templating.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5863
diff changeset
1417 try {
9232
5030c46d8cb4 Implemented xpath function that selectes the 'mean year' of a fixation-artifact.
gernotbelger
parents: 8959
diff changeset
1418 BuildHelper helper = new BuildHelper(output, connections, parameters, context);
5887
88fca576e9e6 Datacage: Added some time meassuremnt for templating.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5863
diff changeset
1419 helper.build();
88fca576e9e6 Datacage: Added some time meassuremnt for templating.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5863
diff changeset
1420 }
88fca576e9e6 Datacage: Added some time meassuremnt for templating.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5863
diff changeset
1421 finally {
88fca576e9e6 Datacage: Added some time meassuremnt for templating.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5863
diff changeset
1422 if (log.isDebugEnabled()) {
88fca576e9e6 Datacage: Added some time meassuremnt for templating.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5863
diff changeset
1423 long stopTime = System.currentTimeMillis();
88fca576e9e6 Datacage: Added some time meassuremnt for templating.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5863
diff changeset
1424 log.debug("Building the datacage result took " +
88fca576e9e6 Datacage: Added some time meassuremnt for templating.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5863
diff changeset
1425 (stopTime-startTime)/1000f + " secs.");
88fca576e9e6 Datacage: Added some time meassuremnt for templating.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5863
diff changeset
1426 }
88fca576e9e6 Datacage: Added some time meassuremnt for templating.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5863
diff changeset
1427 }
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1428 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1429 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1430 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org