This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push: new ca3e54436e8 camel-python - Add options like other languages have in DSL ca3e54436e8 is described below commit ca3e54436e8b4bd4242e577b2b05de589a7e56ba Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Sat Nov 19 17:38:56 2022 +0100 camel-python - Add options like other languages have in DSL --- .../org/apache/camel/language/python/package.html | 2 +- .../src/test/resources/log4j2.properties | 2 +- .../org/apache/camel/model/language/python.json | 2 + .../org/apache/camel/builder/ExpressionClause.java | 11 +++ .../camel/builder/ExpressionClauseSupport.java | 13 +++ .../camel/model/language/PythonExpression.java | 108 ++++++++++++++++++++- .../camel/reifier/language/ExpressionReifier.java | 2 +- .../reifier/language/PythonExpressionReifier.java | 63 ++++++++++++ .../java/org/apache/camel/xml/in/ModelParser.java | 16 ++- .../dsl/yaml/deserializers/ModelDeserializers.java | 12 +++ .../generated/resources/schema/camel-yaml-dsl.json | 6 ++ .../generated/resources/schema/camelYamlDsl.json | 6 ++ 12 files changed, 236 insertions(+), 7 deletions(-) diff --git a/components/camel-python/src/main/java/org/apache/camel/language/python/package.html b/components/camel-python/src/main/java/org/apache/camel/language/python/package.html index 93bfb86b6eb..71ce9639e0c 100644 --- a/components/camel-python/src/main/java/org/apache/camel/language/python/package.html +++ b/components/camel-python/src/main/java/org/apache/camel/language/python/package.html @@ -21,7 +21,7 @@ </head> <body> -A <a href="http://activemq.apache.org/camel/language.html">Language Plugin</a> for the Python Language. +A language plugin for the Python Language. </body> </html> diff --git a/components/camel-python/src/test/resources/log4j2.properties b/components/camel-python/src/test/resources/log4j2.properties index 5f9c62c74eb..f8e3be0c7d4 100644 --- a/components/camel-python/src/test/resources/log4j2.properties +++ b/components/camel-python/src/test/resources/log4j2.properties @@ -17,7 +17,7 @@ appender.file.type = File appender.file.name = file -appender.file.fileName = target/camel-ognl-test.log +appender.file.fileName = target/camel-python-test.log appender.file.layout.type = PatternLayout appender.file.layout.pattern = %d [%-15.15t] %-5p %-30.30c{1} - %m%n appender.out.type = Console diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/python.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/python.json index 80da79cc1d0..051b931520a 100644 --- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/python.json +++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/python.json @@ -14,6 +14,8 @@ }, "properties": { "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" }, + "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" }, + "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body It has as higher precedent than the propertyName if both are set." }, "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" }, "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" } } diff --git a/core/camel-core-model/src/main/java/org/apache/camel/builder/ExpressionClause.java b/core/camel-core-model/src/main/java/org/apache/camel/builder/ExpressionClause.java index a4a530e2d07..b0f62c4b64d 100644 --- a/core/camel-core-model/src/main/java/org/apache/camel/builder/ExpressionClause.java +++ b/core/camel-core-model/src/main/java/org/apache/camel/builder/ExpressionClause.java @@ -602,6 +602,17 @@ public class ExpressionClause<T> implements Expression, Predicate { return delegate.python(text); } + /** + * Evaluates a Python expression. + * + * @param text the expression to be evaluated + * @param resultType the return type expected by the expression + * @return the builder to continue processing the DSL + */ + public T python(String text, Class<?> resultType) { + return delegate.python(text, resultType); + } + /** * Evaluates a <a href="http://camel.apache.org/mvel.html">MVEL expression</a> * diff --git a/core/camel-core-model/src/main/java/org/apache/camel/builder/ExpressionClauseSupport.java b/core/camel-core-model/src/main/java/org/apache/camel/builder/ExpressionClauseSupport.java index dcbd67aa941..e228e26f301 100644 --- a/core/camel-core-model/src/main/java/org/apache/camel/builder/ExpressionClauseSupport.java +++ b/core/camel-core-model/src/main/java/org/apache/camel/builder/ExpressionClauseSupport.java @@ -715,6 +715,19 @@ public class ExpressionClauseSupport<T> implements ExpressionFactoryAware, Predi return expression(new PythonExpression(text)); } + /** + * Evaluates Python expression + * + * @param text the expression to be evaluated + * @param resultType the return type expected by the expression + * @return the builder to continue processing the DSL + */ + public T python(String text, Class<?> resultType) { + PythonExpression exp = new PythonExpression(text); + exp.setResultType(resultType); + return expression(exp); + } + /** * Evaluates a <a href="http://camel.apache.org/mvel.html">MVEL expression</a> * diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/language/PythonExpression.java b/core/camel-core-model/src/main/java/org/apache/camel/model/language/PythonExpression.java index ccdacd7cb37..0b3cba33ad4 100644 --- a/core/camel-core-model/src/main/java/org/apache/camel/model/language/PythonExpression.java +++ b/core/camel-core-model/src/main/java/org/apache/camel/model/language/PythonExpression.java @@ -18,6 +18,7 @@ package org.apache.camel.model.language; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; @@ -31,6 +32,16 @@ import org.apache.camel.spi.Metadata; @XmlAccessorType(XmlAccessType.FIELD) public class PythonExpression extends ExpressionDefinition { + @XmlAttribute(name = "resultType") + private String resultTypeName; + @XmlTransient + private Class<?> resultType; + @XmlAttribute + @Metadata(label = "advanced") + private String headerName; + @Metadata(label = "advanced") + private String propertyName; + public PythonExpression() { } @@ -38,8 +49,12 @@ public class PythonExpression extends ExpressionDefinition { super(expression); } - private PythonExpression(Builder builder) { + private PythonExpression(PythonExpression.Builder builder) { super(builder); + this.resultTypeName = builder.resultTypeName; + this.resultType = builder.resultType; + this.headerName = builder.headerName; + this.propertyName = builder.propertyName; } @Override @@ -47,11 +62,100 @@ public class PythonExpression extends ExpressionDefinition { return "python"; } + public String getResultTypeName() { + return resultTypeName; + } + + /** + * Sets the class of the result type (type from output) + */ + public void setResultTypeName(String resultTypeName) { + this.resultTypeName = resultTypeName; + } + + public Class<?> getResultType() { + return resultType; + } + + /** + * Sets the class name of the result type (type from output) + */ + public void setResultType(Class<?> resultType) { + this.resultType = resultType; + } + + public String getHeaderName() { + return headerName; + } + + /** + * Name of header to use as input, instead of the message body + * </p> + * It has as higher precedent than the propertyName if both are set. + */ + public void setHeaderName(String headerName) { + this.headerName = headerName; + } + + public String getPropertyName() { + return propertyName; + } + + /** + * Name of property to use as input, instead of the message body. + * </p> + * It has a lower precedent than the headerName if both are set. + */ + public void setPropertyName(String propertyName) { + this.propertyName = propertyName; + } + /** * {@code Builder} is a specific builder for {@link PythonExpression}. */ @XmlTransient - public static class Builder extends AbstractBuilder<Builder, PythonExpression> { + public static class Builder extends AbstractBuilder<PythonExpression.Builder, PythonExpression> { + + private String resultTypeName; + private Class<?> resultType; + private String headerName; + private String propertyName; + + /** + * Sets the class name of the result type (type from output) + */ + public PythonExpression.Builder resultType(Class<?> resultType) { + this.resultType = resultType; + return this; + } + + /** + * Sets the class of the result type (type from output) + */ + public PythonExpression.Builder resultTypeName(String resultTypeName) { + this.resultTypeName = resultTypeName; + return this; + } + + /** + * Name of header to use as input, instead of the message body + * </p> + * It has as higher precedent than the propertyName if both are set. + */ + public PythonExpression.Builder headerName(String headerName) { + this.headerName = headerName; + return this; + } + + /** + * Name of property to use as input, instead of the message body. + * </p> + * It has a lower precedent than the headerName if both are set. + */ + public PythonExpression.Builder propertyName(String propertyName) { + this.propertyName = propertyName; + return this; + } @Override public PythonExpression end() { diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/ExpressionReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/ExpressionReifier.java index 8b92265d6b0..adbc3216ea2 100644 --- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/ExpressionReifier.java +++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/ExpressionReifier.java @@ -144,7 +144,7 @@ public class ExpressionReifier<T extends ExpressionDefinition> extends AbstractR } else if (definition instanceof OgnlExpression) { return new ExpressionReifier<>(camelContext, definition); } else if (definition instanceof PythonExpression) { - return new ExpressionReifier<>(camelContext, definition); + return new PythonExpressionReifier(camelContext, definition); } else if (definition instanceof RefExpression) { return new ExpressionReifier<>(camelContext, definition); } else if (definition instanceof SimpleExpression) { diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/PythonExpressionReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/PythonExpressionReifier.java new file mode 100644 index 00000000000..5c4f8394644 --- /dev/null +++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/PythonExpressionReifier.java @@ -0,0 +1,63 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.reifier.language; + +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.PythonExpression; +import org.apache.camel.spi.Language; + +public class PythonExpressionReifier extends ExpressionReifier<PythonExpression> { + + public PythonExpressionReifier(CamelContext camelContext, ExpressionDefinition definition) { + super(camelContext, (PythonExpression) definition); + } + + @Override + protected void configureLanguage(Language language) { + if (definition.getResultType() == null && definition.getResultTypeName() != null) { + try { + Class<?> clazz = camelContext.getClassResolver().resolveMandatoryClass(definition.getResultTypeName()); + definition.setResultType(clazz); + } catch (ClassNotFoundException e) { + throw RuntimeCamelException.wrapRuntimeException(e); + } + } + } + + private Object[] createProperties() { + Object[] properties = new Object[3]; + properties[0] = definition.getResultType(); + properties[1] = parseString(definition.getHeaderName()); + properties[2] = parseString(definition.getPropertyName()); + return properties; + } + + @Override + protected Expression createExpression(Language language, String exp) { + return language.createExpression(exp, createProperties()); + } + + @Override + protected Predicate createPredicate(Language language, String exp) { + return language.createPredicate(exp, createProperties()); + } + +} diff --git a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java index 8c42d7c8d54..e551c10dbf2 100644 --- a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java +++ b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java @@ -2730,8 +2730,20 @@ public class ModelParser extends BaseParser { expressionDefinitionAttributeHandler(), noElementHandler(), expressionDefinitionValueHandler()); } protected PythonExpression doParsePythonExpression() throws IOException, XmlPullParserException { - return doParse(new PythonExpression(), - expressionDefinitionAttributeHandler(), noElementHandler(), expressionDefinitionValueHandler()); + return doParse(new PythonExpression(), (def, key, val) -> { + switch (key) { + case "headerName": def.setHeaderName(val); break; + case "resultType": def.setResultTypeName(val); break; + default: return expressionDefinitionAttributeHandler().accept(def, key, val); + } + return true; + }, (def, key) -> { + if ("propertyName".equals(key)) { + def.setPropertyName(doParseText()); + return true; + } + return false; + }, expressionDefinitionValueHandler()); } protected RefExpression doParseRefExpression() throws IOException, XmlPullParserException { return doParse(new RefExpression(), diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java index cd155034841..15a322dc1c1 100644 --- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java @@ -11053,7 +11053,9 @@ public final class ModelDeserializers extends YamlDeserializerSupport { order = org.apache.camel.dsl.yaml.common.YamlDeserializerResolver.ORDER_LOWEST - 1, properties = { @YamlProperty(name = "expression", type = "string", required = true), + @YamlProperty(name = "header-name", type = "string"), @YamlProperty(name = "id", type = "string"), + @YamlProperty(name = "result-type", type = "string"), @YamlProperty(name = "trim", type = "boolean") } ) @@ -11081,11 +11083,21 @@ public final class ModelDeserializers extends YamlDeserializerSupport { target.setExpression(val); break; } + case "header-name": { + String val = asText(node); + target.setHeaderName(val); + break; + } case "id": { String val = asText(node); target.setId(val); break; } + case "result-type": { + String val = asText(node); + target.setResultTypeName(val); + break; + } case "trim": { String val = asText(node); target.setTrim(val); diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camel-yaml-dsl.json b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camel-yaml-dsl.json index 36aefdb47a9..13ac9e2cb60 100644 --- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camel-yaml-dsl.json +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camel-yaml-dsl.json @@ -6594,9 +6594,15 @@ "expression" : { "type" : "string" }, + "header-name" : { + "type" : "string" + }, "id" : { "type" : "string" }, + "result-type" : { + "type" : "string" + }, "trim" : { "type" : "boolean" } diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json index 7fbdd3f82bb..a3c13a67167 100644 --- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json @@ -6495,9 +6495,15 @@ "expression" : { "type" : "string" }, + "headerName" : { + "type" : "string" + }, "id" : { "type" : "string" }, + "resultType" : { + "type" : "string" + }, "trim" : { "type" : "boolean" }