annotate flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/meta/Builder.java @ 961:3ba4f5a88c20

Datacage template: Added a new 'if' construct similiar to XSLT flys-artifacts/trunk@2380 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Wed, 20 Jul 2011 20:13:49 +0000
parents a2b20ed3d3b4
children 2de1808503be
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
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
3 import java.util.regex.Matcher;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
4
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
5 import java.util.ArrayList;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
6 import java.util.List;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
7 import java.util.HashMap;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
8 import java.util.Map;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
9
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
10 import org.w3c.dom.Document;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
11 import org.w3c.dom.NodeList;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
12 import org.w3c.dom.Node;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
13 import org.w3c.dom.Element;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
14
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
15 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
16 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
17 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
18 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
19
372
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
20 import java.sql.SQLException;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
21 import java.sql.Connection;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
22
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
23 import de.intevation.artifacts.common.utils.XMLUtils;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
24
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
25 import org.apache.log4j.Logger;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
26
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
27 public class Builder
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
28 {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
29 private static Logger log = Logger.getLogger(Builder.class);
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
30
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
31 public static final String DC_NAMESPACE_URI =
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
32 "http://www.intevation.org/2011/Datacage";
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
33
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
34 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
35 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
36
e91996b46e3c Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 742
diff changeset
37 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
38 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
39
415
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 410
diff changeset
40 protected Document template;
372
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
41
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
42 public class BuildHelper
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
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 output;
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 410
diff changeset
45 protected StackFrames frames;
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 410
diff changeset
46 protected Connection connection;
372
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
47 protected Map<String, CompiledStatement> statements;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
48
415
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 410
diff changeset
49 public BuildHelper(
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 410
diff changeset
50 Document output,
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 410
diff changeset
51 Connection connection,
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 410
diff changeset
52 Map<String, Object> parameters
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 410
diff changeset
53 ) {
372
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
54 this.output = output;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
55 this.connection = connection;
415
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 410
diff changeset
56 frames = new StackFrames(parameters);
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 410
diff changeset
57 statements = new HashMap<String, CompiledStatement>();
372
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
58 }
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
59
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
60 public void build(List<Node> elements) throws SQLException {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
61 try {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
62 for (Node current: elements) {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
63 build(output, current);
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
64 }
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
65 }
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
66 finally {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
67 for (CompiledStatement cs: statements.values()) {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
68 cs.close();
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
69 }
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
70 statements.clear();
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
71 }
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
72 }
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 protected void context(Node parent, Element current)
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
75 throws SQLException
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
76 {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
77 NodeList elements = current.getElementsByTagNameNS(
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
78 DC_NAMESPACE_URI, "elements");
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
79
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
80 if (elements.getLength() < 1) {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
81 log.warn("no elements found -> ignore");
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
82 return;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
83 }
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
84
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
85 NodeList subs = elements.item(0).getChildNodes();
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
86 int S = subs.getLength();
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
87
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
88 if (S < 1) {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
89 log.warn("elements is empty -> ignore");
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
90 return;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
91 }
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 NodeList stmntNode = current.getElementsByTagNameNS(
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
94 DC_NAMESPACE_URI, "statement");
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
95
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
96 if (stmntNode.getLength() < 1) {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
97 log.warn("dc:context: too less statements");
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
98 return;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
99 }
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 String stmntText = stmntNode.item(0).getTextContent();
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
102
415
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 410
diff changeset
103 if (stmntText == null
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 410
diff changeset
104 || (stmntText = stmntText.trim()).length() == 0) {
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 410
diff changeset
105 log.warn("dc:context: no sql statement found -> ignored");
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 410
diff changeset
106 return;
372
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
107 }
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 CompiledStatement cs = statements.get(stmntText);
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
110
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
111 if (cs == null) {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
112 cs = new CompiledStatement(stmntText);
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
113 statements.put(stmntText, cs);
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
114 }
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
115
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
116 ResultData rd = cs.execute(connection, frames);
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
117
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
118 String [] columns = rd.getColumnLabels();
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
119
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
120
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
121 for (Object [] row: rd.getRows()) {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
122 frames.enter();
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
123 try {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
124 frames.put(columns, row);
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
125 for (int i = 0; i < S; ++i) {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
126 build(parent, subs.item(i));
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 finally {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
130 frames.leave();
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
131 }
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
132 }
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
133 }
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
134
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
135 protected void element(Node parent, Element current)
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
136 throws SQLException
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
137 {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
138 String attr = expand(current.getAttribute("name"));
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 if (log.isDebugEnabled()) {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
141 log.debug("dc:element -> '" + attr + "'");
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
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
144 if (attr.length() == 0) {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
145 log.warn("no name attribute found");
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
146 return;
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
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
149 Element element = output.createElement(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 NodeList children = current.getChildNodes();
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
152 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
153 build(element, children.item(i));
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
154 }
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 parent.appendChild(element);
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
157 }
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 protected void text(Node parent, Element current)
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
160 throws SQLException
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
161 {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
162 log.debug("dc:text");
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
163 String value = expand(current.getTextContent());
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
164 parent.appendChild(output.createTextNode(value));
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
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
168 protected void attribute(Node parent, Element current) {
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 if (parent.getNodeType() != Node.ELEMENT_NODE) {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
171 log.warn("need element here");
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
172 return;
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 String name = expand(current.getAttribute("name"));
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
176 String value = expand(current.getAttribute("value"));
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 Element element = (Element)parent;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
179
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
180 element.setAttribute(name, value);
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
961
3ba4f5a88c20 Datacage template: Added a new 'if' construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 959
diff changeset
183 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
184 throws SQLException
3ba4f5a88c20 Datacage template: Added a new 'if' construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 959
diff changeset
185 {
3ba4f5a88c20 Datacage template: Added a new 'if' construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 959
diff changeset
186 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
187
3ba4f5a88c20 Datacage template: Added a new 'if' construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 959
diff changeset
188 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
189 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
190 return;
3ba4f5a88c20 Datacage template: Added a new 'if' construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 959
diff changeset
191 }
3ba4f5a88c20 Datacage template: Added a new 'if' construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 959
diff changeset
192
3ba4f5a88c20 Datacage template: Added a new 'if' construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 959
diff changeset
193 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
194
3ba4f5a88c20 Datacage template: Added a new 'if' construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 959
diff changeset
195 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
196 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
197 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
198 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
199 }
3ba4f5a88c20 Datacage template: Added a new 'if' construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 959
diff changeset
200 }
3ba4f5a88c20 Datacage template: Added a new 'if' construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 959
diff changeset
201 }
3ba4f5a88c20 Datacage template: Added a new 'if' construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 959
diff changeset
202
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
203 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
204 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
205 {
e91996b46e3c Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 742
diff changeset
206 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
207
e91996b46e3c Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 742
diff changeset
208 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
209 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
210 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
211 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
212 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
213 || !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
214 || 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
215 ) {
e91996b46e3c Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 742
diff changeset
216 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
217 }
e91996b46e3c Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 742
diff changeset
218 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
219 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
220 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
221 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
222 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
223 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
224 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
225 }
e91996b46e3c Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 742
diff changeset
226
959
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 957
diff changeset
227 Boolean result = evaluateXPath(test);
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 957
diff changeset
228 if (result != null && result.booleanValue()) {
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 957
diff changeset
229 branch = child;
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 957
diff changeset
230 break;
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 957
diff changeset
231 }
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
232
e91996b46e3c Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 742
diff changeset
233 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
234 }
e91996b46e3c Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 742
diff changeset
235 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
236 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
237 // 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
238 }
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 }
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 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
242 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
243 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
244 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
245 }
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 }
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 }
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
959
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 957
diff changeset
249 protected Boolean evaluateXPath(String expr) {
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 957
diff changeset
250 try {
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 957
diff changeset
251 XPath xpath = XPATH_FACTORY.newXPath();
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 957
diff changeset
252 xpath.setXPathVariableResolver(frames);
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 957
diff changeset
253 xpath.setXPathFunctionResolver(FunctionResolver.FUNCTIONS);
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 957
diff changeset
254 Object result = xpath.evaluate(
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 957
diff changeset
255 expr, EVAL_DOCUMENT, XPathConstants.BOOLEAN);
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 957
diff changeset
256
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 957
diff changeset
257 return result instanceof Boolean
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 957
diff changeset
258 ? (Boolean)result
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 957
diff changeset
259 : null;
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 957
diff changeset
260 }
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 957
diff changeset
261 catch (XPathExpressionException xfce) {
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 957
diff changeset
262 log.error(xfce);
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 957
diff changeset
263 }
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 957
diff changeset
264 return null;
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 957
diff changeset
265 }
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 957
diff changeset
266
415
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 410
diff changeset
267 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
268
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 410
diff changeset
269 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
270 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
271
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 410
diff changeset
272 if (frames.containsKey(variable)) {
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 410
diff changeset
273 Object object = TypeConverter.convert(
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 410
diff changeset
274 frames.get(variable),
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 410
diff changeset
275 type);
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 410
diff changeset
276 frames.put(variable, object);
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 410
diff changeset
277 }
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 410
diff changeset
278 }
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 410
diff changeset
279
372
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
280 protected String expand(String s) {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
281 Matcher m = CompiledStatement.VAR.matcher(s);
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
282
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
283 StringBuffer sb = new StringBuffer();
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
284 while (m.find()) {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
285 String key = m.group(1);
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
286 Object value = frames.get(key);
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
287 m.appendReplacement(sb, value != null ? value.toString() : "");
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
288 }
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
289 m.appendTail(sb);
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
290 return sb.toString();
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
291 }
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
292
742
c09c9e05ecfa Removed trailing whitespace.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 415
diff changeset
293 protected void build(Node parent, Node current)
372
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
294 throws SQLException
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
295 {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
296 String ns = current.getNamespaceURI();
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
297 if (ns != null && ns.equals(DC_NAMESPACE_URI)) {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
298 if (current.getNodeType() != Node.ELEMENT_NODE) {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
299 log.warn("need elements here");
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
300 }
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
301 else {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
302 String localName = current.getLocalName();
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
303 if ("context".equals(localName)) {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
304 context(parent, (Element)current);
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
305 }
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
306 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
307 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
308 }
961
3ba4f5a88c20 Datacage template: Added a new 'if' construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 959
diff changeset
309 else if ("if".equals(localName)) {
3ba4f5a88c20 Datacage template: Added a new 'if' construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 959
diff changeset
310 ifClause(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
311 }
372
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
312 else if ("attribute".equals(localName)) {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
313 attribute(parent, (Element)current);
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
314 }
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
315 else if ("element".equals(localName)) {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
316 element(parent, (Element)current);
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
317 }
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
318 else if ("text".equals(localName)) {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
319 text(parent, (Element)current);
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
320 }
415
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 410
diff changeset
321 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
322 convert(parent, (Element)current);
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 410
diff changeset
323 }
372
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
324 else {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
325 log.warn("unknown '" + localName + "' -> ignore");
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
326 }
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
327 }
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
328 return;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
329 }
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
330
410
df02137b3b28 Datacage service: Cleanup served XML document.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
331 if (current.getNodeType() == Node.TEXT_NODE) {
df02137b3b28 Datacage service: Cleanup served XML document.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
332 String txt = current.getNodeValue();
df02137b3b28 Datacage service: Cleanup served XML document.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
333 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
334 return;
df02137b3b28 Datacage service: Cleanup served XML document.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
335 }
df02137b3b28 Datacage service: Cleanup served XML document.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
336 }
df02137b3b28 Datacage service: Cleanup served XML document.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
337
372
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
338 Node copy = output.importNode(current, false);
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
339
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
340 NodeList children = current.getChildNodes();
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
341 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
342 build(copy, children.item(i));
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
343 }
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
344 parent.appendChild(copy);
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
345 }
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
346 } // class BuildHelper
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
347
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
348
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
349 public Builder() {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
350 }
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
351
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
352 public Builder(Document template) {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
353 this.template = template;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
354 }
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
355
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
356 public Document build(Connection connection)
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
357 throws SQLException
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
358 {
415
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 410
diff changeset
359 return build(connection, XMLUtils.newDocument(), null);
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
415
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 410
diff changeset
362 public Document build(
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 410
diff changeset
363 Connection connection,
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 410
diff changeset
364 Document output,
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 410
diff changeset
365 Map<String, Object> parameters
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 410
diff changeset
366 )
372
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
367 throws SQLException
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
368 {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
369 NodeList roots = template.getElementsByTagNameNS(
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
370 DC_NAMESPACE_URI, "template");
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
371
415
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 410
diff changeset
372 BuildHelper helper = new BuildHelper(output, connection, parameters);
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 List<Node> elements = new ArrayList<Node>();
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 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
377 NodeList rootChildren = roots.item(i).getChildNodes();
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
378 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
379 Node child = rootChildren.item(j);
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
380 if (child.getNodeType() == Node.ELEMENT_NODE) {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
381 elements.add(child);
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
382 }
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
383 }
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
384 }
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
385 helper.build(elements);
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
386
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
387 return output;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
388 }
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 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org