Mercurial > dive4elements > river
annotate flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/meta/Builder.java @ 976:d830c398c8f4
Improved XPath handling for absent flags.
flys-artifacts/trunk@2402 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Mon, 25 Jul 2011 14:12:14 +0000 |
parents | c30ada285d45 |
children | 598a5e911118 |
rev | line source |
---|---|
372
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
1 package de.intevation.flys.artifacts.services.meta; |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
2 |
972
0c8aca463bd4
Added caching support for the static part of the datacage.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
963
diff
changeset
|
3 import java.util.regex.Pattern; |
372
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
4 import java.util.regex.Matcher; |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
5 |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
6 import java.util.ArrayList; |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
7 import java.util.List; |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
8 import java.util.HashMap; |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
9 import java.util.Map; |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
10 |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
11 import org.w3c.dom.Document; |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
12 import org.w3c.dom.NodeList; |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
13 import org.w3c.dom.Node; |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
14 import org.w3c.dom.Element; |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
15 |
957
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
16 import javax.xml.xpath.XPath; |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
17 import javax.xml.xpath.XPathFactory; |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
18 import javax.xml.xpath.XPathExpressionException; |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
19 import javax.xml.xpath.XPathConstants; |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
20 |
372
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
21 import java.sql.SQLException; |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
22 import java.sql.Connection; |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
23 |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
24 import de.intevation.artifacts.common.utils.XMLUtils; |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
25 |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
26 import org.apache.log4j.Logger; |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
27 |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
28 public class Builder |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
29 { |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
30 private static Logger log = Logger.getLogger(Builder.class); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
31 |
972
0c8aca463bd4
Added caching support for the static part of the datacage.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
963
diff
changeset
|
32 public static final Pattern STRIP_LINE_INDENT = |
0c8aca463bd4
Added caching support for the static part of the datacage.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
963
diff
changeset
|
33 Pattern.compile("\\s*\\r?\\n\\s*"); |
0c8aca463bd4
Added caching support for the static part of the datacage.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
963
diff
changeset
|
34 |
372
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
35 public static final String DC_NAMESPACE_URI = |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
36 "http://www.intevation.org/2011/Datacage"; |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
37 |
957
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
38 private static final Document EVAL_DOCUMENT = |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
39 XMLUtils.newDocument(); |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
40 |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
41 private static final XPathFactory XPATH_FACTORY = |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
42 XPathFactory.newInstance(); |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
43 |
415
7c018f466d6d
Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
410
diff
changeset
|
44 protected Document template; |
372
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
45 |
973
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
46 protected Map<String, CompiledStatement> compiledStatements; |
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
47 |
963
f48cef242e7f
Datacage: recommendation mechanism now accepts nodes to append results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
962
diff
changeset
|
48 |
372
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
49 public class BuildHelper |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
50 { |
973
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
51 protected Node output; |
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
52 protected Document owner; |
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
53 protected StackFrames frames; |
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
54 protected Connection connection; |
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
55 protected Map<String, CompiledStatement.Instance> statements; |
372
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
56 |
415
7c018f466d6d
Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
410
diff
changeset
|
57 public BuildHelper( |
963
f48cef242e7f
Datacage: recommendation mechanism now accepts nodes to append results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
962
diff
changeset
|
58 Node output, |
415
7c018f466d6d
Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
410
diff
changeset
|
59 Connection connection, |
7c018f466d6d
Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
410
diff
changeset
|
60 Map<String, Object> parameters |
7c018f466d6d
Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
410
diff
changeset
|
61 ) { |
372
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
62 this.output = output; |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
63 this.connection = connection; |
415
7c018f466d6d
Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
410
diff
changeset
|
64 frames = new StackFrames(parameters); |
973
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
65 statements = new HashMap<String, CompiledStatement.Instance>(); |
963
f48cef242e7f
Datacage: recommendation mechanism now accepts nodes to append results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
962
diff
changeset
|
66 owner = getOwnerDocument(output); |
372
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
67 } |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
68 |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
69 public void build(List<Node> elements) throws SQLException { |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
70 try { |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
71 for (Node current: elements) { |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
72 build(output, current); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
73 } |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
74 } |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
75 finally { |
973
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
76 closeStatements(); |
372
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
77 } |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
78 } |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
79 |
973
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
80 protected void closeStatements() { |
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
81 for (CompiledStatement.Instance csi: statements.values()) { |
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
82 csi.close(); |
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
83 } |
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
84 statements.clear(); |
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
85 } |
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
86 |
372
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
87 protected void context(Node parent, Element current) |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
88 throws SQLException |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
89 { |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
90 NodeList elements = current.getElementsByTagNameNS( |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
91 DC_NAMESPACE_URI, "elements"); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
92 |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
93 if (elements.getLength() < 1) { |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
94 log.warn("no elements found -> ignore"); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
95 return; |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
96 } |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
97 |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
98 NodeList subs = elements.item(0).getChildNodes(); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
99 int S = subs.getLength(); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
100 |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
101 if (S < 1) { |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
102 log.warn("elements is empty -> ignore"); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
103 return; |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
104 } |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
105 |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
106 NodeList stmntNode = current.getElementsByTagNameNS( |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
107 DC_NAMESPACE_URI, "statement"); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
108 |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
109 if (stmntNode.getLength() < 1) { |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
110 log.warn("dc:context: too less statements"); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
111 return; |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
112 } |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
113 |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
114 String stmntText = stmntNode.item(0).getTextContent(); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
115 |
973
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
116 CompiledStatement.Instance csi = statements.get(stmntText); |
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
117 |
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
118 if (csi == null) { |
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
119 CompiledStatement cs = compiledStatements.get(stmntText); |
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
120 csi = cs.new Instance(); |
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
121 statements.put(stmntText, csi); |
372
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
122 } |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
123 |
973
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
124 ResultData rd = csi.execute(connection, frames); |
372
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
125 |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
126 String [] columns = rd.getColumnLabels(); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
127 |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
128 |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
129 for (Object [] row: rd.getRows()) { |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
130 frames.enter(); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
131 try { |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
132 frames.put(columns, row); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
133 for (int i = 0; i < S; ++i) { |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
134 build(parent, subs.item(i)); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
135 } |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
136 } |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
137 finally { |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
138 frames.leave(); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
139 } |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
140 } |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
141 } |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
142 |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
143 protected void element(Node parent, Element current) |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
144 throws SQLException |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
145 { |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
146 String attr = expand(current.getAttribute("name")); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
147 |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
148 if (log.isDebugEnabled()) { |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
149 log.debug("dc:element -> '" + attr + "'"); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
150 } |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
151 |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
152 if (attr.length() == 0) { |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
153 log.warn("no name attribute found"); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
154 return; |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
155 } |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
156 |
963
f48cef242e7f
Datacage: recommendation mechanism now accepts nodes to append results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
962
diff
changeset
|
157 Element element = owner.createElement(attr); |
372
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
158 |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
159 NodeList children = current.getChildNodes(); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
160 for (int i = 0, N = children.getLength(); i < N; ++i) { |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
161 build(element, children.item(i)); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
162 } |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
163 |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
164 parent.appendChild(element); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
165 } |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
166 |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
167 protected void text(Node parent, Element current) |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
168 throws SQLException |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
169 { |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
170 log.debug("dc:text"); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
171 String value = expand(current.getTextContent()); |
963
f48cef242e7f
Datacage: recommendation mechanism now accepts nodes to append results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
962
diff
changeset
|
172 parent.appendChild(owner.createTextNode(value)); |
372
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
173 } |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
174 |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
175 |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
176 protected void attribute(Node parent, Element current) { |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
177 |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
178 if (parent.getNodeType() != Node.ELEMENT_NODE) { |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
179 log.warn("need element here"); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
180 return; |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
181 } |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
182 |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
183 String name = expand(current.getAttribute("name")); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
184 String value = expand(current.getAttribute("value")); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
185 |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
186 Element element = (Element)parent; |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
187 |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
188 element.setAttribute(name, value); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
189 } |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
190 |
962
2de1808503be
Datacage template: Added a macro mechanism.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
961
diff
changeset
|
191 protected void callMacro(Node parent, Element current) |
2de1808503be
Datacage template: Added a macro mechanism.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
961
diff
changeset
|
192 throws SQLException |
2de1808503be
Datacage template: Added a macro mechanism.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
961
diff
changeset
|
193 { |
2de1808503be
Datacage template: Added a macro mechanism.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
961
diff
changeset
|
194 String name = current.getAttribute("name"); |
2de1808503be
Datacage template: Added a macro mechanism.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
961
diff
changeset
|
195 |
2de1808503be
Datacage template: Added a macro mechanism.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
961
diff
changeset
|
196 if (name.length() == 0) { |
2de1808503be
Datacage template: Added a macro mechanism.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
961
diff
changeset
|
197 log.warn("missing 'name' attribute in 'call-macro'"); |
2de1808503be
Datacage template: Added a macro mechanism.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
961
diff
changeset
|
198 return; |
2de1808503be
Datacage template: Added a macro mechanism.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
961
diff
changeset
|
199 } |
2de1808503be
Datacage template: Added a macro mechanism.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
961
diff
changeset
|
200 |
2de1808503be
Datacage template: Added a macro mechanism.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
961
diff
changeset
|
201 NodeList macros = template.getElementsByTagNameNS( |
2de1808503be
Datacage template: Added a macro mechanism.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
961
diff
changeset
|
202 DC_NAMESPACE_URI, "macro"); |
2de1808503be
Datacage template: Added a macro mechanism.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
961
diff
changeset
|
203 |
2de1808503be
Datacage template: Added a macro mechanism.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
961
diff
changeset
|
204 for (int i = 0, N = macros.getLength(); i < N; ++i) { |
2de1808503be
Datacage template: Added a macro mechanism.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
961
diff
changeset
|
205 Element macro = (Element)macros.item(i); |
2de1808503be
Datacage template: Added a macro mechanism.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
961
diff
changeset
|
206 if (name.equals(macro.getAttribute("name"))) { |
2de1808503be
Datacage template: Added a macro mechanism.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
961
diff
changeset
|
207 NodeList subs = macro.getChildNodes(); |
2de1808503be
Datacage template: Added a macro mechanism.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
961
diff
changeset
|
208 for (int j = 0, M = subs.getLength(); j < M; ++j) { |
2de1808503be
Datacage template: Added a macro mechanism.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
961
diff
changeset
|
209 build(parent, subs.item(j)); |
2de1808503be
Datacage template: Added a macro mechanism.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
961
diff
changeset
|
210 } |
2de1808503be
Datacage template: Added a macro mechanism.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
961
diff
changeset
|
211 return; |
2de1808503be
Datacage template: Added a macro mechanism.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
961
diff
changeset
|
212 } |
2de1808503be
Datacage template: Added a macro mechanism.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
961
diff
changeset
|
213 } |
2de1808503be
Datacage template: Added a macro mechanism.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
961
diff
changeset
|
214 |
2de1808503be
Datacage template: Added a macro mechanism.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
961
diff
changeset
|
215 log.warn("no macro '" + name + "' found."); |
2de1808503be
Datacage template: Added a macro mechanism.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
961
diff
changeset
|
216 } |
2de1808503be
Datacage template: Added a macro mechanism.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
961
diff
changeset
|
217 |
961
3ba4f5a88c20
Datacage template: Added a new 'if' construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
959
diff
changeset
|
218 protected void ifClause(Node parent, Element current) |
3ba4f5a88c20
Datacage template: Added a new 'if' construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
959
diff
changeset
|
219 throws SQLException |
3ba4f5a88c20
Datacage template: Added a new 'if' construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
959
diff
changeset
|
220 { |
3ba4f5a88c20
Datacage template: Added a new 'if' construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
959
diff
changeset
|
221 String test = current.getAttribute("test"); |
3ba4f5a88c20
Datacage template: Added a new 'if' construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
959
diff
changeset
|
222 |
3ba4f5a88c20
Datacage template: Added a new 'if' construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
959
diff
changeset
|
223 if (test.length() == 0) { |
3ba4f5a88c20
Datacage template: Added a new 'if' construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
959
diff
changeset
|
224 log.warn("missing 'test' attribute in 'if'"); |
3ba4f5a88c20
Datacage template: Added a new 'if' construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
959
diff
changeset
|
225 return; |
3ba4f5a88c20
Datacage template: Added a new 'if' construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
959
diff
changeset
|
226 } |
3ba4f5a88c20
Datacage template: Added a new 'if' construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
959
diff
changeset
|
227 |
3ba4f5a88c20
Datacage template: Added a new 'if' construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
959
diff
changeset
|
228 Boolean result = evaluateXPath(test); |
3ba4f5a88c20
Datacage template: Added a new 'if' construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
959
diff
changeset
|
229 |
3ba4f5a88c20
Datacage template: Added a new 'if' construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
959
diff
changeset
|
230 if (result != null && result.booleanValue()) { |
3ba4f5a88c20
Datacage template: Added a new 'if' construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
959
diff
changeset
|
231 NodeList subs = current.getChildNodes(); |
3ba4f5a88c20
Datacage template: Added a new 'if' construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
959
diff
changeset
|
232 for (int i = 0, N = subs.getLength(); i < N; ++i) { |
3ba4f5a88c20
Datacage template: Added a new 'if' construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
959
diff
changeset
|
233 build(parent, subs.item(i)); |
3ba4f5a88c20
Datacage template: Added a new 'if' construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
959
diff
changeset
|
234 } |
3ba4f5a88c20
Datacage template: Added a new 'if' construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
959
diff
changeset
|
235 } |
3ba4f5a88c20
Datacage template: Added a new 'if' construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
959
diff
changeset
|
236 } |
3ba4f5a88c20
Datacage template: Added a new 'if' construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
959
diff
changeset
|
237 |
957
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
238 protected void choose(Node parent, Element current) |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
239 throws SQLException |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
240 { |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
241 Node branch = null; |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
242 |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
243 NodeList children = current.getChildNodes(); |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
244 for (int i = 0, N = children.getLength(); i < N; ++i) { |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
245 Node child = children.item(i); |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
246 String ns = child.getNamespaceURI(); |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
247 if (ns == null |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
248 || !ns.equals(DC_NAMESPACE_URI) |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
249 || child.getNodeType() != Node.ELEMENT_NODE |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
250 ) { |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
251 continue; |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
252 } |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
253 String name = child.getLocalName(); |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
254 if ("when".equals(name)) { |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
255 Element when = (Element)child; |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
256 String test = when.getAttribute("test"); |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
257 if (test.length() == 0) { |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
258 log.warn("no 'test' attribute found for when"); |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
259 continue; |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
260 } |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
261 |
959
a2b20ed3d3b4
Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
957
diff
changeset
|
262 Boolean result = evaluateXPath(test); |
a2b20ed3d3b4
Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
957
diff
changeset
|
263 if (result != null && result.booleanValue()) { |
a2b20ed3d3b4
Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
957
diff
changeset
|
264 branch = child; |
a2b20ed3d3b4
Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
957
diff
changeset
|
265 break; |
a2b20ed3d3b4
Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
957
diff
changeset
|
266 } |
957
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
267 |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
268 continue; |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
269 } |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
270 else if ("otherwise".equals(name)) { |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
271 branch = child; |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
272 // No break here. |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
273 } |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
274 } |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
275 |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
276 if (branch != null) { |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
277 NodeList subs = branch.getChildNodes(); |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
278 for (int i = 0, N = subs.getLength(); i < N; ++i) { |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
279 build(parent, subs.item(i)); |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
280 } |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
281 } |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
282 } |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
283 |
959
a2b20ed3d3b4
Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
957
diff
changeset
|
284 protected Boolean evaluateXPath(String expr) { |
976
d830c398c8f4
Improved XPath handling for absent flags.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
973
diff
changeset
|
285 |
d830c398c8f4
Improved XPath handling for absent flags.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
973
diff
changeset
|
286 if (log.isDebugEnabled()) { |
d830c398c8f4
Improved XPath handling for absent flags.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
973
diff
changeset
|
287 log.debug("evaluate: '" + expr + "'"); |
d830c398c8f4
Improved XPath handling for absent flags.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
973
diff
changeset
|
288 } |
d830c398c8f4
Improved XPath handling for absent flags.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
973
diff
changeset
|
289 |
959
a2b20ed3d3b4
Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
957
diff
changeset
|
290 try { |
a2b20ed3d3b4
Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
957
diff
changeset
|
291 XPath xpath = XPATH_FACTORY.newXPath(); |
a2b20ed3d3b4
Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
957
diff
changeset
|
292 xpath.setXPathVariableResolver(frames); |
a2b20ed3d3b4
Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
957
diff
changeset
|
293 xpath.setXPathFunctionResolver(FunctionResolver.FUNCTIONS); |
a2b20ed3d3b4
Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
957
diff
changeset
|
294 Object result = xpath.evaluate( |
a2b20ed3d3b4
Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
957
diff
changeset
|
295 expr, EVAL_DOCUMENT, XPathConstants.BOOLEAN); |
a2b20ed3d3b4
Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
957
diff
changeset
|
296 |
a2b20ed3d3b4
Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
957
diff
changeset
|
297 return result instanceof Boolean |
a2b20ed3d3b4
Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
957
diff
changeset
|
298 ? (Boolean)result |
a2b20ed3d3b4
Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
957
diff
changeset
|
299 : null; |
a2b20ed3d3b4
Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
957
diff
changeset
|
300 } |
a2b20ed3d3b4
Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
957
diff
changeset
|
301 catch (XPathExpressionException xfce) { |
a2b20ed3d3b4
Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
957
diff
changeset
|
302 log.error(xfce); |
a2b20ed3d3b4
Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
957
diff
changeset
|
303 } |
a2b20ed3d3b4
Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
957
diff
changeset
|
304 return null; |
a2b20ed3d3b4
Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
957
diff
changeset
|
305 } |
a2b20ed3d3b4
Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
957
diff
changeset
|
306 |
415
7c018f466d6d
Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
410
diff
changeset
|
307 protected void convert(Node parent, Element current) { |
7c018f466d6d
Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
410
diff
changeset
|
308 |
7c018f466d6d
Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
410
diff
changeset
|
309 String variable = expand(current.getAttribute("var")); |
7c018f466d6d
Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
410
diff
changeset
|
310 String type = expand(current.getAttribute("type")); |
7c018f466d6d
Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
410
diff
changeset
|
311 |
7c018f466d6d
Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
410
diff
changeset
|
312 if (frames.containsKey(variable)) { |
7c018f466d6d
Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
410
diff
changeset
|
313 Object object = TypeConverter.convert( |
7c018f466d6d
Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
410
diff
changeset
|
314 frames.get(variable), |
7c018f466d6d
Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
410
diff
changeset
|
315 type); |
7c018f466d6d
Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
410
diff
changeset
|
316 frames.put(variable, object); |
7c018f466d6d
Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
410
diff
changeset
|
317 } |
7c018f466d6d
Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
410
diff
changeset
|
318 } |
7c018f466d6d
Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
410
diff
changeset
|
319 |
372
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
320 protected String expand(String s) { |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
321 Matcher m = CompiledStatement.VAR.matcher(s); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
322 |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
323 StringBuffer sb = new StringBuffer(); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
324 while (m.find()) { |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
325 String key = m.group(1); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
326 Object value = frames.get(key); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
327 m.appendReplacement(sb, value != null ? value.toString() : ""); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
328 } |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
329 m.appendTail(sb); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
330 return sb.toString(); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
331 } |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
332 |
742
c09c9e05ecfa
Removed trailing whitespace.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
415
diff
changeset
|
333 protected void build(Node parent, Node current) |
372
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
334 throws SQLException |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
335 { |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
336 String ns = current.getNamespaceURI(); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
337 if (ns != null && ns.equals(DC_NAMESPACE_URI)) { |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
338 if (current.getNodeType() != Node.ELEMENT_NODE) { |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
339 log.warn("need elements here"); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
340 } |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
341 else { |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
342 String localName = current.getLocalName(); |
972
0c8aca463bd4
Added caching support for the static part of the datacage.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
963
diff
changeset
|
343 if ("attribute".equals(localName)) { |
0c8aca463bd4
Added caching support for the static part of the datacage.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
963
diff
changeset
|
344 attribute(parent, (Element)current); |
0c8aca463bd4
Added caching support for the static part of the datacage.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
963
diff
changeset
|
345 } |
0c8aca463bd4
Added caching support for the static part of the datacage.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
963
diff
changeset
|
346 else if ("context".equals(localName)) { |
372
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
347 context(parent, (Element)current); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
348 } |
972
0c8aca463bd4
Added caching support for the static part of the datacage.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
963
diff
changeset
|
349 else if ("if".equals(localName)) { |
0c8aca463bd4
Added caching support for the static part of the datacage.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
963
diff
changeset
|
350 ifClause(parent, (Element)current); |
0c8aca463bd4
Added caching support for the static part of the datacage.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
963
diff
changeset
|
351 } |
957
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
352 else if ("choose".equals(localName)) { |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
353 choose(parent, (Element)current); |
e91996b46e3c
Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
742
diff
changeset
|
354 } |
972
0c8aca463bd4
Added caching support for the static part of the datacage.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
963
diff
changeset
|
355 else if ("call-macro".equals(localName)) { |
0c8aca463bd4
Added caching support for the static part of the datacage.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
963
diff
changeset
|
356 callMacro(parent, (Element)current); |
961
3ba4f5a88c20
Datacage template: Added a new 'if' construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
959
diff
changeset
|
357 } |
972
0c8aca463bd4
Added caching support for the static part of the datacage.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
963
diff
changeset
|
358 else if ("macro".equals(localName)) { |
0c8aca463bd4
Added caching support for the static part of the datacage.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
963
diff
changeset
|
359 // simply ignore the definition. |
372
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
360 } |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
361 else if ("element".equals(localName)) { |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
362 element(parent, (Element)current); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
363 } |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
364 else if ("text".equals(localName)) { |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
365 text(parent, (Element)current); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
366 } |
415
7c018f466d6d
Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
410
diff
changeset
|
367 else if ("convert".equals(localName)) { |
7c018f466d6d
Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
410
diff
changeset
|
368 convert(parent, (Element)current); |
7c018f466d6d
Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
410
diff
changeset
|
369 } |
372
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
370 else { |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
371 log.warn("unknown '" + localName + "' -> ignore"); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
372 } |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
373 } |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
374 return; |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
375 } |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
376 |
410
df02137b3b28
Datacage service: Cleanup served XML document.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
372
diff
changeset
|
377 if (current.getNodeType() == Node.TEXT_NODE) { |
df02137b3b28
Datacage service: Cleanup served XML document.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
372
diff
changeset
|
378 String txt = current.getNodeValue(); |
df02137b3b28
Datacage service: Cleanup served XML document.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
372
diff
changeset
|
379 if (txt != null && txt.trim().length() == 0) { |
df02137b3b28
Datacage service: Cleanup served XML document.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
372
diff
changeset
|
380 return; |
df02137b3b28
Datacage service: Cleanup served XML document.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
372
diff
changeset
|
381 } |
df02137b3b28
Datacage service: Cleanup served XML document.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
372
diff
changeset
|
382 } |
df02137b3b28
Datacage service: Cleanup served XML document.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
372
diff
changeset
|
383 |
963
f48cef242e7f
Datacage: recommendation mechanism now accepts nodes to append results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
962
diff
changeset
|
384 Node copy = owner.importNode(current, false); |
372
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
385 |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
386 NodeList children = current.getChildNodes(); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
387 for (int i = 0, N = children.getLength(); i < N; ++i) { |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
388 build(copy, children.item(i)); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
389 } |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
390 parent.appendChild(copy); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
391 } |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
392 } // class BuildHelper |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
393 |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
394 |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
395 public Builder() { |
973
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
396 compiledStatements = new HashMap<String, CompiledStatement>(); |
372
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
397 } |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
398 |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
399 public Builder(Document template) { |
973
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
400 this(); |
372
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
401 this.template = template; |
973
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
402 compileStatements(); |
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
403 } |
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
404 |
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
405 protected void compileStatements() { |
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
406 |
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
407 NodeList nodes = template.getElementsByTagNameNS( |
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
408 DC_NAMESPACE_URI, "statement"); |
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
409 |
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
410 for (int i = 0, N = nodes.getLength(); i < N; ++i) { |
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
411 Element stmntElement = (Element)nodes.item(i); |
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
412 String stmnt = trimStatement(stmntElement.getTextContent()); |
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
413 if (stmnt == null || stmnt.length() == 0) { |
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
414 throw new IllegalArgumentException("found empty statement"); |
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
415 } |
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
416 CompiledStatement cs = new CompiledStatement(stmnt); |
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
417 // for faster lookup store a shortend string into the template |
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
418 stmnt = "s" + i; |
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
419 stmntElement.setTextContent(stmnt); |
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
420 compiledStatements.put(stmnt, cs); |
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
421 } |
372
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
422 } |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
423 |
963
f48cef242e7f
Datacage: recommendation mechanism now accepts nodes to append results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
962
diff
changeset
|
424 protected static List<Node> rootsToList(NodeList roots) { |
372
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
425 |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
426 List<Node> elements = new ArrayList<Node>(); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
427 |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
428 for (int i = 0, N = roots.getLength(); i < N; ++i) { |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
429 NodeList rootChildren = roots.item(i).getChildNodes(); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
430 for (int j = 0, M = rootChildren.getLength(); j < M; ++j) { |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
431 Node child = rootChildren.item(j); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
432 if (child.getNodeType() == Node.ELEMENT_NODE) { |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
433 elements.add(child); |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
434 } |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
435 } |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
436 } |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
437 |
963
f48cef242e7f
Datacage: recommendation mechanism now accepts nodes to append results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
962
diff
changeset
|
438 return elements; |
f48cef242e7f
Datacage: recommendation mechanism now accepts nodes to append results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
962
diff
changeset
|
439 } |
f48cef242e7f
Datacage: recommendation mechanism now accepts nodes to append results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
962
diff
changeset
|
440 |
972
0c8aca463bd4
Added caching support for the static part of the datacage.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
963
diff
changeset
|
441 protected static final String trimStatement(String stmnt) { |
973
c30ada285d45
Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
972
diff
changeset
|
442 if (stmnt == null) return null; |
972
0c8aca463bd4
Added caching support for the static part of the datacage.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
963
diff
changeset
|
443 //XXX: Maybe a bit to radical for multiline strings? |
0c8aca463bd4
Added caching support for the static part of the datacage.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
963
diff
changeset
|
444 return STRIP_LINE_INDENT.matcher(stmnt.trim()).replaceAll(" "); |
0c8aca463bd4
Added caching support for the static part of the datacage.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
963
diff
changeset
|
445 } |
0c8aca463bd4
Added caching support for the static part of the datacage.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
963
diff
changeset
|
446 |
0c8aca463bd4
Added caching support for the static part of the datacage.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
963
diff
changeset
|
447 protected static Document getOwnerDocument(Node node) { |
0c8aca463bd4
Added caching support for the static part of the datacage.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
963
diff
changeset
|
448 Document document = node.getOwnerDocument(); |
0c8aca463bd4
Added caching support for the static part of the datacage.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
963
diff
changeset
|
449 return document != null ? document : (Document)node; |
0c8aca463bd4
Added caching support for the static part of the datacage.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
963
diff
changeset
|
450 } |
0c8aca463bd4
Added caching support for the static part of the datacage.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
963
diff
changeset
|
451 |
963
f48cef242e7f
Datacage: recommendation mechanism now accepts nodes to append results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
962
diff
changeset
|
452 public void build( |
f48cef242e7f
Datacage: recommendation mechanism now accepts nodes to append results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
962
diff
changeset
|
453 Connection connection, |
f48cef242e7f
Datacage: recommendation mechanism now accepts nodes to append results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
962
diff
changeset
|
454 Node output, |
f48cef242e7f
Datacage: recommendation mechanism now accepts nodes to append results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
962
diff
changeset
|
455 Map<String, Object> parameters |
f48cef242e7f
Datacage: recommendation mechanism now accepts nodes to append results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
962
diff
changeset
|
456 ) |
f48cef242e7f
Datacage: recommendation mechanism now accepts nodes to append results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
962
diff
changeset
|
457 throws SQLException |
f48cef242e7f
Datacage: recommendation mechanism now accepts nodes to append results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
962
diff
changeset
|
458 { |
f48cef242e7f
Datacage: recommendation mechanism now accepts nodes to append results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
962
diff
changeset
|
459 BuildHelper helper = new BuildHelper(output, connection, parameters); |
f48cef242e7f
Datacage: recommendation mechanism now accepts nodes to append results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
962
diff
changeset
|
460 |
f48cef242e7f
Datacage: recommendation mechanism now accepts nodes to append results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
962
diff
changeset
|
461 NodeList roots = template.getElementsByTagNameNS( |
f48cef242e7f
Datacage: recommendation mechanism now accepts nodes to append results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
962
diff
changeset
|
462 DC_NAMESPACE_URI, "template"); |
f48cef242e7f
Datacage: recommendation mechanism now accepts nodes to append results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
962
diff
changeset
|
463 |
f48cef242e7f
Datacage: recommendation mechanism now accepts nodes to append results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
962
diff
changeset
|
464 helper.build(rootsToList(roots)); |
372
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
465 } |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
466 } |
fc3cf0ef777e
Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
467 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |