# HG changeset patch # User Sascha L. Teichmann # Date 1364378395 -3600 # Node ID 504a6288721773fa09bf17c59163a386d932d928 # Parent b279f2d4bc7891847e88174bca04fdf66974e5c4 Datacage: Compile XPath expressions and reuse them. With the introduction of filters in dc:elements XPath expressions are evalutated very often so compiling them should reduce the overhead significantly. diff -r b279f2d4bc78 -r 504a62887217 flys-artifacts/src/main/java/de/intevation/flys/artifacts/datacage/templating/Builder.java --- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/datacage/templating/Builder.java Wed Mar 27 10:25:45 2013 +0100 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/datacage/templating/Builder.java Wed Mar 27 10:59:55 2013 +0100 @@ -21,6 +21,7 @@ import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathExpression; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; @@ -97,6 +98,8 @@ protected Deque> connectionsStack; protected Deque macroBodies; protected FunctionResolver functionResolver; + protected Map expressions; + public BuildHelper( Node output, @@ -115,6 +118,7 @@ owner = getOwnerDocument(output); macroBodies = new ArrayDeque(); functionResolver = new FunctionResolver(this); + expressions = new HashMap(); statements = new HashMap(); } @@ -531,6 +535,20 @@ } } + protected XPathExpression getXPathExpression(String expr) + throws XPathExpressionException + { + XPathExpression x = expressions.get(expr); + if (x == null) { + XPath xpath = XPATH_FACTORY.newXPath(); + xpath.setXPathVariableResolver(frames); + xpath.setXPathFunctionResolver(functionResolver); + x = xpath.compile(expr); + expressions.put(expr, x); + } + return x; + } + protected Object evaluateXPath(String expr, QName returnType) { if (log.isDebugEnabled()) { @@ -538,10 +556,8 @@ } try { - XPath xpath = XPATH_FACTORY.newXPath(); - xpath.setXPathVariableResolver(frames); - xpath.setXPathFunctionResolver(functionResolver); - return xpath.evaluate(expr, EVAL_DOCUMENT, returnType); + XPathExpression x = getXPathExpression(expr); + return x.evaluate(EVAL_DOCUMENT, returnType); } catch (XPathExpressionException xpee) { log.error("expression: " + expr, xpee);