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 :

http://dive4elements.wald.intevation.org