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(" ");
     }

http://dive4elements.wald.intevation.org