This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch lang5
in repository https://gitbox.apache.org/repos/asf/camel.git

commit e8762a5fff1cf69e6a10a39a6118a48a05d9f42e
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Sat Feb 3 14:07:42 2024 +0100

    CAMEL-20378: Languages should be thread-safe and be configured only via 
properties array, all in the same way.
---
 .../apache/camel/language/bean/BeanLanguage.java   | 18 +++++++----------
 .../language/datasonnet/DatasonnetLanguage.java    | 23 ++--------------------
 .../apache/camel/language/joor/JavaLanguage.java   |  4 ++--
 .../org/apache/camel/language/jq/JqLanguage.java   |  2 +-
 .../apache/camel/jsonpath/JsonPathLanguage.java    |  6 +-----
 .../camel/component/language/LanguageEndpoint.java | 12 ++++++++---
 .../camel/language/xquery/XQueryLanguage.java      |  6 +-----
 .../apache/camel/language/wasm/WasmLanguage.java   |  6 +-----
 .../apache/camel/language/xpath/XPathLanguage.java | 14 +++++--------
 .../reifier/language/JavaExpressionReifier.java    |  4 ++--
 .../reifier/language/JoorExpressionReifier.java    |  4 ++--
 .../language/MethodCallExpressionReifier.java      | 14 ++++++-------
 12 files changed, 40 insertions(+), 73 deletions(-)

diff --git 
a/components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanLanguage.java
 
b/components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanLanguage.java
index 785dddb5204..2939f1e8b13 100644
--- 
a/components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanLanguage.java
+++ 
b/components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanLanguage.java
@@ -86,10 +86,6 @@ public class BeanLanguage extends TypedLanguageSupport 
implements ScriptingLangu
             case "validate":
                 setValidate(PropertyConfigurerSupport.property(camelContext, 
Boolean.class, value));
                 return true;
-            case "resultType":
-            case "resulttype":
-                setResultType(PropertyConfigurerSupport.property(camelContext, 
Class.class, value));
-                return true;
             default:
                 return false;
         }
@@ -114,19 +110,19 @@ public class BeanLanguage extends TypedLanguageSupport 
implements ScriptingLangu
     public Expression createExpression(String expression, Object[] properties) 
{
         BeanExpression answer = null;
 
-        String method = property(String.class, properties, 1, null);
-        Object bean = property(Object.class, properties, 0, null);
+        Object bean = property(Object.class, properties, 1, null);
+        String method = property(String.class, properties, 2, null);
         if (bean != null) {
             answer = new BeanExpression(bean, method);
         }
         if (answer == null) {
-            Class<?> beanType = property(Class.class, properties, 2, null);
+            Class<?> beanType = property(Class.class, properties, 3, null);
             if (beanType != null) {
                 answer = new BeanExpression(beanType, method);
             }
         }
         if (answer == null) {
-            String ref = property(String.class, properties, 3, null);
+            String ref = property(String.class, properties, 4, null);
             if (ref != null) {
                 answer = new BeanExpression(ref, method);
             }
@@ -137,14 +133,14 @@ public class BeanLanguage extends TypedLanguageSupport 
implements ScriptingLangu
         if (answer == null) {
             throw new IllegalArgumentException("Bean language requires bean, 
beanType, or ref argument");
         }
-        Object scope = property(Object.class, properties, 4, null);
+        Object scope = property(Object.class, properties, 5, null);
         if (scope instanceof BeanScope) {
             answer.setScope((BeanScope) scope);
         } else if (scope != null) {
             answer.setScope(BeanScope.valueOf(scope.toString()));
         }
-        answer.setValidate(property(boolean.class, properties, 5, 
isValidate()));
-        answer.setResultType(property(Class.class, properties, 6, 
getResultType()));
+        answer.setValidate(property(boolean.class, properties, 6, 
isValidate()));
+        answer.setResultType(property(Class.class, properties, 0, null));
         answer.setBeanComponent(beanComponent);
         answer.setParameterMappingStrategy(parameterMappingStrategy);
         answer.setSimple(simple);
diff --git 
a/components/camel-datasonnet/src/main/java/org/apache/camel/language/datasonnet/DatasonnetLanguage.java
 
b/components/camel-datasonnet/src/main/java/org/apache/camel/language/datasonnet/DatasonnetLanguage.java
index 2c53f177adb..b3f5b24187c 100644
--- 
a/components/camel-datasonnet/src/main/java/org/apache/camel/language/datasonnet/DatasonnetLanguage.java
+++ 
b/components/camel-datasonnet/src/main/java/org/apache/camel/language/datasonnet/DatasonnetLanguage.java
@@ -27,19 +27,16 @@ import com.datasonnet.Mapper;
 import com.datasonnet.document.MediaType;
 import io.github.classgraph.ClassGraph;
 import io.github.classgraph.ScanResult;
-import org.apache.camel.CamelContext;
 import org.apache.camel.Expression;
 import org.apache.camel.Predicate;
-import org.apache.camel.spi.PropertyConfigurer;
 import org.apache.camel.spi.annotations.Language;
 import org.apache.camel.support.LRUCacheFactory;
 import org.apache.camel.support.TypedLanguageSupport;
-import org.apache.camel.support.component.PropertyConfigurerSupport;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Language("datasonnet")
-public class DatasonnetLanguage extends TypedLanguageSupport implements 
PropertyConfigurer {
+public class DatasonnetLanguage extends TypedLanguageSupport {
     private static final Logger LOG = 
LoggerFactory.getLogger(DatasonnetLanguage.class);
 
     private static final Map<String, String> CLASSPATH_IMPORTS = new 
HashMap<>();
@@ -84,7 +81,7 @@ public class DatasonnetLanguage extends TypedLanguageSupport 
implements Property
         expression = loadResource(expression);
 
         DatasonnetExpression answer = new DatasonnetExpression(expression);
-        answer.setResultType(property(Class.class, properties, 0, 
getResultType()));
+        answer.setResultType(property(Class.class, properties, 0, null));
         String mediaType = property(String.class, properties, 1, null);
         if (mediaType != null) {
             answer.setBodyMediaType(MediaType.valueOf(mediaType));
@@ -111,20 +108,4 @@ public class DatasonnetLanguage extends 
TypedLanguageSupport implements Property
         return CLASSPATH_IMPORTS;
     }
 
-    @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;
-            default:
-                return false;
-        }
-    }
-
 }
diff --git 
a/components/camel-joor/src/main/java/org/apache/camel/language/joor/JavaLanguage.java
 
b/components/camel-joor/src/main/java/org/apache/camel/language/joor/JavaLanguage.java
index 057222b1dfa..1b246cac11a 100644
--- 
a/components/camel-joor/src/main/java/org/apache/camel/language/joor/JavaLanguage.java
+++ 
b/components/camel-joor/src/main/java/org/apache/camel/language/joor/JavaLanguage.java
@@ -129,8 +129,8 @@ public class JavaLanguage extends TypedLanguageSupport 
implements ScriptingLangu
     public Expression createExpression(String expression, Object[] properties) 
{
         JoorExpression answer = new JoorExpression(expression);
         answer.setCompiler(compiler);
-        answer.setPreCompile(property(boolean.class, properties, 0, 
preCompile));
-        answer.setResultType(property(Class.class, properties, 1, 
getResultType()));
+        answer.setResultType(property(Class.class, properties, 0, null));
+        answer.setPreCompile(property(boolean.class, properties, 1, 
preCompile));
         answer.setSingleQuotes(property(boolean.class, properties, 2, 
singleQuotes));
         if (getCamelContext() != null) {
             answer.init(getCamelContext());
diff --git 
a/components/camel-jq/src/main/java/org/apache/camel/language/jq/JqLanguage.java
 
b/components/camel-jq/src/main/java/org/apache/camel/language/jq/JqLanguage.java
index 9be23525b60..2686e84b437 100644
--- 
a/components/camel-jq/src/main/java/org/apache/camel/language/jq/JqLanguage.java
+++ 
b/components/camel-jq/src/main/java/org/apache/camel/language/jq/JqLanguage.java
@@ -58,7 +58,7 @@ public class JqLanguage extends 
SingleInputTypedLanguageSupport implements Stati
     @Override
     public Expression createExpression(Expression source, String expression, 
Object[] properties) {
         JqExpression answer = new JqExpression(Scope.newChildScope(rootScope), 
expression);
-        answer.setResultType(property(Class.class, properties, 0, 
getResultType()));
+        answer.setResultType(property(Class.class, properties, 0, null));
         answer.setSource(source);
         if (getCamelContext() != null) {
             answer.init(getCamelContext());
diff --git 
a/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathLanguage.java
 
b/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathLanguage.java
index c370359cb3a..233b8689900 100644
--- 
a/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathLanguage.java
+++ 
b/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathLanguage.java
@@ -104,7 +104,7 @@ public class JsonPathLanguage extends 
SingleInputTypedLanguageSupport implements
         JsonPathExpression answer = new JsonPathExpression(expression);
         answer.setSource(source);
         answer.setPredicate(predicate);
-        answer.setResultType(property(Class.class, properties, 0, 
getResultType()));
+        answer.setResultType(property(Class.class, properties, 0, null));
         answer.setSuppressExceptions(property(boolean.class, properties, 4, 
isSuppressExceptions()));
         answer.setAllowSimple(property(boolean.class, properties, 5, 
isAllowSimple()));
         answer.setAllowEasyPredicate(property(boolean.class, properties, 6, 
isAllowEasyPredicate()));
@@ -151,10 +151,6 @@ public class JsonPathLanguage extends 
SingleInputTypedLanguageSupport implements
         }
 
         switch (ignoreCase ? name.toLowerCase() : name) {
-            case "resulttype":
-            case "resultType":
-                setResultType(PropertyConfigurerSupport.property(camelContext, 
Class.class, value));
-                return true;
             case "suppressexceptions":
             case "suppressExceptions":
                 
setSuppressExceptions(PropertyConfigurerSupport.property(camelContext, 
boolean.class, value));
diff --git 
a/components/camel-language/src/main/java/org/apache/camel/component/language/LanguageEndpoint.java
 
b/components/camel-language/src/main/java/org/apache/camel/component/language/LanguageEndpoint.java
index b11f673bede..3d1ef2598d8 100644
--- 
a/components/camel-language/src/main/java/org/apache/camel/component/language/LanguageEndpoint.java
+++ 
b/components/camel-language/src/main/java/org/apache/camel/component/language/LanguageEndpoint.java
@@ -48,7 +48,8 @@ import org.apache.camel.util.IOHelper;
  * defined as well.
  */
 @UriEndpoint(firstVersion = "2.5.0", scheme = "language", title = "Language", 
syntax = "language:languageName:resourceUri",
-             remote = false, producerOnly = true, category = { Category.CORE, 
Category.SCRIPT }, headersClass = LanguageConstants.class)
+             remote = false, producerOnly = true, category = { Category.CORE, 
Category.SCRIPT },
+             headersClass = LanguageConstants.class)
 public class LanguageEndpoint extends ResourceEndpoint {
     private Language language;
     private Expression expression;
@@ -93,16 +94,21 @@ public class LanguageEndpoint extends ResourceEndpoint {
         if (language == null && languageName != null) {
             language = getCamelContext().resolveLanguage(languageName);
         }
+        Object[] arr = null;
         if (language instanceof TypedLanguageSupport && resultType != null) {
             Class<?> clazz = 
getCamelContext().getClassResolver().resolveMandatoryClass(resultType);
-            ((TypedLanguageSupport) language).setResultType(clazz);
+            arr = new Object[] { clazz };
         }
         if (cacheScript && expression == null && script != null) {
             boolean external = script.startsWith("file:") || 
script.startsWith("http:");
             if (!external) {
                 // we can pre optimize this as the script can be loaded from 
classpath or registry etc
                 script = resolveScript(script);
-                expression = language.createExpression(script);
+                if (arr != null) {
+                    expression = language.createExpression(script, arr);
+                } else {
+                    expression = language.createExpression(script);
+                }
             }
         }
         if (expression != null) {
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 6fd03362817..cf1554b837c 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
@@ -53,7 +53,7 @@ public class XQueryLanguage extends 
SingleInputTypedLanguageSupport implements P
     protected void configureBuilder(XQueryBuilder builder, Object[] 
properties, Expression source) {
         builder.setSource(source);
 
-        Class<?> clazz = property(Class.class, properties, 0, getResultType());
+        Class<?> clazz = property(Class.class, properties, 0, null);
         if (clazz != null) {
             builder.setResultType(clazz);
         }
@@ -68,10 +68,6 @@ public class XQueryLanguage extends 
SingleInputTypedLanguageSupport implements P
             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 "configuration":
             case "Configuration":
                 
setConfiguration(PropertyConfigurerSupport.property(camelContext, 
Configuration.class, value));
diff --git 
a/components/camel-wasm/src/main/java/org/apache/camel/language/wasm/WasmLanguage.java
 
b/components/camel-wasm/src/main/java/org/apache/camel/language/wasm/WasmLanguage.java
index 62632ea79ae..07579ec2418 100644
--- 
a/components/camel-wasm/src/main/java/org/apache/camel/language/wasm/WasmLanguage.java
+++ 
b/components/camel-wasm/src/main/java/org/apache/camel/language/wasm/WasmLanguage.java
@@ -49,10 +49,6 @@ public class WasmLanguage extends TypedLanguageSupport 
implements PropertyConfig
         }
 
         switch (ignoreCase ? name.toLowerCase() : name) {
-            case "resulttype":
-            case "resultType":
-                setResultType(PropertyConfigurerSupport.property(camelContext, 
Class.class, value));
-                return true;
             case "module":
                 setModule(PropertyConfigurerSupport.property(camelContext, 
String.class, value));
                 return true;
@@ -79,7 +75,7 @@ public class WasmLanguage extends TypedLanguageSupport 
implements PropertyConfig
     @Override
     public Expression createExpression(String expression, Object[] properties) 
{
         WasmExpression answer = new WasmExpression(expression);
-        answer.setResultType(property(Class.class, properties, 0, 
getResultType()));
+        answer.setResultType(property(Class.class, properties, 0, null));
         answer.setModule(property(String.class, properties, 1, getModule()));
         if (getCamelContext() != null) {
             answer.init(getCamelContext());
diff --git 
a/components/camel-xpath/src/main/java/org/apache/camel/language/xpath/XPathLanguage.java
 
b/components/camel-xpath/src/main/java/org/apache/camel/language/xpath/XPathLanguage.java
index a0e158f5010..2156f392c1a 100644
--- 
a/components/camel-xpath/src/main/java/org/apache/camel/language/xpath/XPathLanguage.java
+++ 
b/components/camel-xpath/src/main/java/org/apache/camel/language/xpath/XPathLanguage.java
@@ -130,7 +130,11 @@ public class XPathLanguage extends 
SingleInputTypedLanguageSupport implements Pr
     protected void configureBuilder(XPathBuilder builder, Object[] properties, 
Expression source) {
         builder.setSource(source);
 
-        Class<?> clazz = property(Class.class, properties, 4, documentType);
+        Class<?> clazz = property(Class.class, properties, 0, null);
+        if (clazz != null) {
+            builder.setResultType(clazz);
+        }
+        clazz = property(Class.class, properties, 4, documentType);
         if (clazz != null) {
             builder.setDocumentType(clazz);
         }
@@ -138,10 +142,6 @@ public class XPathLanguage extends 
SingleInputTypedLanguageSupport implements Pr
         if (qname != null) {
             builder.setResultQName(qname);
         }
-        clazz = property(Class.class, properties, 0, getResultType());
-        if (clazz != null) {
-            builder.setResultType(clazz);
-        }
         Boolean bool = property(Boolean.class, properties, 6, saxon);
         if (bool != null) {
             builder.setUseSaxon(bool);
@@ -185,10 +185,6 @@ public class XPathLanguage extends 
SingleInputTypedLanguageSupport implements Pr
         }
         switch (ignoreCase ? name.toLowerCase() : name) {
             case "resulttype":
-            case "resultType":
-                setResultType(PropertyConfigurerSupport.property(camelContext, 
Class.class, value));
-                return true;
-            case "resultqname":
             case "resultQName":
                 
setResultQName(PropertyConfigurerSupport.property(camelContext, QName.class, 
value));
                 return true;
diff --git 
a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/JavaExpressionReifier.java
 
b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/JavaExpressionReifier.java
index d48571dfb64..4245dc83d40 100644
--- 
a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/JavaExpressionReifier.java
+++ 
b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/JavaExpressionReifier.java
@@ -29,8 +29,8 @@ public class JavaExpressionReifier extends 
TypedExpressionReifier<JavaExpression
     @Override
     protected Object[] createProperties() {
         Object[] properties = new Object[3];
-        properties[0] = parseBoolean(definition.getPreCompile());
-        properties[1] = definition.getResultType();
+        properties[0] = definition.getResultType();
+        properties[1] = parseBoolean(definition.getPreCompile());
         properties[2] = parseBoolean(definition.getSingleQuotes());
         return properties;
     }
diff --git 
a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/JoorExpressionReifier.java
 
b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/JoorExpressionReifier.java
index c986b64535a..71b787bdd81 100644
--- 
a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/JoorExpressionReifier.java
+++ 
b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/JoorExpressionReifier.java
@@ -30,8 +30,8 @@ public class JoorExpressionReifier extends 
TypedExpressionReifier<JoorExpression
     @Override
     protected Object[] createProperties() {
         Object[] properties = new Object[3];
-        properties[0] = parseBoolean(definition.getPreCompile());
-        properties[1] = definition.getResultType();
+        properties[0] = definition.getResultType();
+        properties[1] = parseBoolean(definition.getPreCompile());
         properties[2] = parseBoolean(definition.getSingleQuotes());
         return properties;
     }
diff --git 
a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/MethodCallExpressionReifier.java
 
b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/MethodCallExpressionReifier.java
index 2269903b5c6..7a6530c1e7c 100644
--- 
a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/MethodCallExpressionReifier.java
+++ 
b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/MethodCallExpressionReifier.java
@@ -31,13 +31,13 @@ public class MethodCallExpressionReifier extends 
TypedExpressionReifier<MethodCa
     @Override
     protected Object[] createProperties() {
         Object[] properties = new Object[7];
-        properties[0] = definition.getInstance();
-        properties[1] = parseString(definition.getMethod());
-        properties[2] = definition.getBeanType();
-        properties[3] = parseString(definition.getRef());
-        properties[4] = parseString(definition.getScope());
-        properties[5] = parseString(definition.getValidate());
-        properties[6] = definition.getResultType();
+        properties[0] = definition.getResultType();
+        properties[1] = definition.getInstance();
+        properties[2] = parseString(definition.getMethod());
+        properties[3] = definition.getBeanType();
+        properties[4] = parseString(definition.getRef());
+        properties[5] = parseString(definition.getScope());
+        properties[6] = parseString(definition.getValidate());
         return properties;
     }
 

Reply via email to