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