This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch js in repository https://gitbox.apache.org/repos/asf/camel.git
commit 8938663cda29bda3a94c3535c0f2e27893c6cadd Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Sat Nov 19 10:36:04 2022 +0100 CAMEL-18718: camel-javascript --- catalog/camel-allcomponents/pom.xml | 4 + components/camel-javascript/pom.xml | 68 +++++++++ .../services/org/apache/camel/language.properties | 7 + .../META-INF/services/org/apache/camel/language/js | 2 + .../resources/org/apache/camel/language/js/js.json | 25 ++++ .../src/main/docs/js-language.adoc | 65 ++++++++ .../camel/language/js/JavaScriptExpression.java | 72 +++++++++ .../camel/language/js/JavaScriptLanguage.java | 58 ++++++++ .../java/org/apache/camel/language/js/package.html | 27 ++++ .../camel/language/js/JavaScriptChoiceTest.java | 54 +++++++ .../apache/camel/language/js/JavaScriptTest.java | 35 +++++ .../src/test/resources/log4j2.properties | 28 ++++ .../services/org/apache/camel/model.properties | 1 + .../org/apache/camel/model/aggregate.json | 8 +- .../resources/org/apache/camel/model/delay.json | 2 +- .../org/apache/camel/model/dynamicRouter.json | 2 +- .../resources/org/apache/camel/model/enrich.json | 2 +- .../resources/org/apache/camel/model/filter.json | 2 +- .../org/apache/camel/model/idempotentConsumer.json | 2 +- .../org/apache/camel/model/language/jaxb.index | 1 + .../org/apache/camel/model/language/js.json | 22 +++ .../apache/camel/model/loadbalancer/sticky.json | 2 +- .../resources/org/apache/camel/model/loop.json | 2 +- .../org/apache/camel/model/onException.json | 6 +- .../org/apache/camel/model/pollEnrich.json | 2 +- .../org/apache/camel/model/propertyExpression.json | 2 +- .../org/apache/camel/model/recipientList.json | 2 +- .../org/apache/camel/model/resequence.json | 2 +- .../org/apache/camel/model/routingSlip.json | 2 +- .../resources/org/apache/camel/model/script.json | 2 +- .../resources/org/apache/camel/model/setBody.json | 2 +- .../org/apache/camel/model/setHeader.json | 2 +- .../org/apache/camel/model/setProperty.json | 2 +- .../resources/org/apache/camel/model/sort.json | 2 +- .../resources/org/apache/camel/model/split.json | 2 +- .../resources/org/apache/camel/model/throttle.json | 4 +- .../org/apache/camel/model/transform.json | 2 +- .../resources/org/apache/camel/model/validate.json | 2 +- .../resources/org/apache/camel/model/when.json | 2 +- .../apache/camel/model/whenSkipSendToEndpoint.json | 2 +- .../org/apache/camel/builder/ExpressionClause.java | 14 ++ .../camel/builder/ExpressionClauseSupport.java | 24 +++ .../camel/builder/LanguageBuilderFactory.java | 8 + .../camel/model/language/JavaScriptExpression.java | 165 +++++++++++++++++++++ .../camel/reifier/language/ExpressionReifier.java | 3 + .../language/JavaScriptExpressionReifier.java | 64 ++++++++ .../java/org/apache/camel/xml/in/ModelParser.java | 17 +++ parent/pom.xml | 5 + 48 files changed, 800 insertions(+), 31 deletions(-) diff --git a/catalog/camel-allcomponents/pom.xml b/catalog/camel-allcomponents/pom.xml index a6de09655bd..bdf84996f06 100644 --- a/catalog/camel-allcomponents/pom.xml +++ b/catalog/camel-allcomponents/pom.xml @@ -745,6 +745,10 @@ <groupId>org.apache.camel</groupId> <artifactId>camel-jasypt</artifactId> </dependency> + <dependency> + <groupId>org.apache.camel</groupId> + <artifactId>camel-javascript</artifactId> + </dependency> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-jaxb</artifactId> diff --git a/components/camel-javascript/pom.xml b/components/camel-javascript/pom.xml new file mode 100644 index 00000000000..15467464b40 --- /dev/null +++ b/components/camel-javascript/pom.xml @@ -0,0 +1,68 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + + 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. + +--> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>org.apache.camel</groupId> + <artifactId>components</artifactId> + <version>3.20.0-SNAPSHOT</version> + </parent> + + <artifactId>camel-javascript</artifactId> + <packaging>jar</packaging> + <name>Camel :: JavaScript</name> + <description>Camel JavaScript language</description> + + <properties> + <supportLevel>Experimental</supportLevel> + </properties> + + <dependencies> + <dependency> + <groupId>org.apache.camel</groupId> + <artifactId>camel-support</artifactId> + </dependency> + + <dependency> + <groupId>org.graalvm.js</groupId> + <artifactId>js</artifactId> + <version>${graaljs-version}</version> + </dependency> + + <!-- testing --> + <dependency> + <groupId>org.apache.camel</groupId> + <artifactId>camel-test-junit5</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.apache.logging.log4j</groupId> + <artifactId>log4j-slf4j-impl</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.junit.jupiter</groupId> + <artifactId>junit-jupiter</artifactId> + <scope>test</scope> + </dependency> + </dependencies> + +</project> diff --git a/components/camel-javascript/src/generated/resources/META-INF/services/org/apache/camel/language.properties b/components/camel-javascript/src/generated/resources/META-INF/services/org/apache/camel/language.properties new file mode 100644 index 00000000000..968dc3f7e20 --- /dev/null +++ b/components/camel-javascript/src/generated/resources/META-INF/services/org/apache/camel/language.properties @@ -0,0 +1,7 @@ +# Generated by camel build tools - do NOT edit this file! +languages=js +groupId=org.apache.camel +artifactId=camel-javascript +version=3.20.0-SNAPSHOT +projectName=Camel :: JavaScript +projectDescription=Camel JavaScript language diff --git a/components/camel-javascript/src/generated/resources/META-INF/services/org/apache/camel/language/js b/components/camel-javascript/src/generated/resources/META-INF/services/org/apache/camel/language/js new file mode 100644 index 00000000000..bd445aaa7cd --- /dev/null +++ b/components/camel-javascript/src/generated/resources/META-INF/services/org/apache/camel/language/js @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.language.js.JavaScriptLanguage diff --git a/components/camel-javascript/src/generated/resources/org/apache/camel/language/js/js.json b/components/camel-javascript/src/generated/resources/org/apache/camel/language/js/js.json new file mode 100644 index 00000000000..3685b166e79 --- /dev/null +++ b/components/camel-javascript/src/generated/resources/org/apache/camel/language/js/js.json @@ -0,0 +1,25 @@ +{ + "language": { + "kind": "language", + "name": "js", + "title": "JavaScript", + "description": "Evaluates a JavaScript expression.", + "deprecated": false, + "firstVersion": "3.20.0", + "label": "language,javascript", + "javaType": "org.apache.camel.language.js.JavaScriptLanguage", + "supportLevel": "Experimental", + "groupId": "org.apache.camel", + "artifactId": "camel-javascript", + "version": "3.20.0-SNAPSHOT", + "modelName": "js", + "modelJavaType": "org.apache.camel.model.language.JavaScriptExpression" + }, + "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/components/camel-javascript/src/main/docs/js-language.adoc b/components/camel-javascript/src/main/docs/js-language.adoc new file mode 100644 index 00000000000..57efd19dbb3 --- /dev/null +++ b/components/camel-javascript/src/main/docs/js-language.adoc @@ -0,0 +1,65 @@ += JavaScript Language +:doctitle: JavaScript +:shortname: js +:artifactid: camel-javascript +:description: Evaluates a JavaScript expression. +:since: 3.20 +:supportlevel: Experimental +//Manually maintained attributes +:camel-spring-boot-name: javascript + +*Since Camel {since}* + +Camel allows https://www.graalvm.org/javascript/[JavaScript] to be +used as an xref:manual::expression.adoc[Expression] or xref:manual::predicate.adoc[Predicate] +in Camel routes. + +For example, you can use JavaScript in a xref:manual::predicate.adoc[Predicate] +with the xref:eips:choice-eip.adoc[Content Based Router] EIP. + +== JavaScript Options + + +// language options: START +include::partial$language-options.adoc[] +// language options: END + + + + +== Variables + +[width="100%",cols="10%,10%,80%",options="header",] +|======================================================================= +|Variable |Type |Description +|*this* |Exchange |the Exchange is the root object +|context |CamelContext |the CamelContext +|exchange |Exchange |the Exchange +|exchangeId |String |the exchange id +|message |Message |the message +|body |Message |the message body +|headers |Map |the message headers +|properties |Map |the exchange properties +|======================================================================= + + +== Dependencies + +To use JavaScript in your camel routes you need to add the dependency on +*camel-javascript* which implements the JavaScript language (JavaScript with GraalVM). + +If you use maven you could just add the following to your pom.xml, +substituting the version number for the latest & greatest release (see +the download page for the latest versions). + +[source,xml] +------------------------------------- +<dependency> + <groupId>org.apache.camel</groupId> + <artifactId>camel-javascript</artifactId> + <version>x.x.x</version> +</dependency> +------------------------------------- + + +include::spring-boot:partial$starter.adoc[] diff --git a/components/camel-javascript/src/main/java/org/apache/camel/language/js/JavaScriptExpression.java b/components/camel-javascript/src/main/java/org/apache/camel/language/js/JavaScriptExpression.java new file mode 100644 index 00000000000..226a9993492 --- /dev/null +++ b/components/camel-javascript/src/main/java/org/apache/camel/language/js/JavaScriptExpression.java @@ -0,0 +1,72 @@ +/* + * 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.language.js; + +import org.apache.camel.Exchange; +import org.apache.camel.support.ExpressionSupport; +import org.graalvm.polyglot.Context; +import org.graalvm.polyglot.Value; + +public class JavaScriptExpression extends ExpressionSupport { + + private final String expressionString; + private final Class<?> type; + + public JavaScriptExpression(String expressionString, Class<?> type) { + this.expressionString = expressionString; + this.type = type; + } + + public static JavaScriptExpression js(String expression) { + return new JavaScriptExpression(expression, Object.class); + } + + @Override + protected String assertionFailureMessage(Exchange exchange) { + return expressionString; + } + + @Override + public <T> T evaluate(Exchange exchange, Class<T> type) { + Context cx = Context.newBuilder("js") + .allowIO(true) + .build(); + Value b = cx.getBindings("js"); + + b.putMember("exchange", exchange); + b.putMember("context", exchange.getContext()); + b.putMember("exchangeId", exchange.getExchangeId()); + b.putMember("message", exchange.getMessage()); + b.putMember("headers", exchange.getMessage().getHeaders()); + b.putMember("properties", exchange.getAllProperties()); + b.putMember("body", exchange.getMessage().getBody()); + + Value o = cx.eval("js", expressionString); + Object answer = o != null ? o.as(type) : null; + return type.cast(answer); + } + + public Class<?> getType() { + return type; + } + + @Override + public String toString() { + return "JavaScript[" + expressionString + "]"; + } + +} diff --git a/components/camel-javascript/src/main/java/org/apache/camel/language/js/JavaScriptLanguage.java b/components/camel-javascript/src/main/java/org/apache/camel/language/js/JavaScriptLanguage.java new file mode 100644 index 00000000000..3ca43ae5de8 --- /dev/null +++ b/components/camel-javascript/src/main/java/org/apache/camel/language/js/JavaScriptLanguage.java @@ -0,0 +1,58 @@ +/* + * 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.language.js; + +import java.util.Map; + +import org.apache.camel.Expression; +import org.apache.camel.Predicate; +import org.apache.camel.spi.ScriptingLanguage; +import org.apache.camel.spi.annotations.Language; +import org.apache.camel.support.LanguageSupport; +import org.graalvm.polyglot.Context; +import org.graalvm.polyglot.Value; + +@Language("js") +public class JavaScriptLanguage extends LanguageSupport implements ScriptingLanguage { + + @Override + public Predicate createPredicate(String expression) { + expression = loadResource(expression); + return new JavaScriptExpression(expression, Boolean.class); + } + + @Override + public Expression createExpression(String expression) { + expression = loadResource(expression); + return new JavaScriptExpression(expression, Object.class); + } + + @Override + public <T> T evaluate(String script, Map<String, Object> bindings, Class<T> resultType) { + script = loadResource(script); + + Context cx = Context.newBuilder("js") + .allowIO(true) + .build(); + Value b = cx.getBindings("js"); + + bindings.forEach(b::putMember); + Value o = cx.eval("js", script); + Object answer = o != null ? o.as(resultType) : null; + return resultType.cast(answer); + } +} diff --git a/components/camel-javascript/src/main/java/org/apache/camel/language/js/package.html b/components/camel-javascript/src/main/java/org/apache/camel/language/js/package.html new file mode 100644 index 00000000000..72b0fbe1ac9 --- /dev/null +++ b/components/camel-javascript/src/main/java/org/apache/camel/language/js/package.html @@ -0,0 +1,27 @@ +<!-- + + 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. + +--> +<html> +<head> +</head> +<body> + +A language plugin for the JavaScript Language. + +</body> +</html> diff --git a/components/camel-javascript/src/test/java/org/apache/camel/language/js/JavaScriptChoiceTest.java b/components/camel-javascript/src/test/java/org/apache/camel/language/js/JavaScriptChoiceTest.java new file mode 100644 index 00000000000..402f3f988fa --- /dev/null +++ b/components/camel-javascript/src/test/java/org/apache/camel/language/js/JavaScriptChoiceTest.java @@ -0,0 +1,54 @@ +/* + * 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.language.js; + +import org.apache.camel.RoutesBuilder; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.test.junit5.CamelTestSupport; +import org.junit.jupiter.api.Test; + +public class JavaScriptChoiceTest extends CamelTestSupport { + + @Test + public void testJavaScriptChoice() throws Exception { + getMockEndpoint("mock:foo").expectedBodiesReceived("Hello"); + getMockEndpoint("mock:bar").expectedBodiesReceived("Bye"); + getMockEndpoint("mock:other").expectedBodiesReceived("Hi World"); + + template.sendBody("direct:start", "Bye"); + template.sendBody("direct:start", "Hi World"); + template.sendBody("direct:start", "Hello"); + + MockEndpoint.assertIsSatisfied(context); + } + + @Override + protected RoutesBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("direct:start") + .choice() + .when().js("body == 'Hello'").to("mock:foo") + .when().js("body == 'Bye'").to("mock:bar") + .otherwise().to("mock:other"); + } + }; + } + +} diff --git a/components/camel-javascript/src/test/java/org/apache/camel/language/js/JavaScriptTest.java b/components/camel-javascript/src/test/java/org/apache/camel/language/js/JavaScriptTest.java new file mode 100644 index 00000000000..c57ba2b708a --- /dev/null +++ b/components/camel-javascript/src/test/java/org/apache/camel/language/js/JavaScriptTest.java @@ -0,0 +1,35 @@ +/* + * 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.language.js; + +import org.apache.camel.test.junit5.LanguageTestSupport; +import org.junit.jupiter.api.Test; + +public class JavaScriptTest extends LanguageTestSupport { + + @Test + public void testJavaScriptExpression() { + assertExpression("2 + 3", 5); + exchange.getMessage().setBody(7); + assertExpression("2 + body", 9); + } + + @Override + protected String getLanguageName() { + return "js"; + } +} diff --git a/components/camel-javascript/src/test/resources/log4j2.properties b/components/camel-javascript/src/test/resources/log4j2.properties new file mode 100644 index 00000000000..6d989dbf8f5 --- /dev/null +++ b/components/camel-javascript/src/test/resources/log4j2.properties @@ -0,0 +1,28 @@ +## --------------------------------------------------------------------------- +## 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. +## --------------------------------------------------------------------------- + +appender.file.type = File +appender.file.name = file +appender.file.fileName = target/camel-javascript-test.log +appender.file.layout.type = PatternLayout +appender.file.layout.pattern = %d [%-15.15t] %-5p %-30.30c{1} - %m%n +appender.out.type = Console +appender.out.name = out +appender.out.layout.type = PatternLayout +appender.out.layout.pattern = %d [%-15.15t] %-5p %-30.30c{1} - %m%n +rootLogger.level = INFO +rootLogger.appenderRef.file.ref = file diff --git a/core/camel-core-model/src/generated/resources/META-INF/services/org/apache/camel/model.properties b/core/camel-core-model/src/generated/resources/META-INF/services/org/apache/camel/model.properties index 51705e5367c..7d811da70d4 100644 --- a/core/camel-core-model/src/generated/resources/META-INF/services/org/apache/camel/model.properties +++ b/core/camel-core-model/src/generated/resources/META-INF/services/org/apache/camel/model.properties @@ -77,6 +77,7 @@ jacksonXml jaxb joor jq +js json jsonApi jsonpath diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/aggregate.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/aggregate.json index 577644e3213..d2380091e9b 100644 --- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/aggregate.json +++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/aggregate.json @@ -12,10 +12,10 @@ "output": false }, "properties": { - "correlationExpression": { "kind": "expression", "displayName": "Correlation Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secre [...] - "completionPredicate": { "kind": "expression", "displayName": "Completion Predicate", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowir [...] - "completionTimeoutExpression": { "kind": "expression", "displayName": "Completion Timeout Expression", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated" [...] - "completionSizeExpression": { "kind": "expression", "displayName": "Completion Size Expression", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": fals [...] + "correlationExpression": { "kind": "expression", "displayName": "Correlation Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "js", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, [...] + "completionPredicate": { "kind": "expression", "displayName": "Completion Predicate", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "js", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "a [...] + "completionTimeoutExpression": { "kind": "expression", "displayName": "Completion Timeout Expression", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "js", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "depre [...] + "completionSizeExpression": { "kind": "expression", "displayName": "Completion Size Expression", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "js", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated" [...] "optimisticLockRetryPolicy": { "kind": "element", "displayName": "Optimistic Lock Retry Policy", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.model.OptimisticLockRetryPolicyDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Allows to configure retry settings when using optimistic locking." }, "parallelProcessing": { "kind": "attribute", "displayName": "Parallel Processing", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "When aggregated are completed they are being send out of the aggregator. This option indicates whether or not Camel should use a thread pool with multiple threads for concurrency. If no custom thread pool has been specified then Camel cr [...] "optimisticLocking": { "kind": "attribute", "displayName": "Optimistic Locking", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Turns on using optimistic locking, which requires the aggregationRepository being used, is supporting this by implementing org.apache.camel.spi.OptimisticLockingAggregationRepository ." }, diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/delay.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/delay.json index 00eca477962..0315584dc70 100644 --- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/delay.json +++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/delay.json @@ -12,7 +12,7 @@ "output": false }, "properties": { - "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description" [...] + "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "js", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "descri [...] "asyncDelayed": { "kind": "attribute", "displayName": "Async Delayed", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Enables asynchronous delay which means the thread will not block while delaying." }, "callerRunsWhenRejected": { "kind": "attribute", "displayName": "Caller Runs When Rejected", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the caller should run the task when it was rejected by the thread pool. Is by default true" }, "executorService": { "kind": "attribute", "displayName": "Executor Service", "label": "advanced", "required": false, "type": "object", "javaType": "java.util.concurrent.ExecutorService", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom Thread Pool if asyncDelay has been enabled." }, diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/dynamicRouter.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/dynamicRouter.json index cc730f76bab..7623b6806e8 100644 --- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/dynamicRouter.json +++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/dynamicRouter.json @@ -12,7 +12,7 @@ "output": false }, "properties": { - "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description" [...] + "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "js", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "descri [...] "uriDelimiter": { "kind": "attribute", "displayName": "Uri Delimiter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": ",", "description": "Sets the uri delimiter to use" }, "ignoreInvalidEndpoints": { "kind": "attribute", "displayName": "Ignore Invalid Endpoints", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Ignore the invalidate endpoint exception when try to create a producer with that endpoint" }, "cacheSize": { "kind": "attribute", "displayName": "Cache Size", "label": "advanced", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the maximum size used by the org.apache.camel.spi.ProducerCache which is used to cache and reuse producers when using this dynamic router, when uris are reused. Beware that when using dynamic endpoints then it affects how well the cache can be utilized [...] diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/enrich.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/enrich.json index 7ca4e860f34..c5a0c989b12 100644 --- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/enrich.json +++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/enrich.json @@ -12,7 +12,7 @@ "output": false }, "properties": { - "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description" [...] + "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "js", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "descri [...] "aggregationStrategy": { "kind": "attribute", "displayName": "Aggregation Strategy", "required": false, "type": "object", "javaType": "org.apache.camel.AggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the AggregationStrategy to be used to merge the reply from the external service, into a single outgoing message. By default Camel will use the reply from the external service as outgoing message." }, "aggregationStrategyMethodName": { "kind": "attribute", "displayName": "Aggregation Strategy Method Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "This option can be used to explicit declare the method name to use, when using POJOs as the AggregationStrategy." }, "aggregationStrategyMethodAllowNull": { "kind": "attribute", "displayName": "Aggregation Strategy Method Allow Null", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "If this option is false then the aggregate method is not used if there was no data to enrich. If this option is true then null values is used as the oldExchange (when no data to enrich), when using POJOs as [...] diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/filter.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/filter.json index 99b67302c02..6542f53a766 100644 --- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/filter.json +++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/filter.json @@ -12,7 +12,7 @@ "output": true }, "properties": { - "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPredicate" [...] + "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "js", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPred [...] "statusPropertyName": { "kind": "attribute", "displayName": "Status Property Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of exchange property to use for storing the status of the filtering. Setting this allows to know if the filter predicate evaluated as true or false." }, "disabled": { "kind": "attribute", "displayName": "Disabled", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to disable this EIP from the route during build time. Once an EIP has been disabled then it cannot be enabled later at runtime." }, "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/generated/resources/org/apache/camel/model/idempotentConsumer.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/idempotentConsumer.json index d0c0da37468..c3364d3d512 100644 --- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/idempotentConsumer.json +++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/idempotentConsumer.json @@ -12,7 +12,7 @@ "output": true }, "properties": { - "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description" [...] + "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "js", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "descri [...] "idempotentRepository": { "kind": "attribute", "displayName": "Idempotent Repository", "required": false, "type": "object", "javaType": "org.apache.camel.spi.IdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the reference name of the message id repository" }, "eager": { "kind": "attribute", "displayName": "Eager", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Sets whether to eagerly add the key to the idempotent repository or wait until the exchange is complete. Eager is default enabled." }, "completionEager": { "kind": "attribute", "displayName": "Completion Eager", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Sets whether to complete the idempotent consumer eager or when the exchange is done. If this option is true to complete eager, then the idempotent consumer will trigger its completion when the exchange reached the end of t [...] diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/jaxb.index b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/jaxb.index index b19bff93510..8a5570b76c8 100644 --- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/jaxb.index +++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/jaxb.index @@ -7,6 +7,7 @@ ExpressionDefinition GroovyExpression HeaderExpression Hl7TerserExpression +JavaScriptExpression JoorExpression JqExpression JsonPathExpression diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/js.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/js.json new file mode 100644 index 00000000000..7a3f1324f03 --- /dev/null +++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/js.json @@ -0,0 +1,22 @@ +{ + "model": { + "kind": "model", + "name": "js", + "title": "JavaScript", + "description": "Evaluates a JavaScript expression.", + "deprecated": false, + "firstVersion": "3.20.0", + "label": "language,javascript", + "javaType": "org.apache.camel.model.language.JavaScriptExpression", + "abstract": false, + "input": false, + "output": false + }, + "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/generated/resources/org/apache/camel/model/loadbalancer/sticky.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/loadbalancer/sticky.json index b11a16259d1..e21f83548b7 100644 --- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/loadbalancer/sticky.json +++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/loadbalancer/sticky.json @@ -12,7 +12,7 @@ "output": false }, "properties": { - "correlationExpression": { "kind": "expression", "displayName": "Correlation Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secre [...] + "correlationExpression": { "kind": "expression", "displayName": "Correlation Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "js", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, [...] "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The id of this node" } } } diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/loop.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/loop.json index dc7c1aef4ea..0c933fa4dbf 100644 --- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/loop.json +++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/loop.json @@ -12,7 +12,7 @@ "output": true }, "properties": { - "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description" [...] + "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "js", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "descri [...] "copy": { "kind": "attribute", "displayName": "Copy", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "If the copy attribute is true, a copy of the input Exchange is used for each iteration. That means each iteration will start from a copy of the same message. By default loop will loop the same exchange all over, so each iteration may have differ [...] "doWhile": { "kind": "attribute", "displayName": "Do While", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Enables the while loop that loops until the predicate evaluates to false or null." }, "breakOnShutdown": { "kind": "attribute", "displayName": "Break On Shutdown", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "If the breakOnShutdown attribute is true, then the loop will not iterate until it reaches the end when Camel is shut down." }, diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/onException.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/onException.json index 9bba8ef8a6f..52beaddbb82 100644 --- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/onException.json +++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/onException.json @@ -14,11 +14,11 @@ "properties": { "exception": { "kind": "element", "displayName": "Exception", "required": true, "type": "array", "javaType": "java.util.List<java.lang.String>", "deprecated": false, "autowired": false, "secret": false, "description": "A set of exceptions to react upon." }, "onWhen": { "kind": "element", "displayName": "On When", "required": false, "type": "object", "javaType": "org.apache.camel.model.WhenDefinition", "deprecated": false, "autowired": false, "secret": false, "asPredicate": true, "description": "Sets an additional predicate that should be true before the onException is triggered. To be used for fine grained controlling whether a thrown exception should be intercepted by this exception type or not." }, - "retryWhile": { "kind": "expression", "displayName": "Retry While", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secre [...] + "retryWhile": { "kind": "expression", "displayName": "Retry While", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "js", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, [...] "redeliveryPolicy": { "kind": "element", "displayName": "Redelivery Policy", "required": false, "type": "object", "javaType": "org.apache.camel.model.RedeliveryPolicyDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Used for configuring redelivery options" }, "redeliveryPolicyRef": { "kind": "attribute", "displayName": "Redelivery Policy Ref", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a redelivery policy to lookup in the org.apache.camel.spi.Registry to be used." }, - "handled": { "kind": "expression", "displayName": "Handled", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPredicate": tr [...] - "continued": { "kind": "expression", "displayName": "Continued", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": [...] + "handled": { "kind": "expression", "displayName": "Handled", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "js", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPredicat [...] + "continued": { "kind": "expression", "displayName": "Continued", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "js", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "se [...] "onRedeliveryRef": { "kind": "attribute", "displayName": "On Redelivery Ref", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor that should be processed before a redelivery attempt. Can be used to change the org.apache.camel.Exchange before its being redelivered." }, "onExceptionOccurredRef": { "kind": "attribute", "displayName": "On Exception Occurred Ref", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor that should be processed just after an exception occurred. Can be used to perform custom logging about the occurred exception at the exact time it happened. Important: Any exception thrown from this [...] "useOriginalMessage": { "kind": "attribute", "displayName": "Use Original Message", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Will use the original input org.apache.camel.Message (original body and headers) when an org.apache.camel.Exchange is moved to the dead letter queue. Notice: this only applies when all redeliveries attempt have fail [...] diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/pollEnrich.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/pollEnrich.json index 26bf02c48d1..66b307b2463 100644 --- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/pollEnrich.json +++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/pollEnrich.json @@ -12,7 +12,7 @@ "output": false }, "properties": { - "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description" [...] + "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "js", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "descri [...] "aggregationStrategy": { "kind": "attribute", "displayName": "Aggregation Strategy", "required": false, "type": "object", "javaType": "org.apache.camel.AggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the AggregationStrategy to be used to merge the reply from the external service, into a single outgoing message. By default Camel will use the reply from the external service as outgoing message." }, "aggregationStrategyMethodName": { "kind": "attribute", "displayName": "Aggregation Strategy Method Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "This option can be used to explicit declare the method name to use, when using POJOs as the AggregationStrategy." }, "aggregationStrategyMethodAllowNull": { "kind": "attribute", "displayName": "Aggregation Strategy Method Allow Null", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "If this option is false then the aggregate method is not used if there was no data to enrich. If this option is true then null values is used as the oldExchange (when no data to enrich), when using POJOs as [...] diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/propertyExpression.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/propertyExpression.json index 21f2483e0c1..2657cf9e785 100644 --- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/propertyExpression.json +++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/propertyExpression.json @@ -13,6 +13,6 @@ }, "properties": { "key": { "kind": "attribute", "displayName": "Key", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Property key" }, - "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description" [...] + "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "js", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "descri [...] } } diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/recipientList.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/recipientList.json index ed7610b650f..13b1135ecb2 100644 --- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/recipientList.json +++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/recipientList.json @@ -12,7 +12,7 @@ "output": false }, "properties": { - "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description" [...] + "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "js", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "descri [...] "delimiter": { "kind": "attribute", "displayName": "Delimiter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": ",", "description": "Delimiter used if the Expression returned multiple endpoints. Can be turned off using the value false. The default value is ," }, "aggregationStrategy": { "kind": "attribute", "displayName": "Aggregation Strategy", "required": false, "type": "object", "javaType": "org.apache.camel.AggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the AggregationStrategy to be used to assemble the replies from the recipients, into a single outgoing message from the RecipientList. By default Camel will use the last reply as the outgoing message. You can also use a POJO as the Agg [...] "aggregationStrategyMethodName": { "kind": "attribute", "displayName": "Aggregation Strategy Method Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "This option can be used to explicit declare the method name to use, when using POJOs as the AggregationStrategy." }, diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/resequence.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/resequence.json index 5f2f494e432..6b78755e679 100644 --- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/resequence.json +++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/resequence.json @@ -12,7 +12,7 @@ "output": false }, "properties": { - "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description" [...] + "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "js", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "descri [...] "resequencerConfig": { "kind": "element", "displayName": "Resequencer Config", "required": true, "type": "object", "javaType": "org.apache.camel.model.config.ResequencerConfig", "oneOf": [ "batch-config", "stream-config" ], "deprecated": false, "autowired": false, "secret": false, "description": "To configure the resequencer in using either batch or stream configuration. Will by default use batch configuration." }, "disabled": { "kind": "attribute", "displayName": "Disabled", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to disable this EIP from the route during build time. Once an EIP has been disabled then it cannot be enabled later at runtime." }, "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/generated/resources/org/apache/camel/model/routingSlip.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/routingSlip.json index 8d0dd993d98..974f94be574 100644 --- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/routingSlip.json +++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/routingSlip.json @@ -12,7 +12,7 @@ "output": false }, "properties": { - "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description" [...] + "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "js", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "descri [...] "uriDelimiter": { "kind": "attribute", "displayName": "Uri Delimiter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": ",", "description": "Sets the uri delimiter to use" }, "ignoreInvalidEndpoints": { "kind": "attribute", "displayName": "Ignore Invalid Endpoints", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Ignore the invalidate endpoint exception when try to create a producer with that endpoint" }, "cacheSize": { "kind": "attribute", "displayName": "Cache Size", "label": "advanced", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the maximum size used by the org.apache.camel.spi.ProducerCache which is used to cache and reuse producers when using this routing slip, when uris are reused. Beware that when using dynamic endpoints then it affects how well the cache can be utilized. [...] diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/script.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/script.json index 95d1ffbdb7b..11fc21b7d4e 100644 --- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/script.json +++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/script.json @@ -12,7 +12,7 @@ "output": false }, "properties": { - "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description" [...] + "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "js", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "descri [...] "disabled": { "kind": "attribute", "displayName": "Disabled", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to disable this EIP from the route during build time. Once an EIP has been disabled then it cannot be enabled later at runtime." }, "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" }, "description": { "kind": "element", "displayName": "Description", "required": false, "type": "object", "javaType": "org.apache.camel.model.DescriptionDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" } diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/setBody.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/setBody.json index 15525668830..6d8ed0d59c3 100644 --- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/setBody.json +++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/setBody.json @@ -12,7 +12,7 @@ "output": false }, "properties": { - "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description" [...] + "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "js", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "descri [...] "disabled": { "kind": "attribute", "displayName": "Disabled", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to disable this EIP from the route during build time. Once an EIP has been disabled then it cannot be enabled later at runtime." }, "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" }, "description": { "kind": "element", "displayName": "Description", "required": false, "type": "object", "javaType": "org.apache.camel.model.DescriptionDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" } diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/setHeader.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/setHeader.json index 371383bd8cb..1ecd0e1c5fc 100644 --- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/setHeader.json +++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/setHeader.json @@ -13,7 +13,7 @@ }, "properties": { "name": { "kind": "attribute", "displayName": "Name", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of message header to set a new value The simple language can be used to define a dynamic evaluated header name to be used. Otherwise a constant name will be used." }, - "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description" [...] + "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "js", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "descri [...] "disabled": { "kind": "attribute", "displayName": "Disabled", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to disable this EIP from the route during build time. Once an EIP has been disabled then it cannot be enabled later at runtime." }, "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" }, "description": { "kind": "element", "displayName": "Description", "required": false, "type": "object", "javaType": "org.apache.camel.model.DescriptionDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" } diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/setProperty.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/setProperty.json index ac0af44399b..f5a1a930cf4 100644 --- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/setProperty.json +++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/setProperty.json @@ -13,7 +13,7 @@ }, "properties": { "name": { "kind": "attribute", "displayName": "Name", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of exchange property to set a new value. The simple language can be used to define a dynamic evaluated exchange property name to be used. Otherwise a constant name will be used." }, - "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description" [...] + "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "js", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "descri [...] "disabled": { "kind": "attribute", "displayName": "Disabled", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to disable this EIP from the route during build time. Once an EIP has been disabled then it cannot be enabled later at runtime." }, "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" }, "description": { "kind": "element", "displayName": "Description", "required": false, "type": "object", "javaType": "org.apache.camel.model.DescriptionDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" } diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/sort.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/sort.json index 1e32fb1c628..3d066ff5ee1 100644 --- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/sort.json +++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/sort.json @@ -12,7 +12,7 @@ "output": false }, "properties": { - "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description" [...] + "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "js", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "descri [...] "comparator": { "kind": "attribute", "displayName": "Comparator", "label": "advanced", "required": false, "type": "object", "javaType": "java.util.Comparator", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the comparator to use for sorting" }, "disabled": { "kind": "attribute", "displayName": "Disabled", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to disable this EIP from the route during build time. Once an EIP has been disabled then it cannot be enabled later at runtime." }, "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/generated/resources/org/apache/camel/model/split.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/split.json index 2d51cb25754..5087b2b7ed2 100644 --- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/split.json +++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/split.json @@ -12,7 +12,7 @@ "output": true }, "properties": { - "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description" [...] + "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "js", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "descri [...] "delimiter": { "kind": "attribute", "displayName": "Delimiter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": ",", "description": "Delimiter used in splitting messages. Can be turned off using the value false. The default value is ," }, "aggregationStrategy": { "kind": "attribute", "displayName": "Aggregation Strategy", "required": false, "type": "object", "javaType": "org.apache.camel.AggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to the AggregationStrategy to be used to assemble the replies from the split messages, into a single outgoing message from the Splitter. By default Camel will use the original incoming message to the splitter (leave it unch [...] "aggregationStrategyMethodName": { "kind": "attribute", "displayName": "Aggregation Strategy Method Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "This option can be used to explicit declare the method name to use, when using POJOs as the AggregationStrategy." }, diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/throttle.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/throttle.json index 475e36a0c3e..65f6fb24cf6 100644 --- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/throttle.json +++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/throttle.json @@ -12,8 +12,8 @@ "output": false }, "properties": { - "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description" [...] - "correlationExpression": { "kind": "expression", "displayName": "Correlation Expression", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secr [...] + "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "js", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "descri [...] + "correlationExpression": { "kind": "expression", "displayName": "Correlation Expression", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "js", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, [...] "executorService": { "kind": "attribute", "displayName": "Executor Service", "label": "advanced", "required": false, "type": "object", "javaType": "java.util.concurrent.ExecutorService", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom thread pool (ScheduledExecutorService) by the throttler." }, "timePeriodMillis": { "kind": "attribute", "displayName": "Time Period Millis", "required": false, "type": "duration", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1000", "description": "Sets the time period during which the maximum request count is valid for" }, "asyncDelayed": { "kind": "attribute", "displayName": "Async Delayed", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Enables asynchronous delay which means the thread will not block while delaying." }, diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/transform.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/transform.json index f089c763aa8..3b7e59cc9ba 100644 --- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/transform.json +++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/transform.json @@ -12,7 +12,7 @@ "output": false }, "properties": { - "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description" [...] + "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "js", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "descri [...] "disabled": { "kind": "attribute", "displayName": "Disabled", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to disable this EIP from the route during build time. Once an EIP has been disabled then it cannot be enabled later at runtime." }, "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" }, "description": { "kind": "element", "displayName": "Description", "required": false, "type": "object", "javaType": "org.apache.camel.model.DescriptionDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" } diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/validate.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/validate.json index 4a6c0c3fa7e..ecf34a81886 100644 --- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/validate.json +++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/validate.json @@ -12,7 +12,7 @@ "output": false }, "properties": { - "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPredicate" [...] + "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "js", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPred [...] "predicateExceptionFactory": { "kind": "attribute", "displayName": "Predicate Exception Factory", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.PredicateExceptionFactory", "deprecated": false, "autowired": false, "secret": false, "description": "The bean id of custom PredicateExceptionFactory to use for creating the exception when the validation fails. By default, Camel will throw PredicateValidationException. By using a custom factory yo [...] "disabled": { "kind": "attribute", "displayName": "Disabled", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to disable this EIP from the route during build time. Once an EIP has been disabled then it cannot be enabled later at runtime." }, "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/generated/resources/org/apache/camel/model/when.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/when.json index 0353f03abfd..9b20748fbbc 100644 --- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/when.json +++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/when.json @@ -12,7 +12,7 @@ "output": true }, "properties": { - "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPredicate" [...] + "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "js", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPred [...] "disabled": { "kind": "attribute", "displayName": "Disabled", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to disable this EIP from the route during build time. Once an EIP has been disabled then it cannot be enabled later at runtime." }, "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" }, "description": { "kind": "element", "displayName": "Description", "required": false, "type": "object", "javaType": "org.apache.camel.model.DescriptionDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" } diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/whenSkipSendToEndpoint.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/whenSkipSendToEndpoint.json index affe0f498b5..c0edc73e17c 100644 --- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/whenSkipSendToEndpoint.json +++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/whenSkipSendToEndpoint.json @@ -12,7 +12,7 @@ "output": true }, "properties": { - "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPredicate" [...] + "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "datasonnet", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jq", "js", "jsonpath", "language", "method", "mvel", "ognl", "python", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPred [...] "disabled": { "kind": "attribute", "displayName": "Disabled", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to disable this EIP from the route during build time. Once an EIP has been disabled then it cannot be enabled later at runtime." }, "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" }, "description": { "kind": "element", "displayName": "Description", "required": false, "type": "object", "javaType": "org.apache.camel.model.DescriptionDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description 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..2ccada2fb2e 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 @@ -447,6 +447,20 @@ public class ExpressionClause<T> implements Expression, Predicate { return delegate.jq(value, resultType, headerName, propertyName); } + /** + * Returns a JavaScript expression value builder + */ + public T js(String value) { + return delegate.js(value); + } + + /** + * Returns a JavaScript expression value builder + */ + public T js(String value, Class<?> resultType) { + return delegate.js(value, resultType); + } + /** * Evaluates a <a href="http://camel.apache.org/datasonnet.html">Datasonnet 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..e42dfad3407 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 @@ -30,6 +30,7 @@ import org.apache.camel.model.language.ExchangePropertyExpression; import org.apache.camel.model.language.GroovyExpression; import org.apache.camel.model.language.HeaderExpression; import org.apache.camel.model.language.Hl7TerserExpression; +import org.apache.camel.model.language.JavaScriptExpression; import org.apache.camel.model.language.JoorExpression; import org.apache.camel.model.language.JqExpression; import org.apache.camel.model.language.JsonPathExpression; @@ -350,6 +351,29 @@ public class ExpressionClauseSupport<T> implements ExpressionFactoryAware, Predi return expression(new GroovyExpression(text)); } + /** + * Evaluates a JavaScript expression. + * + * @param text the expression to be evaluated + * @return the builder to continue processing the DSL + */ + public T js(String text) { + return expression(new JavaScriptExpression(text)); + } + + /** + * Evaluates an JavaScript 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 js(String text, Class<?> resultType) { + JavaScriptExpression exp = new JavaScriptExpression(text); + exp.setResultType(resultType); + return expression(exp); + } + /** * Evaluates an JOOR expression * diff --git a/core/camel-core-model/src/main/java/org/apache/camel/builder/LanguageBuilderFactory.java b/core/camel-core-model/src/main/java/org/apache/camel/builder/LanguageBuilderFactory.java index 789d9d94f22..3f391a904ac 100644 --- a/core/camel-core-model/src/main/java/org/apache/camel/builder/LanguageBuilderFactory.java +++ b/core/camel-core-model/src/main/java/org/apache/camel/builder/LanguageBuilderFactory.java @@ -23,6 +23,7 @@ import org.apache.camel.model.language.ExchangePropertyExpression; import org.apache.camel.model.language.GroovyExpression; import org.apache.camel.model.language.HeaderExpression; import org.apache.camel.model.language.Hl7TerserExpression; +import org.apache.camel.model.language.JavaScriptExpression; import org.apache.camel.model.language.JoorExpression; import org.apache.camel.model.language.JqExpression; import org.apache.camel.model.language.JsonPathExpression; @@ -93,6 +94,13 @@ public final class LanguageBuilderFactory { return new Hl7TerserExpression.Builder(); } + /** + * Uses the JavaScript language + */ + public JavaScriptExpression.Builder js() { + return new JavaScriptExpression.Builder(); + } + /** * Uses the Joor language */ diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/language/JavaScriptExpression.java b/core/camel-core-model/src/main/java/org/apache/camel/model/language/JavaScriptExpression.java new file mode 100644 index 00000000000..9d385807313 --- /dev/null +++ b/core/camel-core-model/src/main/java/org/apache/camel/model/language/JavaScriptExpression.java @@ -0,0 +1,165 @@ +/* + * 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.model.language; + +import org.apache.camel.spi.Metadata; + +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; + +/** + * Evaluates a JavaScript expression. + */ +@Metadata(firstVersion = "3.20.0", label = "language,javascript", title = "JavaScript") +@XmlRootElement(name = "js") +@XmlAccessorType(XmlAccessType.FIELD) +public class JavaScriptExpression 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 JavaScriptExpression() { + } + + public JavaScriptExpression(String expression) { + super(expression); + } + + private JavaScriptExpression(JavaScriptExpression.Builder builder) { + super(builder); + this.resultTypeName = builder.resultTypeName; + this.resultType = builder.resultType; + this.headerName = builder.headerName; + this.propertyName = builder.propertyName; + } + + @Override + public String getLanguage() { + return "js"; + } + + 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 JavaScriptExpression}. + */ + @XmlTransient + public static class Builder extends AbstractBuilder<JavaScriptExpression.Builder, JavaScriptExpression> { + + private String resultTypeName; + private Class<?> resultType; + private String headerName; + private String propertyName; + + /** + * Sets the class name of the result type (type from output) + */ + public JavaScriptExpression.Builder resultType(Class<?> resultType) { + this.resultType = resultType; + return this; + } + + /** + * Sets the class of the result type (type from output) + */ + public JavaScriptExpression.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 JavaScriptExpression.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 JavaScriptExpression.Builder propertyName(String propertyName) { + this.propertyName = propertyName; + return this; + } + + @Override + public JavaScriptExpression end() { + return new JavaScriptExpression(this); + } + } +} 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..01492ff1945 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 @@ -37,6 +37,7 @@ import org.apache.camel.model.language.ExpressionDefinition; import org.apache.camel.model.language.GroovyExpression; import org.apache.camel.model.language.HeaderExpression; import org.apache.camel.model.language.Hl7TerserExpression; +import org.apache.camel.model.language.JavaScriptExpression; import org.apache.camel.model.language.JoorExpression; import org.apache.camel.model.language.JqExpression; import org.apache.camel.model.language.JsonPathExpression; @@ -129,6 +130,8 @@ public class ExpressionReifier<T extends ExpressionDefinition> extends AbstractR return new ExpressionReifier<>(camelContext, definition); } else if (definition instanceof Hl7TerserExpression) { return new ExpressionReifier<>(camelContext, definition); + } else if (definition instanceof JavaScriptExpression) { + return new JavaScriptExpressionReifier(camelContext, definition); } else if (definition instanceof JoorExpression) { return new JoorExpressionReifier(camelContext, definition); } else if (definition instanceof JqExpression) { diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/JavaScriptExpressionReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/JavaScriptExpressionReifier.java new file mode 100644 index 00000000000..000d35ba189 --- /dev/null +++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/JavaScriptExpressionReifier.java @@ -0,0 +1,64 @@ +/* + * 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.JavaScriptExpression; +import org.apache.camel.model.language.JqExpression; +import org.apache.camel.spi.Language; + +public class JavaScriptExpressionReifier extends ExpressionReifier<JavaScriptExpression> { + + public JavaScriptExpressionReifier(CamelContext camelContext, ExpressionDefinition definition) { + super(camelContext, (JavaScriptExpression) 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..2f07da297b3 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 @@ -2657,6 +2657,22 @@ public class ModelParser extends BaseParser { return doParse(new Hl7TerserExpression(), expressionDefinitionAttributeHandler(), noElementHandler(), expressionDefinitionValueHandler()); } + protected JavaScriptExpression doParseJavaScriptExpression() throws IOException, XmlPullParserException { + return doParse(new JavaScriptExpression(), (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 JoorExpression doParseJoorExpression() throws IOException, XmlPullParserException { return doParse(new JoorExpression(), (def, key, val) -> { switch (key) { @@ -3355,6 +3371,7 @@ public class ModelParser extends BaseParser { case "groovy": return doParseGroovyExpression(); case "header": return doParseHeaderExpression(); case "hl7terser": return doParseHl7TerserExpression(); + case "js": return doParseJavaScriptExpression(); case "joor": return doParseJoorExpression(); case "jq": return doParseJqExpression(); case "jsonpath": return doParseJsonPathExpression(); diff --git a/parent/pom.xml b/parent/pom.xml index 4f4ab74c0bd..98c2cfc8b87 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -1731,6 +1731,11 @@ <artifactId>camel-java-joor-dsl</artifactId> <version>${project.version}</version> </dependency> + <dependency> + <groupId>org.apache.camel</groupId> + <artifactId>camel-javascript</artifactId> + <version>${project.version}</version> + </dependency> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-jaxb</artifactId>