This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
commit fd8084fed1b904a5205e82b82797d7e6094681e9 Author: Claus Ibsen <[email protected]> AuthorDate: Thu Oct 1 21:19:29 2020 +0200 CAMEL-15605: Languages should be singleton for better performance. --- .../camel/component/xquery/XQueryBuilder.java | 23 +------- .../camel/language/xquery/XQueryLanguage.java | 62 +++++++++++++++++++++- .../reifier/language/XQueryExpressionReifier.java | 43 ++++++++++----- 3 files changed, 92 insertions(+), 36 deletions(-) diff --git a/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQueryBuilder.java b/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQueryBuilder.java index 4c4227c..4803f9e 100644 --- a/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQueryBuilder.java +++ b/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQueryBuilder.java @@ -69,10 +69,8 @@ import org.apache.camel.NoTypeConversionAvailableException; import org.apache.camel.Predicate; import org.apache.camel.Processor; import org.apache.camel.RuntimeExpressionException; -import org.apache.camel.spi.GeneratedPropertyConfigurer; import org.apache.camel.spi.NamespaceAware; import org.apache.camel.support.MessageHelper; -import org.apache.camel.support.component.PropertyConfigurerSupport; import org.apache.camel.util.IOHelper; import org.apache.camel.util.ObjectHelper; import org.apache.camel.util.xml.BytesSource; @@ -86,7 +84,7 @@ import org.slf4j.LoggerFactory; * The XQueryExpression, as you would expect, can be executed repeatedly, as often as you want, in the same or in * different threads. */ -public abstract class XQueryBuilder implements Expression, Predicate, NamespaceAware, Processor, GeneratedPropertyConfigurer { +public abstract class XQueryBuilder implements Expression, Predicate, NamespaceAware, Processor { private static final Logger LOG = LoggerFactory.getLogger(XQueryBuilder.class); private Configuration configuration; private Map<String, Object> configurationProperties = new HashMap<>(); @@ -104,25 +102,6 @@ public abstract class XQueryBuilder implements Expression, Predicate, NamespaceA private String headerName; @Override - public boolean configure(CamelContext camelContext, Object target, String name, Object value, boolean ignoreCase) { - if (target != this) { - throw new IllegalStateException("Can only configure our own instance !"); - } - switch (ignoreCase ? name.toLowerCase() : name) { - case "resulttype": - case "resultType": - setResultType(PropertyConfigurerSupport.property(camelContext, Class.class, value)); - return true; - case "headername": - case "headerName": - setHeaderName(PropertyConfigurerSupport.property(camelContext, String.class, value)); - return true; - default: - return false; - } - } - - @Override public String toString() { return "XQuery[" + expression + "]"; } diff --git a/components/camel-saxon/src/main/java/org/apache/camel/language/xquery/XQueryLanguage.java b/components/camel-saxon/src/main/java/org/apache/camel/language/xquery/XQueryLanguage.java index b7e0c12..edf2742 100644 --- a/components/camel-saxon/src/main/java/org/apache/camel/language/xquery/XQueryLanguage.java +++ b/components/camel-saxon/src/main/java/org/apache/camel/language/xquery/XQueryLanguage.java @@ -16,6 +16,8 @@ */ package org.apache.camel.language.xquery; +import java.util.Map; + import org.apache.camel.Expression; import org.apache.camel.Predicate; import org.apache.camel.component.xquery.XQueryBuilder; @@ -25,15 +27,71 @@ import org.apache.camel.support.LanguageSupport; @Language("xquery") public class XQueryLanguage extends LanguageSupport { + private Class<?> resultType; + private String headerName; + + public Class<?> getResultType() { + return resultType; + } + + public void setResultType(Class<?> resultType) { + this.resultType = resultType; + } + + public String getHeaderName() { + return headerName; + } + + public void setHeaderName(String headerName) { + this.headerName = headerName; + } + @Override public Predicate createPredicate(String expression) { expression = loadResource(expression); - return XQueryBuilder.xquery(expression); + + XQueryBuilder builder = XQueryBuilder.xquery(expression); + configureBuilder(builder); + return builder; } @Override public Expression createExpression(String expression) { expression = loadResource(expression); - return XQueryBuilder.xquery(expression); + + XQueryBuilder builder = XQueryBuilder.xquery(expression); + configureBuilder(builder); + return builder; + } + + @Override + public Predicate createPredicate(Map<String, Object> properties) { + return (Predicate) createExpression(properties); + } + + @Override + public Expression createExpression(Map<String, Object> properties) { + String expression = (String) properties.get("expression"); + expression = loadResource(expression); + + Class<?> clazz = property(Class.class, properties, "resultType", null); + if (clazz != null) { + setResultType(clazz); + } + setHeaderName(property(String.class, properties, "headerName", null)); + + XQueryBuilder builder = XQueryBuilder.xquery(expression); + configureBuilder(builder); + return builder; } + + protected void configureBuilder(XQueryBuilder builder) { + if (resultType != null) { + builder.setResultType(resultType); + } + if (headerName != null) { + builder.setHeaderName(headerName); + } + } + } diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/XQueryExpressionReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/XQueryExpressionReifier.java index 4fb2ee2..0996ce1 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/XQueryExpressionReifier.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/XQueryExpressionReifier.java @@ -22,30 +22,36 @@ import java.util.Map; import org.apache.camel.CamelContext; import org.apache.camel.Expression; import org.apache.camel.Predicate; +import org.apache.camel.RuntimeCamelException; import org.apache.camel.model.language.ExpressionDefinition; import org.apache.camel.model.language.XQueryExpression; +import org.apache.camel.spi.Language; import org.apache.camel.spi.NamespaceAware; public class XQueryExpressionReifier extends ExpressionReifier<XQueryExpression> { - // TODO: Update me - public XQueryExpressionReifier(CamelContext camelContext, ExpressionDefinition definition) { super(camelContext, (XQueryExpression) definition); } @Override - protected void configureExpression(Expression expression) { - bindProperties(expression); - configureNamespaceAware(expression); - super.configureExpression(expression); + protected Expression createExpression(Language language, String exp) { + return language.createExpression(createProperties(exp)); + } + + @Override + protected Predicate createPredicate(Language language, String exp) { + return language.createPredicate(createProperties(exp)); } @Override protected void configurePredicate(Predicate predicate) { - bindProperties(predicate); configureNamespaceAware(predicate); - super.configurePredicate(predicate); + } + + @Override + protected void configureExpression(Expression expression) { + configureNamespaceAware(expression); } protected void configureNamespaceAware(Object builder) { @@ -55,11 +61,24 @@ public class XQueryExpressionReifier extends ExpressionReifier<XQueryExpression> } } - protected void bindProperties(Object target) { - Map<String, Object> properties = new HashMap<>(); - properties.put("resultType", or(definition.getResultType(), definition.getType())); + protected Map<String, Object> createProperties(String expression) { + Map<String, Object> properties = new HashMap<>(3); + properties.put("expression", expression); + properties.put("resultType", definition.getResultType()); properties.put("headerName", definition.getHeaderName()); - setProperties(target, properties); + return properties; + } + + @Override + protected void configureLanguage(Language language) { + if (definition.getResultType() == null && definition.getType() != null) { + try { + Class<?> clazz = camelContext.getClassResolver().resolveMandatoryClass(definition.getType()); + definition.setResultType(clazz); + } catch (ClassNotFoundException e) { + throw RuntimeCamelException.wrapRuntimeException(e); + } + } } }
