You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2020/10/02 08:50:47 UTC
[camel] 07/14: CAMEL-15605: Languages should be singleton for
better performance.
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 <cl...@gmail.com>
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);
+ }
+ }
}
}