Mercurial > dive4elements > river
diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/meta/Builder.java @ 973:c30ada285d45
Reuse the compiled statements in meta data service.
flys-artifacts/trunk@2399 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Sat, 23 Jul 2011 18:47:08 +0000 |
parents | 0c8aca463bd4 |
children | d830c398c8f4 |
line wrap: on
line diff
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/meta/Builder.java Fri Jul 22 16:55:36 2011 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/meta/Builder.java Sat Jul 23 18:47:08 2011 +0000 @@ -43,14 +43,16 @@ protected Document template; + protected Map<String, CompiledStatement> compiledStatements; + public class BuildHelper { - protected Node output; - protected Document owner; - protected StackFrames frames; - protected Connection connection; - protected Map<String, CompiledStatement> statements; + protected Node output; + protected Document owner; + protected StackFrames frames; + protected Connection connection; + protected Map<String, CompiledStatement.Instance> statements; public BuildHelper( Node output, @@ -60,7 +62,7 @@ this.output = output; this.connection = connection; frames = new StackFrames(parameters); - statements = new HashMap<String, CompiledStatement>(); + statements = new HashMap<String, CompiledStatement.Instance>(); owner = getOwnerDocument(output); } @@ -71,13 +73,17 @@ } } finally { - for (CompiledStatement cs: statements.values()) { - cs.close(); - } - statements.clear(); + closeStatements(); } } + protected void closeStatements() { + for (CompiledStatement.Instance csi: statements.values()) { + csi.close(); + } + statements.clear(); + } + protected void context(Node parent, Element current) throws SQLException { @@ -107,20 +113,15 @@ String stmntText = stmntNode.item(0).getTextContent(); - if (stmntText == null - || (stmntText = trimStatement(stmntText)).length() == 0) { - log.warn("dc:context: no sql statement found -> ignored"); - return; + CompiledStatement.Instance csi = statements.get(stmntText); + + if (csi == null) { + CompiledStatement cs = compiledStatements.get(stmntText); + csi = cs.new Instance(); + statements.put(stmntText, csi); } - CompiledStatement cs = statements.get(stmntText); - - if (cs == null) { - cs = new CompiledStatement(stmntText); - statements.put(stmntText, cs); - } - - ResultData rd = cs.execute(connection, frames); + ResultData rd = csi.execute(connection, frames); String [] columns = rd.getColumnLabels(); @@ -387,10 +388,32 @@ public Builder() { + compiledStatements = new HashMap<String, CompiledStatement>(); } public Builder(Document template) { + this(); this.template = template; + compileStatements(); + } + + protected void compileStatements() { + + NodeList nodes = template.getElementsByTagNameNS( + DC_NAMESPACE_URI, "statement"); + + for (int i = 0, N = nodes.getLength(); i < N; ++i) { + Element stmntElement = (Element)nodes.item(i); + String stmnt = trimStatement(stmntElement.getTextContent()); + if (stmnt == null || stmnt.length() == 0) { + throw new IllegalArgumentException("found empty statement"); + } + CompiledStatement cs = new CompiledStatement(stmnt); + // for faster lookup store a shortend string into the template + stmnt = "s" + i; + stmntElement.setTextContent(stmnt); + compiledStatements.put(stmnt, cs); + } } protected static List<Node> rootsToList(NodeList roots) { @@ -411,6 +434,7 @@ } protected static final String trimStatement(String stmnt) { + if (stmnt == null) return null; //XXX: Maybe a bit to radical for multiline strings? return STRIP_LINE_INDENT.matcher(stmnt.trim()).replaceAll(" "); }