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);
+            }
+        }
     }
 
 }