Mercurial > dive4elements > river
annotate flys-artifacts/src/main/java/de/intevation/flys/artifacts/datacage/templating/Builder.java @ 5779:ebec12def170
Datacage: Add a pool of builders to make it multi threadable.
XML DOM is not thread safe. Therefore the old implementation only allowed one thread
to use the builder at a time. As the complexity of the configuration
has increased over time this has become a bottleneck of the whole application
because it took quiet some time to build a result. Furthermore the builder code path
is visited very frequent. So many concurrent requests were piled up
resulting in long waits for the users.
To mitigate this problem a round robin pool of builders is used now.
Each of the pooled builders has an independent copy of the XML template
and can be run in parallel.
The number of builders is determined by the system property
'flys.datacage.pool.size'. It defaults to 4.
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Sun, 21 Apr 2013 12:48:09 +0200 |
parents | 55529f586962 |
children |
rev | line source |
---|---|
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
1 package de.intevation.flys.artifacts.datacage.templating; |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
2 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
3 import de.intevation.artifacts.common.utils.XMLUtils; |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
4 |
1818
e3eb1ea885a7
Simplified code in Datacage builder by using the new pair.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1716
diff
changeset
|
5 import de.intevation.flys.utils.Pair; |
e3eb1ea885a7
Simplified code in Datacage builder by using the new pair.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1716
diff
changeset
|
6 |
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
|
7 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
|
8 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
|
9 |
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
|
10 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
|
11 import java.util.ArrayList; |
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
|
12 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
|
13 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
|
14 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
|
15 import java.util.Map; |
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
|
16 |
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
|
17 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
|
18 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
|
19 |
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 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
|
21 |
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 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
|
23 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
|
24 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
|
25 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
|
26 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
|
27 |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
28 import org.apache.log4j.Logger; |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
29 |
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
|
30 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
|
31 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
|
32 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
|
33 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
|
34 import org.w3c.dom.NodeList; |
5494
773899d00234
Fix new attribute evaluation
Andre Heinecke <aheinecke@intevation.de>
parents:
5485
diff
changeset
|
35 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
|
36 |
4526
1f38fa929986
Cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4353
diff
changeset
|
37 |
4897
9c388de4b4d5
Builder: Doc, comments.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4896
diff
changeset
|
38 /** 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
|
39 public class Builder |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
40 { |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
41 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
|
42 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
43 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
|
44 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
|
45 |
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
|
46 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
|
47 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
|
48 |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
49 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
|
50 "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
|
51 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
52 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
|
53 XMLUtils.newDocument(); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
54 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
55 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
|
56 XPathFactory.newInstance(); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
57 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
58 protected Document template; |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
59 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
60 protected Map<String, CompiledStatement> compiledStatements; |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
61 |
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
|
62 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
|
63 |
4526
1f38fa929986
Cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4353
diff
changeset
|
64 /** 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
|
65 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
|
66 |
aca3b46160cb
Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
998
diff
changeset
|
67 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
|
68 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
|
69 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
|
70 |
aca3b46160cb
Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
998
diff
changeset
|
71 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
|
72 } |
aca3b46160cb
Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
998
diff
changeset
|
73 |
aca3b46160cb
Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
998
diff
changeset
|
74 public NamedConnection( |
3076
5642a83420f2
FLYS artifacts: Removed trailing whitespace.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1890
diff
changeset
|
75 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
|
76 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
|
77 ) { |
aca3b46160cb
Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
998
diff
changeset
|
78 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
|
79 } |
aca3b46160cb
Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
998
diff
changeset
|
80 |
aca3b46160cb
Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
998
diff
changeset
|
81 public NamedConnection( |
3076
5642a83420f2
FLYS artifacts: Removed trailing whitespace.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1890
diff
changeset
|
82 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
|
83 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
|
84 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
|
85 ) { |
aca3b46160cb
Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
998
diff
changeset
|
86 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
|
87 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
|
88 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
|
89 } |
aca3b46160cb
Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
998
diff
changeset
|
90 } // 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
|
91 |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
92 public class BuildHelper |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
93 { |
1818
e3eb1ea885a7
Simplified code in Datacage builder by using the new pair.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1716
diff
changeset
|
94 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
|
95 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
|
96 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
|
97 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
|
98 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
|
99 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
|
100 protected Deque<NodeList> macroBodies; |
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
|
101 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
|
102 protected Map<String, XPathExpression> expressions; |
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
|
103 |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
104 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
105 public BuildHelper( |
1011
aca3b46160cb
Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
998
diff
changeset
|
106 Node output, |
aca3b46160cb
Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
998
diff
changeset
|
107 List<NamedConnection> connections, |
aca3b46160cb
Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
998
diff
changeset
|
108 Map<String, Object> parameters |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
109 ) { |
1011
aca3b46160cb
Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
998
diff
changeset
|
110 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
|
111 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
|
112 } |
aca3b46160cb
Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
998
diff
changeset
|
113 |
aca3b46160cb
Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
998
diff
changeset
|
114 this.connections = connections; |
1818
e3eb1ea885a7
Simplified code in Datacage builder by using the new pair.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1716
diff
changeset
|
115 connectionsStack = |
e3eb1ea885a7
Simplified code in Datacage builder by using the new pair.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1716
diff
changeset
|
116 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
|
117 this.output = output; |
aca3b46160cb
Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
998
diff
changeset
|
118 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
|
119 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
|
120 macroBodies = new ArrayDeque<NodeList>(); |
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
|
121 functionResolver = new FunctionResolver(this); |
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
|
122 expressions = new HashMap<String, XPathExpression>(); |
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
|
123 statements = |
1011
aca3b46160cb
Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
998
diff
changeset
|
124 new HashMap<String, CompiledStatement.Instance>(); |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
125 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
126 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
127 public void build() throws SQLException { |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
128 try { |
5779
ebec12def170
Datacage: Add a pool of builders to make it multi threadable.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5532
diff
changeset
|
129 // 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
|
130 //synchronized (template) { |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
131 for (Node current: rootsToList()) { |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
132 build(output, current); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
133 } |
5779
ebec12def170
Datacage: Add a pool of builders to make it multi threadable.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5532
diff
changeset
|
134 //} |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
135 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
136 finally { |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
137 closeStatements(); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
138 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
139 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
140 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
141 protected void closeStatements() { |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
142 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
|
143 csi.close(); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
144 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
145 statements.clear(); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
146 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
147 |
1890
9144e5a5027b
(Picky) cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
1859
diff
changeset
|
148 /** |
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
|
149 * Return first statement node in NodeList, respecting |
4897
9c388de4b4d5
Builder: Doc, comments.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4896
diff
changeset
|
150 * 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
|
151 */ |
27d58b7b5edd
Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4893
diff
changeset
|
152 private Node findStatementNode(NodeList nodes) { |
27d58b7b5edd
Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4893
diff
changeset
|
153 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
|
154 |
27d58b7b5edd
Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4893
diff
changeset
|
155 // 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
|
156 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
|
157 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
|
158 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
|
159 // 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
|
160 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
|
161 && node.getLocalName().equals("statement") |
27d58b7b5edd
Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4893
diff
changeset
|
162 && (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
|
163 && 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
|
164 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
|
165 } |
27d58b7b5edd
Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4893
diff
changeset
|
166 // 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
|
167 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
|
168 && 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
|
169 && (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
|
170 && 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
|
171 |
27d58b7b5edd
Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4893
diff
changeset
|
172 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
|
173 Node 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
|
174 findStatementNode(getMacroChildren(macroName)); |
27d58b7b5edd
Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4893
diff
changeset
|
175 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
|
176 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
|
177 } |
27d58b7b5edd
Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4893
diff
changeset
|
178 } |
27d58b7b5edd
Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4893
diff
changeset
|
179 |
27d58b7b5edd
Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4893
diff
changeset
|
180 } |
27d58b7b5edd
Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4893
diff
changeset
|
181 |
27d58b7b5edd
Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4893
diff
changeset
|
182 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
|
183 } |
27d58b7b5edd
Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4893
diff
changeset
|
184 |
27d58b7b5edd
Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4893
diff
changeset
|
185 /** |
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
|
186 * Handle a dc:context node. |
1890
9144e5a5027b
(Picky) cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
1859
diff
changeset
|
187 */ |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
188 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
|
189 throws SQLException |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
190 { |
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
|
191 log.debug("dc:context"); |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
192 |
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
|
193 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
|
194 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
|
195 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
|
196 |
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
|
197 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
|
198 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
|
199 return; |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
200 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
201 |
1890
9144e5a5027b
(Picky) cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
1859
diff
changeset
|
202 String stmntText = stmntNode.getTextContent(); |
9144e5a5027b
(Picky) cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
1859
diff
changeset
|
203 |
1011
aca3b46160cb
Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
998
diff
changeset
|
204 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
|
205 |
aca3b46160cb
Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
998
diff
changeset
|
206 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
|
207 |
aca3b46160cb
Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
998
diff
changeset
|
208 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
|
209 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
210 if (csi == null) { |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
211 CompiledStatement cs = compiledStatements.get(stmntText); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
212 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
|
213 statements.put(key, csi); |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
214 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
215 |
1011
aca3b46160cb
Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
998
diff
changeset
|
216 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
|
217 ? 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
|
218 : connectionsStack.peek().getA(); |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
219 |
1011
aca3b46160cb
Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
998
diff
changeset
|
220 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
|
221 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
|
222 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
|
223 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
|
224 break; |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
225 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
226 } |
1011
aca3b46160cb
Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
998
diff
changeset
|
227 } |
aca3b46160cb
Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
998
diff
changeset
|
228 |
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
|
229 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
|
230 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
|
231 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
|
232 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
|
233 |
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
|
234 // 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
|
235 if (!rd.isEmpty()) { |
4051
58bdf95df5e4
More dead code removal. Minor code clean ups.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
3571
diff
changeset
|
236 connectionsStack.push( |
58bdf95df5e4
More dead code removal. Minor code clean ups.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
3571
diff
changeset
|
237 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
|
238 try { |
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
|
239 for (int i = 0; i < S; ++i) { |
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
|
240 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
|
241 } |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
242 } |
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
|
243 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
|
244 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
|
245 } |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
246 } |
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
|
247 } |
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
|
248 |
5433
df32d7518f55
Expose function dc:has-result to Function Resolver.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5432
diff
changeset
|
249 public boolean hasResult() { |
df32d7518f55
Expose function dc:has-result to Function Resolver.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5432
diff
changeset
|
250 return !connectionsStack.isEmpty() |
df32d7518f55
Expose function dc:has-result to Function Resolver.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5432
diff
changeset
|
251 && !connectionsStack.peek().getB().isEmpty(); |
df32d7518f55
Expose function dc:has-result to Function Resolver.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5432
diff
changeset
|
252 } |
5305
e60f65540cc2
Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents:
4897
diff
changeset
|
253 |
e60f65540cc2
Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents:
4897
diff
changeset
|
254 protected ResultData createFilteredResultData(ResultData rd, String filter) { |
e60f65540cc2
Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents:
4897
diff
changeset
|
255 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
|
256 |
e60f65540cc2
Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents:
4897
diff
changeset
|
257 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
|
258 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
|
259 |
e60f65540cc2
Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents:
4897
diff
changeset
|
260 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
|
261 |
e60f65540cc2
Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents:
4897
diff
changeset
|
262 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
|
263 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
|
264 try { |
e60f65540cc2
Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents:
4897
diff
changeset
|
265 frames.put(columns, row); |
e60f65540cc2
Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents:
4897
diff
changeset
|
266 boolean traverse = filter == null; |
e60f65540cc2
Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents:
4897
diff
changeset
|
267 |
e60f65540cc2
Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents:
4897
diff
changeset
|
268 if (!traverse) { |
e60f65540cc2
Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents:
4897
diff
changeset
|
269 Boolean b = evaluateXPathToBoolean(filter); |
e60f65540cc2
Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents:
4897
diff
changeset
|
270 traverse = b != null && b; |
e60f65540cc2
Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents:
4897
diff
changeset
|
271 } |
e60f65540cc2
Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents:
4897
diff
changeset
|
272 if (traverse) { |
e60f65540cc2
Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents:
4897
diff
changeset
|
273 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
|
274 } |
e60f65540cc2
Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents:
4897
diff
changeset
|
275 } |
e60f65540cc2
Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents:
4897
diff
changeset
|
276 finally { |
e60f65540cc2
Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents:
4897
diff
changeset
|
277 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
|
278 } |
e60f65540cc2
Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents:
4897
diff
changeset
|
279 } |
e60f65540cc2
Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents:
4897
diff
changeset
|
280 return new ResultData(rd.getColumnLabels(), filtered); |
e60f65540cc2
Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents:
4897
diff
changeset
|
281 } |
e60f65540cc2
Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents:
4897
diff
changeset
|
282 |
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
|
283 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
|
284 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
|
285 { |
627584bc0586
Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5494
diff
changeset
|
286 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
|
287 |
627584bc0586
Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5494
diff
changeset
|
288 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
|
289 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
|
290 } |
627584bc0586
Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5494
diff
changeset
|
291 |
627584bc0586
Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5494
diff
changeset
|
292 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
|
293 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
|
294 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
|
295 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
|
296 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
|
297 } |
627584bc0586
Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5494
diff
changeset
|
298 |
627584bc0586
Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5494
diff
changeset
|
299 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
|
300 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
|
301 |
627584bc0586
Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5494
diff
changeset
|
302 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
|
303 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
|
304 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
|
305 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
|
306 } |
627584bc0586
Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5494
diff
changeset
|
307 |
627584bc0586
Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5494
diff
changeset
|
308 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
|
309 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
|
310 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
|
311 } |
627584bc0586
Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5494
diff
changeset
|
312 } |
627584bc0586
Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5494
diff
changeset
|
313 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
|
314 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
|
315 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
|
316 } |
627584bc0586
Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5494
diff
changeset
|
317 } |
627584bc0586
Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5494
diff
changeset
|
318 } |
627584bc0586
Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5494
diff
changeset
|
319 |
1890
9144e5a5027b
(Picky) cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
1859
diff
changeset
|
320 /** |
9144e5a5027b
(Picky) cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
1859
diff
changeset
|
321 * Kind of foreach over results of a statement within a context. |
9144e5a5027b
(Picky) cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
1859
diff
changeset
|
322 */ |
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
|
323 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
|
324 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
|
325 { |
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
|
326 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
|
327 |
1818
e3eb1ea885a7
Simplified code in Datacage builder by using the new pair.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1716
diff
changeset
|
328 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
|
329 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
|
330 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
|
331 } |
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
|
332 |
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
|
333 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
|
334 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
|
335 |
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
|
336 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
|
337 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
|
338 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
|
339 } |
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
|
340 |
5305
e60f65540cc2
Added filter to elements in datacage templating. (most work done by Sascha T.).
Raimund Renkert <rrenkert@intevation.de>
parents:
4897
diff
changeset
|
341 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
|
342 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
|
343 |
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
|
344 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
|
345 |
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
|
346 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
|
347 |
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
|
348 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
|
349 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
|
350 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
|
351 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
|
352 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
|
353 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
|
354 } |
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
|
355 } |
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
|
356 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
|
357 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
|
358 } |
1011
aca3b46160cb
Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
998
diff
changeset
|
359 } |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
360 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
361 |
1890
9144e5a5027b
(Picky) cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
1859
diff
changeset
|
362 /** |
9144e5a5027b
(Picky) cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
1859
diff
changeset
|
363 * Create element. |
9144e5a5027b
(Picky) cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
1859
diff
changeset
|
364 */ |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
365 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
|
366 throws SQLException |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
367 { |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
368 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
|
369 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
370 if (log.isDebugEnabled()) { |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
371 log.debug("dc:element -> '" + attr + "'"); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
372 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
373 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
374 if (attr.length() == 0) { |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
375 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
|
376 return; |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
377 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
378 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
379 Element element = owner.createElement(attr); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
380 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
381 NodeList children = current.getChildNodes(); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
382 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
|
383 build(element, children.item(i)); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
384 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
385 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
386 parent.appendChild(element); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
387 } |
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 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
|
390 throws SQLException |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
391 { |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
392 log.debug("dc:text"); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
393 String value = expand(current.getTextContent()); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
394 parent.appendChild(owner.createTextNode(value)); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
395 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
396 |
1890
9144e5a5027b
(Picky) cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
1859
diff
changeset
|
397 /** |
9144e5a5027b
(Picky) cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
1859
diff
changeset
|
398 * Add attribute to an element |
3571
64a59cca1887
Cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
3076
diff
changeset
|
399 * @see Element |
1890
9144e5a5027b
(Picky) cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
1859
diff
changeset
|
400 */ |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
401 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
|
402 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
403 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
|
404 log.warn("need element here"); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
405 return; |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
406 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
407 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
408 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
|
409 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
|
410 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
411 Element element = (Element)parent; |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
412 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
413 element.setAttribute(name, value); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
414 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
415 |
4893
54762b8ef016
Builder: Doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4891
diff
changeset
|
416 /** |
54762b8ef016
Builder: Doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4891
diff
changeset
|
417 * Call-Macro node. |
54762b8ef016
Builder: Doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4891
diff
changeset
|
418 * Evaluate child-nodes of the given macro element (not its text). |
54762b8ef016
Builder: Doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4891
diff
changeset
|
419 */ |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
420 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
|
421 throws SQLException |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
422 { |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
423 String name = current.getAttribute("name"); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
424 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
425 if (name.length() == 0) { |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
426 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
|
427 return; |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
428 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
429 |
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
|
430 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
|
431 |
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
|
432 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
|
433 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
|
434 try { |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
435 NodeList subs = macro.getChildNodes(); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
436 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
|
437 build(parent, subs.item(j)); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
438 } |
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
|
439 } |
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
|
440 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
|
441 macroBodies.pop(); |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
442 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
443 } |
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
|
444 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
|
445 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
|
446 } |
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
|
447 } |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
448 |
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
|
449 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
|
450 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
|
451 { |
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
|
452 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
|
453 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
|
454 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
|
455 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
|
456 } |
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
|
457 } |
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
|
458 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
|
459 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
|
460 } |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
461 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
462 |
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
|
463 /** 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
|
464 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
|
465 NodeList macros = template.getElementsByTagNameNS( |
27d58b7b5edd
Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4893
diff
changeset
|
466 DC_NAMESPACE_URI, "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
|
467 |
27d58b7b5edd
Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4893
diff
changeset
|
468 Element macro = 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
|
469 |
27d58b7b5edd
Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4893
diff
changeset
|
470 for (int i = 0, N = macros.getLength(); i < N; ++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
|
471 Element m = (Element) macros.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
|
472 if (name.equals(m.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
|
473 macro = m; |
27d58b7b5edd
Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4893
diff
changeset
|
474 break; |
27d58b7b5edd
Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4893
diff
changeset
|
475 } |
27d58b7b5edd
Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4893
diff
changeset
|
476 } |
27d58b7b5edd
Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4893
diff
changeset
|
477 |
27d58b7b5edd
Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4893
diff
changeset
|
478 if (macro != 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
|
479 return macro.getChildNodes(); |
27d58b7b5edd
Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4893
diff
changeset
|
480 } |
27d58b7b5edd
Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4893
diff
changeset
|
481 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
|
482 } |
27d58b7b5edd
Builder: When looking for a statement in contexts, also search in macro definitions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4893
diff
changeset
|
483 |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
484 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
|
485 throws SQLException |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
486 { |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
487 String test = current.getAttribute("test"); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
488 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
489 if (test.length() == 0) { |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
490 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
|
491 return; |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
492 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
493 |
4737
718adea968e2
Add <dc:variable name="variable" expr="xpath"/> construct to datacage language.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4614
diff
changeset
|
494 Boolean result = evaluateXPathToBoolean(test); |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
495 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
496 if (result != null && result.booleanValue()) { |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
497 NodeList subs = current.getChildNodes(); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
498 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
|
499 build(parent, subs.item(i)); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
500 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
501 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
502 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
503 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
504 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
|
505 throws SQLException |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
506 { |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
507 Node branch = null; |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
508 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
509 NodeList children = current.getChildNodes(); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
510 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
|
511 Node child = children.item(i); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
512 String ns = child.getNamespaceURI(); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
513 if (ns == null |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
514 || !ns.equals(DC_NAMESPACE_URI) |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
515 || child.getNodeType() != Node.ELEMENT_NODE |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
516 ) { |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
517 continue; |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
518 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
519 String name = child.getLocalName(); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
520 if ("when".equals(name)) { |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
521 Element when = (Element)child; |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
522 String test = when.getAttribute("test"); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
523 if (test.length() == 0) { |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
524 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
|
525 continue; |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
526 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
527 |
4737
718adea968e2
Add <dc:variable name="variable" expr="xpath"/> construct to datacage language.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4614
diff
changeset
|
528 Boolean result = evaluateXPathToBoolean(test); |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
529 if (result != null && result.booleanValue()) { |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
530 branch = child; |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
531 break; |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
532 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
533 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
534 continue; |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
535 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
536 else if ("otherwise".equals(name)) { |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
537 branch = child; |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
538 // No break here. |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
539 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
540 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
541 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
542 if (branch != null) { |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
543 NodeList subs = branch.getChildNodes(); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
544 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
|
545 build(parent, subs.item(i)); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
546 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
547 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
548 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
549 |
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
|
550 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
|
551 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
|
552 { |
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
|
553 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
|
554 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
|
555 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
|
556 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
|
557 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
|
558 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
|
559 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
|
560 } |
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
|
561 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
|
562 } |
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
|
563 |
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
|
564 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
|
565 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
566 if (log.isDebugEnabled()) { |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
567 log.debug("evaluate: '" + expr + "'"); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
568 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
569 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
570 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
|
571 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
|
572 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
|
573 } |
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
|
574 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
|
575 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
|
576 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
577 return null; |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
578 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
579 |
4737
718adea968e2
Add <dc:variable name="variable" expr="xpath"/> construct to datacage language.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4614
diff
changeset
|
580 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
|
581 |
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
|
582 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
|
583 |
718adea968e2
Add <dc:variable name="variable" expr="xpath"/> construct to datacage language.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4614
diff
changeset
|
584 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
|
585 ? (Boolean)result |
718adea968e2
Add <dc:variable name="variable" expr="xpath"/> construct to datacage language.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4614
diff
changeset
|
586 : null; |
718adea968e2
Add <dc:variable name="variable" expr="xpath"/> construct to datacage language.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4614
diff
changeset
|
587 } |
718adea968e2
Add <dc:variable name="variable" expr="xpath"/> construct to datacage language.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4614
diff
changeset
|
588 |
718adea968e2
Add <dc:variable name="variable" expr="xpath"/> construct to datacage language.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4614
diff
changeset
|
589 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
|
590 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
591 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
|
592 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
|
593 |
1716
3ca999f507b7
flys/issue314: Variables in datacage are now case insensitive.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1029
diff
changeset
|
594 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
|
595 |
3ca999f507b7
flys/issue314: Variables in datacage are now case insensitive.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1029
diff
changeset
|
596 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
|
597 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
|
598 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
|
599 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
600 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
601 |
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
|
602 |
4891
089bc08f720e
Builder: Doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4890
diff
changeset
|
603 /** 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
|
604 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
|
605 |
718adea968e2
Add <dc:variable name="variable" expr="xpath"/> construct to datacage language.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4614
diff
changeset
|
606 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
|
607 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
|
608 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
|
609 |
718adea968e2
Add <dc:variable name="variable" expr="xpath"/> construct to datacage language.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4614
diff
changeset
|
610 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
|
611 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
|
612 } |
718adea968e2
Add <dc:variable name="variable" expr="xpath"/> construct to datacage language.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4614
diff
changeset
|
613 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
|
614 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
|
615 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
|
616 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
|
617 } |
718adea968e2
Add <dc:variable name="variable" expr="xpath"/> construct to datacage language.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4614
diff
changeset
|
618 } |
718adea968e2
Add <dc:variable name="variable" expr="xpath"/> construct to datacage language.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4614
diff
changeset
|
619 |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
620 protected String expand(String s) { |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
621 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
|
622 |
1716
3ca999f507b7
flys/issue314: Variables in datacage are now case insensitive.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1029
diff
changeset
|
623 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
|
624 |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
625 StringBuffer sb = new StringBuffer(); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
626 while (m.find()) { |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
627 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
|
628 result[0] = null; |
3ca999f507b7
flys/issue314: Variables in datacage are now case insensitive.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1029
diff
changeset
|
629 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
|
630 m.appendReplacement( |
3ca999f507b7
flys/issue314: Variables in datacage are now case insensitive.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1029
diff
changeset
|
631 sb, result[0] != null ? result[0].toString() : ""); |
3ca999f507b7
flys/issue314: Variables in datacage are now case insensitive.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1029
diff
changeset
|
632 } |
3ca999f507b7
flys/issue314: Variables in datacage are now case insensitive.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1029
diff
changeset
|
633 else { |
3ca999f507b7
flys/issue314: Variables in datacage are now case insensitive.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1029
diff
changeset
|
634 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
|
635 } |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
636 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
637 m.appendTail(sb); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
638 return sb.toString(); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
639 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
640 |
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
|
641 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
|
642 String value = attr.getValue(); |
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
|
643 if (value.indexOf('{') >= 0) { |
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
|
644 StringBuffer sb = new StringBuffer(); |
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
|
645 Matcher m = BRACKET_XPATH.matcher(value); |
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
|
646 while (m.find()) { |
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
|
647 String expr = m.group(1); |
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
|
648 Object result = evaluateXPath(expr, XPathConstants.STRING); |
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
|
649 if (result instanceof String) { |
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
|
650 m.appendReplacement(sb, (String)result); |
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
|
651 } |
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
|
652 else { |
5532
55529f586962
Fixed replacement for unresolved variables in templating builder.
Raimund Renkert <rrenkert@intevation.de>
parents:
5531
diff
changeset
|
653 m.appendReplacement(sb, ""); |
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
|
654 } |
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
|
655 } |
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
|
656 m.appendTail(sb); |
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
|
657 attr.setValue(sb.toString()); |
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
|
658 } |
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
|
659 } |
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
|
660 |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
661 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
|
662 throws SQLException |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
663 { |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
664 String ns = current.getNamespaceURI(); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
665 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
|
666 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
|
667 log.warn("need elements here"); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
668 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
669 else { |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
670 String localName = current.getLocalName(); |
5517
5800a9497b0b
Fix syntax error in builder.
Andre Heinecke <aheinecke@intevation.de>
parents:
5509
diff
changeset
|
671 Element curr = (Element)current; |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
672 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
|
673 attribute(parent, curr); |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
674 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
675 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
|
676 context(parent, curr); |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
677 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
678 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
|
679 ifClause(parent, curr); |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
680 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
681 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
|
682 choose(parent, curr); |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
683 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
684 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
|
685 callMacro(parent, curr); |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
686 } |
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
|
687 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
|
688 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
|
689 } |
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
|
690 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
|
691 || "comment".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
|
692 || "statement".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
|
693 // Simply ignore them. |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
694 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
695 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
|
696 element(parent, curr); |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
697 } |
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
|
698 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
|
699 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
|
700 } |
627584bc0586
Datacage: Added <dc:filter> element. This allows cleaner way to narrow the datasets.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5494
diff
changeset
|
701 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
|
702 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
|
703 } |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
704 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
|
705 text(parent, curr); |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
706 } |
4737
718adea968e2
Add <dc:variable name="variable" expr="xpath"/> construct to datacage language.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4614
diff
changeset
|
707 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
|
708 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
|
709 } |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
710 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
|
711 convert(curr); |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
712 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
713 else { |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
714 log.warn("unknown '" + localName + "' -> ignore"); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
715 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
716 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
717 return; |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
718 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
719 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
720 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
|
721 String txt = current.getNodeValue(); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
722 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
|
723 return; |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
724 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
725 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
726 |
4353
daf0919df76d
Ignore comments in meta data xml template
Björn Ricks <bjoern.ricks@intevation.de>
parents:
4051
diff
changeset
|
727 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
|
728 // Ignore XML comments |
daf0919df76d
Ignore comments in meta data xml template
Björn Ricks <bjoern.ricks@intevation.de>
parents:
4051
diff
changeset
|
729 return; |
daf0919df76d
Ignore comments in meta data xml template
Björn Ricks <bjoern.ricks@intevation.de>
parents:
4051
diff
changeset
|
730 } |
daf0919df76d
Ignore comments in meta data xml template
Björn Ricks <bjoern.ricks@intevation.de>
parents:
4051
diff
changeset
|
731 |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
732 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
|
733 |
5494
773899d00234
Fix new attribute evaluation
Andre Heinecke <aheinecke@intevation.de>
parents:
5485
diff
changeset
|
734 NodeList children = current.getChildNodes(); |
773899d00234
Fix new attribute evaluation
Andre Heinecke <aheinecke@intevation.de>
parents:
5485
diff
changeset
|
735 for (int i = 0, N = children.getLength(); i < N; ++i) { |
773899d00234
Fix new attribute evaluation
Andre Heinecke <aheinecke@intevation.de>
parents:
5485
diff
changeset
|
736 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
|
737 } |
5494
773899d00234
Fix new attribute evaluation
Andre Heinecke <aheinecke@intevation.de>
parents:
5485
diff
changeset
|
738 if (copy.getNodeType() == Node.ELEMENT_NODE) { |
773899d00234
Fix new attribute evaluation
Andre Heinecke <aheinecke@intevation.de>
parents:
5485
diff
changeset
|
739 NamedNodeMap nnm = ((Element)copy).getAttributes(); |
773899d00234
Fix new attribute evaluation
Andre Heinecke <aheinecke@intevation.de>
parents:
5485
diff
changeset
|
740 for (int i = 0, N = nnm.getLength(); i < N; ++i) { |
773899d00234
Fix new attribute evaluation
Andre Heinecke <aheinecke@intevation.de>
parents:
5485
diff
changeset
|
741 Node n = nnm.item(i); |
773899d00234
Fix new attribute evaluation
Andre Heinecke <aheinecke@intevation.de>
parents:
5485
diff
changeset
|
742 if (n.getNodeType() == Node.ATTRIBUTE_NODE) { |
773899d00234
Fix new attribute evaluation
Andre Heinecke <aheinecke@intevation.de>
parents:
5485
diff
changeset
|
743 evaluateAttributeValue((Attr)n); |
773899d00234
Fix new attribute evaluation
Andre Heinecke <aheinecke@intevation.de>
parents:
5485
diff
changeset
|
744 } |
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
|
745 } |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
746 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
747 parent.appendChild(copy); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
748 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
749 } // class BuildHelper |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
750 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
751 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
752 public Builder() { |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
753 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
|
754 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
|
755 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
756 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
757 public Builder(Document template) { |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
758 this(); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
759 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
|
760 extractMacros(); |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
761 compileStatements(); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
762 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
763 |
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
|
764 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
|
765 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
|
766 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
|
767 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
|
768 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
|
769 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
|
770 } |
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
|
771 |
4614 | 772 /** Handle <dc:statement> elements. */ |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
773 protected void compileStatements() { |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
774 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
775 NodeList nodes = template.getElementsByTagNameNS( |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
776 DC_NAMESPACE_URI, "statement"); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
777 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
778 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
|
779 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
|
780 String stmnt = trimStatement(stmntElement.getTextContent()); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
781 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
|
782 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
|
783 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
784 CompiledStatement cs = new CompiledStatement(stmnt); |
1029
3f3988bb6284
Picky Cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
1023
diff
changeset
|
785 // 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
|
786 stmnt = "s" + i; |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
787 stmntElement.setTextContent(stmnt); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
788 compiledStatements.put(stmnt, cs); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
789 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
790 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
791 |
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
|
792 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
|
793 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
|
794 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
|
795 |
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
|
796 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
|
797 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
|
798 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
|
799 } |
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
|
800 } |
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
|
801 |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
802 protected List<Node> rootsToList() { |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
803 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
804 NodeList roots = template.getElementsByTagNameNS( |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
805 DC_NAMESPACE_URI, "template"); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
806 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
807 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
|
808 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
809 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
|
810 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
|
811 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
|
812 Node child = rootChildren.item(j); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
813 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
|
814 elements.add(child); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
815 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
816 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
817 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
818 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
819 return elements; |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
820 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
821 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
822 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
|
823 if (stmnt == null) return null; |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
824 //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
|
825 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
|
826 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
827 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
828 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
|
829 Document document = node.getOwnerDocument(); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
830 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
|
831 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
832 |
1011
aca3b46160cb
Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
998
diff
changeset
|
833 public void build( |
aca3b46160cb
Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
998
diff
changeset
|
834 List<NamedConnection> connections, |
aca3b46160cb
Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
998
diff
changeset
|
835 Node output, |
aca3b46160cb
Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
998
diff
changeset
|
836 Map<String, Object> parameters |
aca3b46160cb
Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
998
diff
changeset
|
837 ) |
aca3b46160cb
Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
998
diff
changeset
|
838 throws SQLException |
aca3b46160cb
Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
998
diff
changeset
|
839 { |
aca3b46160cb
Added support for more than one db connection in datacage templating.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
998
diff
changeset
|
840 BuildHelper helper = new BuildHelper(output, connections, parameters); |
998
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
841 |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
842 helper.build(); |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
843 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
844 } |
b81626b10cb7
Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
845 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |