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

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

commit 5fed11b80f7d56b216ef39d710d7fc480a96c8c6
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Fri Aug 16 13:45:55 2024 +0200

    CAMEL-20569: camel-catalog - Markup languages which functions they support 
for better doc and tooling.
---
 .../org/apache/camel/language/simple/file.json     |  30 +++---
 .../org/apache/camel/language/simple/simple.json   | 106 +++++++++++----------
 .../camel/language/simple/SimpleConstants.java     |  21 ++--
 .../org/apache/camel/tooling/model/JsonMapper.java |   1 +
 .../apache/camel/tooling/model/LanguageModel.java  |  13 +++
 .../camel/maven/packaging/PackageLanguageMojo.java |  11 ++-
 6 files changed, 108 insertions(+), 74 deletions(-)

diff --git 
a/core/camel-core-languages/src/generated/resources/META-INF/org/apache/camel/language/simple/file.json
 
b/core/camel-core-languages/src/generated/resources/META-INF/org/apache/camel/language/simple/file.json
index e0c81a04934..16ae6217ad2 100644
--- 
a/core/camel-core-languages/src/generated/resources/META-INF/org/apache/camel/language/simple/file.json
+++ 
b/core/camel-core-languages/src/generated/resources/META-INF/org/apache/camel/language/simple/file.json
@@ -22,20 +22,20 @@
     "trim": { "index": 3, "kind": "attribute", "displayName": "Trim", "group": 
"advanced", "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" }
   },
   "functions": {
-    "file:name": { "index": 0, "kind": "function", "displayName": "File", 
"group": "function", "label": "function", "required": false, "javaType": 
"String", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The file name (relative 
from starting directory)", "suffix": "}" },
-    "file:name.noext": { "index": 1, "kind": "function", "displayName": 
"File", "group": "function", "label": "function", "required": false, 
"javaType": "String", "prefix": "${", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "The file name 
(relative from starting directory) without extension", "suffix": "}" },
-    "file:name.noext.single": { "index": 2, "kind": "function", "displayName": 
"File", "group": "function", "label": "function", "required": false, 
"javaType": "String", "prefix": "${", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "The file name 
(relative from starting directory) without extension. If the file name has 
multiple dots, then this expression strips and only returns the last part.", 
"suffix": "}" },
-    "file:name.ext": { "index": 3, "kind": "function", "displayName": "File", 
"group": "function", "label": "function", "required": false, "javaType": 
"String", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The file extension", 
"suffix": "}" },
-    "file:name.ext.single": { "index": 4, "kind": "function", "displayName": 
"File", "group": "function", "label": "function", "required": false, 
"javaType": "String", "prefix": "${", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "The file extension. If 
the file extension has multiple dots, then this expression strips and only 
returns the last part.", "suffix": "}" },
-    "file:onlyname": { "index": 5, "kind": "function", "displayName": "File", 
"group": "function", "label": "function", "required": false, "javaType": 
"String", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "\u2020he file name 
(without any leading paths)", "suffix": "}" },
-    "file:onlyname.noext": { "index": 6, "kind": "function", "displayName": 
"File", "group": "function", "label": "function", "required": false, 
"javaType": "String", "prefix": "${", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "\u2020he file name 
(without any leading paths) without extension", "suffix": "}" },
-    "file:onlyname.noext.single": { "index": 7, "kind": "function", 
"displayName": "File", "group": "function", "label": "function", "required": 
false, "javaType": "String", "prefix": "${", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": 
"\u2020he file name (without any leading paths) without extension. If the file 
name has multiple dots, then this expression strips and only returns the last 
part.", "suffix": "}" },
-    "file:parent": { "index": 8, "kind": "function", "displayName": "File", 
"group": "function", "label": "function", "required": false, "javaType": 
"String", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The file parent directory 
(null if no parent directory)", "suffix": "}" },
-    "file:path": { "index": 9, "kind": "function", "displayName": "File", 
"group": "function", "label": "function", "required": false, "javaType": 
"String", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The file path", "suffix": 
"}" },
-    "file:absolute": { "index": 10, "kind": "function", "displayName": "File", 
"group": "function", "label": "function", "required": false, "javaType": 
"boolean", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Whether the file is 
regarded as absolute or relative", "suffix": "}" },
-    "file:absolute.path": { "index": 11, "kind": "function", "displayName": 
"File", "group": "function", "label": "function", "required": false, 
"javaType": "String", "prefix": "${", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "The absolute file 
path", "suffix": "}" },
-    "file:length": { "index": 12, "kind": "function", "displayName": "File", 
"group": "function", "label": "function", "required": false, "javaType": 
"long", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The size of the file", 
"suffix": "}" },
-    "file:size": { "index": 13, "kind": "function", "displayName": "File", 
"group": "function", "label": "function", "required": false, "javaType": 
"long", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The size of the file", 
"suffix": "}" },
-    "file:modified": { "index": 14, "kind": "function", "displayName": "File", 
"group": "function", "label": "function", "required": false, "javaType": 
"long", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The file modification 
date", "suffix": "}" }
+    "file:name": { "index": 0, "kind": "function", "displayName": "File", 
"group": "function", "label": "function", "required": false, "javaType": 
"String", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The file name (relative 
from starting directory)", "ognl": false, "suffix": "}" },
+    "file:name.noext": { "index": 1, "kind": "function", "displayName": 
"File", "group": "function", "label": "function", "required": false, 
"javaType": "String", "prefix": "${", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "The file name 
(relative from starting directory) without extension", "ognl": false, "suffix": 
"}" },
+    "file:name.noext.single": { "index": 2, "kind": "function", "displayName": 
"File", "group": "function", "label": "function", "required": false, 
"javaType": "String", "prefix": "${", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "The file name 
(relative from starting directory) without extension. If the file name has 
multiple dots, then this expression strips and only returns the last part.", 
"ognl": false, "suffix": "}" },
+    "file:name.ext": { "index": 3, "kind": "function", "displayName": "File", 
"group": "function", "label": "function", "required": false, "javaType": 
"String", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The file extension", 
"ognl": false, "suffix": "}" },
+    "file:name.ext.single": { "index": 4, "kind": "function", "displayName": 
"File", "group": "function", "label": "function", "required": false, 
"javaType": "String", "prefix": "${", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "The file extension. If 
the file extension has multiple dots, then this expression strips and only 
returns the last part.", "ognl": false, "suffix": "}" },
+    "file:onlyname": { "index": 5, "kind": "function", "displayName": "File", 
"group": "function", "label": "function", "required": false, "javaType": 
"String", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "\u2020he file name 
(without any leading paths)", "ognl": false, "suffix": "}" },
+    "file:onlyname.noext": { "index": 6, "kind": "function", "displayName": 
"File", "group": "function", "label": "function", "required": false, 
"javaType": "String", "prefix": "${", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "\u2020he file name 
(without any leading paths) without extension", "ognl": false, "suffix": "}" },
+    "file:onlyname.noext.single": { "index": 7, "kind": "function", 
"displayName": "File", "group": "function", "label": "function", "required": 
false, "javaType": "String", "prefix": "${", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": 
"\u2020he file name (without any leading paths) without extension. If the file 
name has multiple dots, then this expression strips and only returns the last 
part.", "ognl": false, "suffix": "}" },
+    "file:parent": { "index": 8, "kind": "function", "displayName": "File", 
"group": "function", "label": "function", "required": false, "javaType": 
"String", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The file parent directory 
(null if no parent directory)", "ognl": false, "suffix": "}" },
+    "file:path": { "index": 9, "kind": "function", "displayName": "File", 
"group": "function", "label": "function", "required": false, "javaType": 
"String", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The file path", "ognl": 
false, "suffix": "}" },
+    "file:absolute": { "index": 10, "kind": "function", "displayName": "File", 
"group": "function", "label": "function", "required": false, "javaType": 
"boolean", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Whether the file is 
regarded as absolute or relative", "ognl": false, "suffix": "}" },
+    "file:absolute.path": { "index": 11, "kind": "function", "displayName": 
"File", "group": "function", "label": "function", "required": false, 
"javaType": "String", "prefix": "${", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "The absolute file 
path", "ognl": false, "suffix": "}" },
+    "file:length": { "index": 12, "kind": "function", "displayName": "File", 
"group": "function", "label": "function", "required": false, "javaType": 
"long", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The size of the file", 
"ognl": false, "suffix": "}" },
+    "file:size": { "index": 13, "kind": "function", "displayName": "File", 
"group": "function", "label": "function", "required": false, "javaType": 
"long", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The size of the file", 
"ognl": false, "suffix": "}" },
+    "file:modified": { "index": 14, "kind": "function", "displayName": "File", 
"group": "function", "label": "function", "required": false, "javaType": 
"long", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The file modification 
date", "ognl": false, "suffix": "}" }
   }
 }
diff --git 
a/core/camel-core-languages/src/generated/resources/META-INF/org/apache/camel/language/simple/simple.json
 
b/core/camel-core-languages/src/generated/resources/META-INF/org/apache/camel/language/simple/simple.json
index 2d7b8645be1..2fa67ebaf9d 100644
--- 
a/core/camel-core-languages/src/generated/resources/META-INF/org/apache/camel/language/simple/simple.json
+++ 
b/core/camel-core-languages/src/generated/resources/META-INF/org/apache/camel/language/simple/simple.json
@@ -22,56 +22,60 @@
     "trim": { "index": 3, "kind": "attribute", "displayName": "Trim", "group": 
"advanced", "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" }
   },
   "functions": {
-    "body": { "index": 0, "kind": "function", "displayName": "Body", "group": 
"function", "label": "function", "required": false, "javaType": "Object", 
"prefix": "${", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The message body", "suffix": "}" },
-    "prettyBody": { "index": 1, "kind": "function", "displayName": "Pretty 
Body", "group": "function", "label": "function", "required": false, "javaType": 
"String", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Converts the body to a 
String, and attempts to pretty print if JSon or XML; otherwise the body is 
returned as the String value.", "suffix": "}" },
-    "bodyOneLine": { "index": 2, "kind": "function", "displayName": "Body One 
Line", "group": "function", "label": "function", "required": false, "javaType": 
"String", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Converts the body to a 
String and removes all line-breaks, so the string is in one line.", "suffix": 
"}" },
-    "originalBody": { "index": 3, "kind": "function", "displayName": "Original 
Body", "group": "function", "label": "function", "required": false, "javaType": 
"Object", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The original incoming body 
(only available if allowUseOriginalMessage=true).", "suffix": "}" },
-    "id": { "index": 4, "kind": "function", "displayName": "Id", "group": 
"function", "label": "function", "required": false, "javaType": "String", 
"prefix": "${", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The message id", "suffix": "}" },
-    "messageTimestamp": { "index": 5, "kind": "function", "displayName": 
"Message Timestamp", "group": "function", "label": "function", "required": 
false, "javaType": "long", "prefix": "${", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": "The 
message timestamp (millis since epoc) that this message originates from. Some 
systems like JMS, Kafka, AWS have a timestamp on the event\/message that Camel 
received. This method returns the timestamp [...]
-    "exchangeId": { "index": 6, "kind": "function", "displayName": "Exchange 
Id", "group": "function", "label": "function", "required": false, "javaType": 
"String", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The exchange id", 
"suffix": "}" },
-    "exchange": { "index": 7, "kind": "function", "displayName": "Exchange", 
"group": "function", "label": "function", "required": false, "javaType": 
"org.apache.camel.Exchange", "prefix": "${", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": "The 
exchange", "suffix": "}" },
-    "exception": { "index": 8, "kind": "function", "displayName": "Exception", 
"group": "function", "label": "function", "required": false, "javaType": 
"java.lang.Exception", "prefix": "${", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "The exception object 
on the exchange (also from caught exceptions), is null if no exception 
present.", "suffix": "}" },
-    "exception.message": { "index": 9, "kind": "function", "displayName": 
"Exception Message", "group": "function", "label": "function", "required": 
false, "javaType": "String", "prefix": "${", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": "The 
exception message (also from caught exceptions), is null if no exception 
present.", "suffix": "}" },
-    "exception.stackTrace": { "index": 10, "kind": "function", "displayName": 
"Exception Stacktrace", "group": "function", "label": "function", "required": 
false, "javaType": "String", "prefix": "${", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": "The 
exception stacktrace (also from caught exceptions), is null if no exception 
present.", "suffix": "}" },
-    "threadId": { "index": 11, "kind": "function", "displayName": "Thread Id", 
"group": "function", "label": "function", "required": false, "javaType": 
"long", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Returns the id of the 
current thread. Can be used for logging.", "suffix": "}" },
-    "threadName": { "index": 12, "kind": "function", "displayName": "Thread 
Name", "group": "function", "label": "function", "required": false, "javaType": 
"String", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Returns the name of the 
current thread. Can be used for logging.", "suffix": "}" },
-    "hostName": { "index": 13, "kind": "function", "displayName": "Host Name", 
"group": "function", "label": "function", "required": false, "javaType": 
"String", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Returns the local hostname 
(may be empty if not possible to resolve).", "suffix": "}" },
-    "camelId": { "index": 14, "kind": "function", "displayName": "Camel Id", 
"group": "function", "label": "function", "required": false, "javaType": 
"String", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The name of the 
CamelContext", "suffix": "}" },
-    "routeId": { "index": 15, "kind": "function", "displayName": "Route Id", 
"group": "function", "label": "function", "required": false, "javaType": 
"String", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The route id of the 
current route the Exchange is being routed", "suffix": "}" },
-    "fromRouteId": { "index": 16, "kind": "function", "displayName": "From 
Route Id", "group": "function", "label": "function", "required": false, 
"javaType": "String", "prefix": "${", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "The original route id 
where this exchange was created.", "suffix": "}" },
-    "routeGroup": { "index": 17, "kind": "function", "displayName": "Route 
Group", "group": "function", "label": "function", "required": false, 
"javaType": "String", "prefix": "${", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "Returns the route 
group of the current route the Exchange is being routed. Not all routes have a 
group assigned, so this may be null.", "suffix": "}" },
-    "stepId": { "index": 18, "kind": "function", "displayName": "Step Id", 
"group": "function", "label": "function", "required": false, "javaType": 
"String", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Returns the id of the 
current step the Exchange is being routed.", "suffix": "}" },
-    "null": { "index": 19, "kind": "function", "displayName": "Null", "group": 
"function", "label": "function", "required": false, "javaType": "Object", 
"prefix": "${", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Represents a null value", "suffix": "}" },
-    "messageAs(type)": { "index": 20, "kind": "function", "displayName": 
"Message As", "group": "function", "label": "function", "required": false, 
"javaType": "Object", "prefix": "${", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "Converts the message 
to the given type (classname).", "suffix": "}" },
-    "bodyAs(type)": { "index": 21, "kind": "function", "displayName": "Body 
As", "group": "function", "label": "function", "required": false, "javaType": 
"Object", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Converts the message body 
to the given type (classname).", "suffix": "}" },
-    "mandatoryBodyAs(type)": { "index": 22, "kind": "function", "displayName": 
"Mandatory Body As", "group": "function", "label": "function", "required": 
false, "javaType": "Object", "prefix": "${", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": 
"Converts the message body to the given type (classname). If the body is null 
then the function will fail with an exception", "suffix": "}" },
-    "headerAs(key,type)": { "index": 23, "kind": "function", "displayName": 
"Header As", "group": "function", "label": "function", "required": false, 
"javaType": "Object", "prefix": "${", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "Converts the message 
header to the given type (classname).", "suffix": "}" },
-    "headers": { "index": 24, "kind": "function", "displayName": "Headers", 
"group": "function", "label": "function", "required": false, "javaType": 
"java.util.Map", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Returns all the message 
headers in a Map", "suffix": "}" },
-    "variableAs(key,type)": { "index": 25, "kind": "function", "displayName": 
"Variable As", "group": "function", "label": "function", "required": false, 
"javaType": "Object", "prefix": "${", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "Converts the variable 
to the given type (classname).", "suffix": "}" },
-    "variables": { "index": 26, "kind": "function", "displayName": 
"Variables", "group": "function", "label": "function", "required": false, 
"javaType": "java.util.Map", "prefix": "${", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": 
"Returns all the variables from the current Exchange in a Map", "suffix": "}" },
-    "jq(input,exp)": { "index": 27, "kind": "function", "displayName": "JQ", 
"group": "function", "label": "function", "required": false, "javaType": 
"Object", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "When working with JSon 
data, then this allows using the JQ language, for example, to extract data from 
the message body (in JSon format). This requires having camel-jq JAR on the 
classpath. For input (optional), you can [...]
-    "jsonpath(input,exp)": { "index": 28, "kind": "function", "displayName": 
"JSonPath", "group": "function", "label": "function", "required": false, 
"javaType": "Object", "prefix": "${", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "When working with JSon 
data, then this allows using the JSonPath language, for example, to extract 
data from the message body (in JSon format). This requires having 
camel-jsonpath JAR on the classpath. For i [...]
-    "xpath(input,exp)": { "index": 29, "kind": "function", "displayName": 
"XPath", "group": "function", "label": "function", "required": false, 
"javaType": "Object", "prefix": "${", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "When working with XML 
data, then this allows using the XPath language, for example, to extract data 
from the message body (in XML format). This requires having camel-xpath JAR on 
the classpath. For input (optional [...]
-    "sys.name": { "index": 30, "kind": "function", "displayName": "JVM System 
Property", "group": "function", "label": "function", "required": false, 
"javaType": "Object", "prefix": "${", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "The JVM system 
property with the given name", "suffix": "}" },
-    "env.name": { "index": 31, "kind": "function", "displayName": "OS 
Environment Variable", "group": "function", "label": "function", "required": 
false, "javaType": "Object", "prefix": "${", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": "The 
OS environment variable with the given name", "suffix": "}" },
-    "pretty(exp)": { "index": 32, "kind": "function", "displayName": "Pretty 
Print", "group": "function", "label": "function", "required": false, 
"javaType": "String", "prefix": "${", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "Converts the 
expression to a String, and attempts to pretty print if JSon or XML, otherwise 
the expression is returned as the String value.", "suffix": "}" },
-    "date(command)": { "index": 33, "kind": "function", "displayName": "Parse 
Date", "group": "function", "label": "function", "required": false, "javaType": 
"java.util.Date", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Evaluates to a 
java.util.Date object. Supported commands are: `now` for current timestamp, 
`exchangeCreated` for the timestamp when the current exchange was created, 
`header.xxx` to use the Long\/Date ob [...]
-    "date-with-timezone(command:timezone:pattern)": { "index": 34, "kind": 
"function", "displayName": "Date Formatter", "group": "function", "label": 
"function", "required": false, "javaType": "String", "prefix": "${", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "Formats the date to a String using the given date 
pattern, and with support for timezone. Supported commands are: `now` for 
current timestamp, `exchangeCreated` for the timesta [...]
-    "bean(name.method)": { "index": 35, "kind": "function", "displayName": 
"Call Java Bean", "group": "function", "label": "function", "required": false, 
"javaType": "Object", "prefix": "${", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "Calls a Java bean. The 
name of the bean can also refer to a class name using type prefix as follows 
`bean:type:com.foo.MyClass`. If no method name is given then Camel will 
automatic attempt to find the b [...]
-    "propertiesExist:key": { "index": 36, "kind": "function", "displayName": 
"Property Placeholder Exists", "group": "function", "label": "function", 
"required": false, "javaType": "boolean", "prefix": "${", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": 
"Checks whether a property placeholder with the given key exists or not. The 
result can be negated by prefixing the key with !", "suffix": "}" },
-    "properties:key:default": { "index": 37, "kind": "function", 
"displayName": "Property Placeholder", "group": "function", "label": 
"function", "required": false, "javaType": "String", "prefix": "${", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "Lookup a property placeholder with the given key. If the 
key does not exist nor has a value, then an optional default value can be 
specified.", "suffix": "}" },
-    "ref:name": { "index": 38, "kind": "function", "displayName": "Bean By 
Id", "group": "function", "label": "function", "required": false, "javaType": 
"Object", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "To look up a bean from the 
Registry with the given name.", "suffix": "}" },
-    "type:name.field": { "index": 39, "kind": "function", "displayName": "Java 
Field Value", "group": "function", "label": "function", "required": false, 
"javaType": "Object", "prefix": "${", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "To refer to a type or 
field by its classname. To refer to a field, you can append .FIELD_NAME. For 
example, you can refer to the constant field from Exchange as: 
`org.apache.camel.Exchange.FILE_NAME`", " [...]
-    "replace(from,to,exp)": { "index": 40, "kind": "function", "displayName": 
"Replace String Values", "group": "function", "label": "function", "required": 
false, "javaType": "String", "prefix": "${", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": 
"Replace all the string values in the message body\/expression. To make it 
easier to replace single and double quotes, then you can use XML escaped values 
`\\&quot;` as double quote, `\\&apos;`  [...]
-    "substring(head,tail)": { "index": 41, "kind": "function", "displayName": 
"Substring", "group": "function", "label": "function", "required": false, 
"javaType": "String", "prefix": "${", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "Returns a substring of 
the message body\/expression. If only one positive number, then the returned 
string is clipped from the beginning. If only one negative number, then the 
returned string is clipped fr [...]
-    "random(min,max)": { "index": 42, "kind": "function", "displayName": 
"Generate Random Number", "group": "function", "label": "function", "required": 
false, "javaType": "int", "prefix": "${", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": 
"Returns a random number between min (included) and max (excluded).", "suffix": 
"}" },
-    "skip(num)": { "index": 43, "kind": "function", "displayName": "Skip First 
Items from the Message Body", "group": "function", "label": "function", 
"required": false, "javaType": "java.util.Iterator", "prefix": "${", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The skip function iterates the message body and skips 
the first number of items. This can be used with the Splitter EIP to split a 
message body and skip the first N number of  [...]
-    "collate(num)": { "index": 44, "kind": "function", "displayName": "Group 
Message Body into Sub Lists", "group": "function", "label": "function", 
"required": false, "javaType": "java.util.Iterator", "prefix": "${", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The collate function iterates the message body and 
groups the data into sub lists of specified size. This can be used with the 
Splitter EIP to split a message body and group\/ba [...]
-    "join(separator,prefix,exp)": { "index": 45, "kind": "function", 
"displayName": "Join", "group": "function", "label": "function", "required": 
false, "javaType": "String", "prefix": "${", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": "The 
join function iterates the message body\/expression and joins the data into a 
string. The separator is by default a comma. The prefix is optional. The join 
uses the message body as source by default.  [...]
-    "messageHistory(boolean)": { "index": 46, "kind": "function", 
"displayName": "Print Message History", "group": "function", "label": 
"function", "required": false, "javaType": "String", "prefix": "${", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The message history of the current exchange (how it has 
been routed). This is similar to the route stack-trace message history the 
error handler logs in case of an unhandled exception. The b [...]
-    "uuid(type)": { "index": 47, "kind": "function", "displayName": "Generate 
UUID", "group": "function", "label": "function", "required": false, "javaType": 
"String", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Returns a UUID using the 
Camel `UuidGenerator`. You can choose between `default`, `classic`, `short` and 
`simple` as the type. If no type is given, the default is used. It is also 
possible to use a custom `UuidG [...]
-    "hash(exp,algorithm)": { "index": 48, "kind": "function", "displayName": 
"Compute Hash Value", "group": "function", "label": "function", "required": 
false, "javaType": "String", "prefix": "${", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": 
"Returns a hashed value (string in hex decimal) of the message body\/expression 
using JDK MessageDigest. The algorithm can be SHA-256 (default) or SHA3-256.", 
"suffix": "}" },
-    "empty(type)": { "index": 49, "kind": "function", "displayName": "Create 
Empty Object", "group": "function", "label": "function", "required": false, 
"javaType": "Object", "prefix": "${", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "Creates a new empty 
object (decided by type). Use `string` to create an empty String. Use `list` to 
create an empty `java.util.ArrayList`. Use `map` to create an empty 
`java.util.HashMap`.", "suffix": "}" },
-    "iif(predicate,trueExp,falseExp)": { "index": 50, "kind": "function", 
"displayName": "If Then Else", "group": "function", "label": "function", 
"required": false, "javaType": "Object", "prefix": "${", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": 
"Evaluates the predicate and returns the value of trueExp or falseExp. This 
function is similar to the ternary operator in Java.", "suffix": "}" }
+    "body": { "index": 0, "kind": "function", "displayName": "Body", "group": 
"function", "label": "function", "required": false, "javaType": "Object", 
"prefix": "${", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The message body", "ognl": true, "suffix": "}" 
},
+    "prettyBody": { "index": 1, "kind": "function", "displayName": "Pretty 
Body", "group": "function", "label": "function", "required": false, "javaType": 
"String", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Converts the body to a 
String, and attempts to pretty print if JSon or XML; otherwise the body is 
returned as the String value.", "ognl": false, "suffix": "}" },
+    "bodyOneLine": { "index": 2, "kind": "function", "displayName": "Body One 
Line", "group": "function", "label": "function", "required": false, "javaType": 
"String", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Converts the body to a 
String and removes all line-breaks, so the string is in one line.", "ognl": 
false, "suffix": "}" },
+    "originalBody": { "index": 3, "kind": "function", "displayName": "Original 
Body", "group": "function", "label": "function", "required": false, "javaType": 
"Object", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The original incoming body 
(only available if allowUseOriginalMessage=true).", "ognl": false, "suffix": 
"}" },
+    "id": { "index": 4, "kind": "function", "displayName": "Id", "group": 
"function", "label": "function", "required": false, "javaType": "String", 
"prefix": "${", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The message id", "ognl": false, "suffix": "}" 
},
+    "messageTimestamp": { "index": 5, "kind": "function", "displayName": 
"Message Timestamp", "group": "function", "label": "function", "required": 
false, "javaType": "long", "prefix": "${", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": "The 
message timestamp (millis since epoc) that this message originates from. Some 
systems like JMS, Kafka, AWS have a timestamp on the event\/message that Camel 
received. This method returns the timestamp [...]
+    "exchangeId": { "index": 6, "kind": "function", "displayName": "Exchange 
Id", "group": "function", "label": "function", "required": false, "javaType": 
"String", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The exchange id", "ognl": 
false, "suffix": "}" },
+    "exchange": { "index": 7, "kind": "function", "displayName": "Exchange", 
"group": "function", "label": "function", "required": false, "javaType": 
"org.apache.camel.Exchange", "prefix": "${", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": "The 
current exchange", "ognl": true, "suffix": "}" },
+    "exception": { "index": 8, "kind": "function", "displayName": "Exception", 
"group": "function", "label": "function", "required": false, "javaType": 
"java.lang.Exception", "prefix": "${", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "The exception object 
on the exchange (also from caught exceptions), is null if no exception 
present.", "ognl": true, "suffix": "}" },
+    "exception.message": { "index": 9, "kind": "function", "displayName": 
"Exception Message", "group": "function", "label": "function", "required": 
false, "javaType": "String", "prefix": "${", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": "The 
exception message (also from caught exceptions), is null if no exception 
present.", "ognl": false, "suffix": "}" },
+    "exception.stackTrace": { "index": 10, "kind": "function", "displayName": 
"Exception Stacktrace", "group": "function", "label": "function", "required": 
false, "javaType": "String", "prefix": "${", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": "The 
exception stacktrace (also from caught exceptions), is null if no exception 
present.", "ognl": false, "suffix": "}" },
+    "threadId": { "index": 11, "kind": "function", "displayName": "Thread Id", 
"group": "function", "label": "function", "required": false, "javaType": 
"long", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Returns the id of the 
current thread. Can be used for logging.", "ognl": false, "suffix": "}" },
+    "threadName": { "index": 12, "kind": "function", "displayName": "Thread 
Name", "group": "function", "label": "function", "required": false, "javaType": 
"String", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Returns the name of the 
current thread. Can be used for logging.", "ognl": false, "suffix": "}" },
+    "hostName": { "index": 13, "kind": "function", "displayName": "Host Name", 
"group": "function", "label": "function", "required": false, "javaType": 
"String", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Returns the local hostname 
(may be empty if not possible to resolve).", "ognl": false, "suffix": "}" },
+    "camelId": { "index": 14, "kind": "function", "displayName": "Camel Id", 
"group": "function", "label": "function", "required": false, "javaType": 
"String", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The name of the 
CamelContext", "ognl": false, "suffix": "}" },
+    "routeId": { "index": 15, "kind": "function", "displayName": "Route Id", 
"group": "function", "label": "function", "required": false, "javaType": 
"String", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The route id of the 
current route the Exchange is being routed", "ognl": false, "suffix": "}" },
+    "fromRouteId": { "index": 16, "kind": "function", "displayName": "From 
Route Id", "group": "function", "label": "function", "required": false, 
"javaType": "String", "prefix": "${", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "The original route id 
where this exchange was created.", "ognl": false, "suffix": "}" },
+    "routeGroup": { "index": 17, "kind": "function", "displayName": "Route 
Group", "group": "function", "label": "function", "required": false, 
"javaType": "String", "prefix": "${", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "Returns the route 
group of the current route the Exchange is being routed. Not all routes have a 
group assigned, so this may be null.", "ognl": false, "suffix": "}" },
+    "stepId": { "index": 18, "kind": "function", "displayName": "Step Id", 
"group": "function", "label": "function", "required": false, "javaType": 
"String", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Returns the id of the 
current step the Exchange is being routed.", "ognl": false, "suffix": "}" },
+    "null": { "index": 19, "kind": "function", "displayName": "Null", "group": 
"function", "label": "function", "required": false, "javaType": "Object", 
"prefix": "${", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Represents a null value", "ognl": false, 
"suffix": "}" },
+    "messageAs(type)": { "index": 20, "kind": "function", "displayName": 
"Message As", "group": "function", "label": "function", "required": false, 
"javaType": "Object", "prefix": "${", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "Converts the message 
to the given type (classname).", "ognl": true, "suffix": "}" },
+    "bodyAs(type)": { "index": 21, "kind": "function", "displayName": "Body 
As", "group": "function", "label": "function", "required": false, "javaType": 
"Object", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Converts the message body 
to the given type (classname).", "ognl": true, "suffix": "}" },
+    "mandatoryBodyAs(type)": { "index": 22, "kind": "function", "displayName": 
"Mandatory Body As", "group": "function", "label": "function", "required": 
false, "javaType": "Object", "prefix": "${", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": 
"Converts the message body to the given type (classname). If the body is null 
then the function will fail with an exception", "ognl": true, "suffix": "}" },
+    "headerAs(key,type)": { "index": 23, "kind": "function", "displayName": 
"Header As", "group": "function", "label": "function", "required": false, 
"javaType": "Object", "prefix": "${", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "Converts the message 
header to the given type (classname).", "ognl": false, "suffix": "}" },
+    "headers": { "index": 24, "kind": "function", "displayName": "Headers", 
"group": "function", "label": "function", "required": false, "javaType": 
"java.util.Map", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Returns all the message 
headers in a Map", "ognl": false, "suffix": "}" },
+    "header.name": { "index": 25, "kind": "function", "displayName": "Header", 
"group": "function", "label": "function", "required": false, "javaType": 
"Object", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The message header with 
the given name", "ognl": true, "suffix": "}" },
+    "variableAs(key,type)": { "index": 26, "kind": "function", "displayName": 
"Variable As", "group": "function", "label": "function", "required": false, 
"javaType": "Object", "prefix": "${", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "Converts the variable 
to the given type (classname).", "ognl": false, "suffix": "}" },
+    "variables": { "index": 27, "kind": "function", "displayName": 
"Variables", "group": "function", "label": "function", "required": false, 
"javaType": "java.util.Map", "prefix": "${", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": 
"Returns all the variables from the current Exchange in a Map", "ognl": false, 
"suffix": "}" },
+    "variable.name": { "index": 28, "kind": "function", "displayName": 
"Variable", "group": "function", "label": "function", "required": false, 
"javaType": "Object", "prefix": "${", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "The variable with the 
given name", "ognl": true, "suffix": "}" },
+    "exchangeProperty.name": { "index": 29, "kind": "function", "displayName": 
"Exchange Property", "group": "function", "label": "function", "required": 
false, "javaType": "Object", "prefix": "${", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": "The 
exchange property with the given name", "ognl": true, "suffix": "}" },
+    "camelContext": { "index": 30, "kind": "function", "displayName": "Camel 
Context", "group": "function", "label": "function", "required": false, 
"javaType": "Object", "prefix": "${", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "The Camel Context", 
"ognl": true, "suffix": "}" },
+    "jq(input,exp)": { "index": 31, "kind": "function", "displayName": "JQ", 
"group": "function", "label": "function", "required": false, "javaType": 
"Object", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "When working with JSon 
data, then this allows using the JQ language, for example, to extract data from 
the message body (in JSon format). This requires having camel-jq JAR on the 
classpath. For input (optional), you can [...]
+    "jsonpath(input,exp)": { "index": 32, "kind": "function", "displayName": 
"JSonPath", "group": "function", "label": "function", "required": false, 
"javaType": "Object", "prefix": "${", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "When working with JSon 
data, then this allows using the JSonPath language, for example, to extract 
data from the message body (in JSon format). This requires having 
camel-jsonpath JAR on the classpath. For i [...]
+    "xpath(input,exp)": { "index": 33, "kind": "function", "displayName": 
"XPath", "group": "function", "label": "function", "required": false, 
"javaType": "Object", "prefix": "${", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "When working with XML 
data, then this allows using the XPath language, for example, to extract data 
from the message body (in XML format). This requires having camel-xpath JAR on 
the classpath. For input (optional [...]
+    "sys.name": { "index": 34, "kind": "function", "displayName": "JVM System 
Property", "group": "function", "label": "function", "required": false, 
"javaType": "Object", "prefix": "${", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "The JVM system 
property with the given name", "ognl": false, "suffix": "}" },
+    "env.name": { "index": 35, "kind": "function", "displayName": "OS 
Environment Variable", "group": "function", "label": "function", "required": 
false, "javaType": "Object", "prefix": "${", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": "The 
OS environment variable with the given name", "ognl": false, "suffix": "}" },
+    "pretty(exp)": { "index": 36, "kind": "function", "displayName": "Pretty 
Print", "group": "function", "label": "function", "required": false, 
"javaType": "String", "prefix": "${", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "Converts the 
expression to a String, and attempts to pretty print if JSon or XML, otherwise 
the expression is returned as the String value.", "ognl": false, "suffix": "}" 
},
+    "date(command)": { "index": 37, "kind": "function", "displayName": "Parse 
Date", "group": "function", "label": "function", "required": false, "javaType": 
"java.util.Date", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Evaluates to a 
java.util.Date object. Supported commands are: `now` for current timestamp, 
`exchangeCreated` for the timestamp when the current exchange was created, 
`header.xxx` to use the Long\/Date ob [...]
+    "date-with-timezone(command:timezone:pattern)": { "index": 38, "kind": 
"function", "displayName": "Date Formatter", "group": "function", "label": 
"function", "required": false, "javaType": "String", "prefix": "${", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "Formats the date to a String using the given date 
pattern, and with support for timezone. Supported commands are: `now` for 
current timestamp, `exchangeCreated` for the timesta [...]
+    "bean(name.method)": { "index": 39, "kind": "function", "displayName": 
"Call Java Bean", "group": "function", "label": "function", "required": false, 
"javaType": "Object", "prefix": "${", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "Calls a Java bean. The 
name of the bean can also refer to a class name using type prefix as follows 
`bean:type:com.foo.MyClass`. If no method name is given then Camel will 
automatic attempt to find the b [...]
+    "propertiesExist:key": { "index": 40, "kind": "function", "displayName": 
"Property Placeholder Exists", "group": "function", "label": "function", 
"required": false, "javaType": "boolean", "prefix": "${", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": 
"Checks whether a property placeholder with the given key exists or not. The 
result can be negated by prefixing the key with !", "ognl": false, "suffix": 
"}" },
+    "properties:key:default": { "index": 41, "kind": "function", 
"displayName": "Property Placeholder", "group": "function", "label": 
"function", "required": false, "javaType": "String", "prefix": "${", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "Lookup a property placeholder with the given key. If the 
key does not exist nor has a value, then an optional default value can be 
specified.", "ognl": false, "suffix": "}" },
+    "ref:name": { "index": 42, "kind": "function", "displayName": "Bean By 
Id", "group": "function", "label": "function", "required": false, "javaType": 
"Object", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "To look up a bean from the 
Registry with the given name.", "ognl": false, "suffix": "}" },
+    "type:name.field": { "index": 43, "kind": "function", "displayName": "Java 
Field Value", "group": "function", "label": "function", "required": false, 
"javaType": "Object", "prefix": "${", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "To refer to a type or 
field by its classname. To refer to a field, you can append .FIELD_NAME. For 
example, you can refer to the constant field from Exchange as: 
`org.apache.camel.Exchange.FILE_NAME`", " [...]
+    "replace(from,to,exp)": { "index": 44, "kind": "function", "displayName": 
"Replace String Values", "group": "function", "label": "function", "required": 
false, "javaType": "String", "prefix": "${", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": 
"Replace all the string values in the message body\/expression. To make it 
easier to replace single and double quotes, then you can use XML escaped values 
`\\&quot;` as double quote, `\\&apos;`  [...]
+    "substring(head,tail)": { "index": 45, "kind": "function", "displayName": 
"Substring", "group": "function", "label": "function", "required": false, 
"javaType": "String", "prefix": "${", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "Returns a substring of 
the message body\/expression. If only one positive number, then the returned 
string is clipped from the beginning. If only one negative number, then the 
returned string is clipped fr [...]
+    "random(min,max)": { "index": 46, "kind": "function", "displayName": 
"Generate Random Number", "group": "function", "label": "function", "required": 
false, "javaType": "int", "prefix": "${", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": 
"Returns a random number between min (included) and max (excluded).", "ognl": 
false, "suffix": "}" },
+    "skip(num)": { "index": 47, "kind": "function", "displayName": "Skip First 
Items from the Message Body", "group": "function", "label": "function", 
"required": false, "javaType": "java.util.Iterator", "prefix": "${", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The skip function iterates the message body and skips 
the first number of items. This can be used with the Splitter EIP to split a 
message body and skip the first N number of  [...]
+    "collate(num)": { "index": 48, "kind": "function", "displayName": "Group 
Message Body into Sub Lists", "group": "function", "label": "function", 
"required": false, "javaType": "java.util.Iterator", "prefix": "${", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The collate function iterates the message body and 
groups the data into sub lists of specified size. This can be used with the 
Splitter EIP to split a message body and group\/ba [...]
+    "join(separator,prefix,exp)": { "index": 49, "kind": "function", 
"displayName": "Join", "group": "function", "label": "function", "required": 
false, "javaType": "String", "prefix": "${", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": "The 
join function iterates the message body\/expression and joins the data into a 
string. The separator is by default a comma. The prefix is optional. The join 
uses the message body as source by default.  [...]
+    "messageHistory(boolean)": { "index": 50, "kind": "function", 
"displayName": "Print Message History", "group": "function", "label": 
"function", "required": false, "javaType": "String", "prefix": "${", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The message history of the current exchange (how it has 
been routed). This is similar to the route stack-trace message history the 
error handler logs in case of an unhandled exception. The b [...]
+    "uuid(type)": { "index": 51, "kind": "function", "displayName": "Generate 
UUID", "group": "function", "label": "function", "required": false, "javaType": 
"String", "prefix": "${", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Returns a UUID using the 
Camel `UuidGenerator`. You can choose between `default`, `classic`, `short` and 
`simple` as the type. If no type is given, the default is used. It is also 
possible to use a custom `UuidG [...]
+    "hash(exp,algorithm)": { "index": 52, "kind": "function", "displayName": 
"Compute Hash Value", "group": "function", "label": "function", "required": 
false, "javaType": "String", "prefix": "${", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": 
"Returns a hashed value (string in hex decimal) of the message body\/expression 
using JDK MessageDigest. The algorithm can be SHA-256 (default) or SHA3-256.", 
"ognl": false, "suffix": "}" },
+    "empty(type)": { "index": 53, "kind": "function", "displayName": "Create 
Empty Object", "group": "function", "label": "function", "required": false, 
"javaType": "Object", "prefix": "${", "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "Creates a new empty 
object (decided by type). Use `string` to create an empty String. Use `list` to 
create an empty `java.util.ArrayList`. Use `map` to create an empty 
`java.util.HashMap`.", "ognl": false [...]
+    "iif(predicate,trueExp,falseExp)": { "index": 54, "kind": "function", 
"displayName": "If Then Else", "group": "function", "label": "function", 
"required": false, "javaType": "Object", "prefix": "${", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": 
"Evaluates the predicate and returns the value of trueExp or falseExp. This 
function is similar to the ternary operator in Java.", "ognl": false, "suffix": 
"}" }
   }
 }
diff --git 
a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleConstants.java
 
b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleConstants.java
index fe14c98c6e8..a4be0023117 100644
--- 
a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleConstants.java
+++ 
b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleConstants.java
@@ -21,7 +21,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "function", annotations = { "prefix=${", "suffix=}" })
 public final class SimpleConstants {
 
-    @Metadata(description = "The message body", javaType = "Object", label = 
"function")
+    @Metadata(description = "The message body", javaType = "Object", label = 
"function,ognl")
     public static final String BODY = "body";
     @Metadata(description = "Converts the body to a String, and attempts to 
pretty print if JSon or XML; otherwise the body is returned as the String 
value.",
               javaType = "String", label = "function")
@@ -44,10 +44,10 @@ public final class SimpleConstants {
     public static final String MESSAGE_TIMESTAMP = "messageTimestamp";
     @Metadata(description = "The exchange id", javaType = "String", label = 
"function")
     public static final String EXCHANGE_ID = "exchangeId";
-    @Metadata(description = "The exchange", javaType = 
"org.apache.camel.Exchange", label = "function")
+    @Metadata(description = "The current exchange", javaType = 
"org.apache.camel.Exchange", label = "function,ognl")
     public static final String EXCHANGE = "exchange";
     @Metadata(description = "The exception object on the exchange (also from 
caught exceptions), is null if no exception present.",
-              javaType = "java.lang.Exception", label = "function")
+              javaType = "java.lang.Exception", label = "function,ognl")
     public static final String EXCEPTION = "exception";
     @Metadata(description = "The exception message (also from caught 
exceptions), is null if no exception present.",
               javaType = "String", label = "function", displayName = 
"Exception Message")
@@ -79,23 +79,32 @@ public final class SimpleConstants {
     public static final String STEP_ID = "stepId";
     @Metadata(description = "Represents a null value", label = "function", 
javaType = "Object")
     public static final String NULL = "null";
-    @Metadata(description = "Converts the message to the given type 
(classname).", label = "function", javaType = "Object")
+    @Metadata(description = "Converts the message to the given type 
(classname).", label = "function,ognl", javaType = "Object")
     public static final String MESSAGE_AS = "messageAs(type)";
-    @Metadata(description = "Converts the message body to the given type 
(classname).", label = "function", javaType = "Object")
+    @Metadata(description = "Converts the message body to the given type 
(classname).", label = "function,ognl",
+              javaType = "Object")
     public static final String BODY_AS = "bodyAs(type)";
     @Metadata(description = "Converts the message body to the given type 
(classname). If the body is null then the function will fail with an exception",
-              label = "function", javaType = "Object")
+              label = "function,ognl", javaType = "Object")
     public static final String MANDATORY_BODY_AS = "mandatoryBodyAs(type)";
     @Metadata(description = "Converts the message header to the given type 
(classname).", label = "function",
               javaType = "Object")
     public static final String HEADER_AS = "headerAs(key,type)";
     @Metadata(description = "Returns all the message headers in a Map", label 
= "function", javaType = "java.util.Map")
     public static final String HEADERS = "headers";
+    @Metadata(description = "The message header with the given name", label = 
"function,ognl", javaType = "Object")
+    public static final String HEADER = "header.name";
     @Metadata(description = "Converts the variable to the given type 
(classname).", label = "function", javaType = "Object")
     public static final String VARIABLE_AS = "variableAs(key,type)";
     @Metadata(description = "Returns all the variables from the current 
Exchange in a Map", label = "function",
               javaType = "java.util.Map")
     public static final String VARIABLES = "variables";
+    @Metadata(description = "The variable with the given name", label = 
"function,ognl", javaType = "Object")
+    public static final String VARIABLE = "variable.name";
+    @Metadata(description = "The exchange property with the given name", label 
= "function,ognl", javaType = "Object")
+    public static final String EXCHANGE_PROPERTY = "exchangeProperty.name";
+    @Metadata(description = "The Camel Context", label = "function,ognl", 
javaType = "Object")
+    public static final String CAMEL_CONTEXT = "camelContext";
     @Metadata(description = "When working with JSon data, then this allows 
using the JQ language, for example, to extract data from the message body (in 
JSon format). This requires having camel-jq JAR on the classpath."
                             + " For input (optional), you can choose 
`header:key`, `exchangeProperty:key` or `variable:key` to use as input for the 
JSon payload instead of the message body.",
               label = "function", javaType = "Object", displayName = "JQ")
diff --git 
a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JsonMapper.java
 
b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JsonMapper.java
index d01b4a3a4c4..249e1951cbc 100644
--- 
a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JsonMapper.java
+++ 
b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JsonMapper.java
@@ -609,6 +609,7 @@ public final class JsonMapper {
             var o = options.get(i);
             o.setIndex(i);
             JsonObject jo = asJsonObject(o);
+            jo.put("ognl", o.isOgnl());
             if (o.getPrefix() != null) {
                 jo.put("prefix", o.getPrefix());
             }
diff --git 
a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/LanguageModel.java
 
b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/LanguageModel.java
index 429ad3ea929..36fd690f6f0 100644
--- 
a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/LanguageModel.java
+++ 
b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/LanguageModel.java
@@ -68,6 +68,11 @@ public class LanguageModel extends 
ArtifactModel<LanguageModel.LanguageOptionMod
          */
         private String constantName;
 
+        /**
+         * Whether this function allows to do OGNL method calls.
+         */
+        boolean ognl;
+
         /**
          * Optional prefix for the function
          */
@@ -86,6 +91,14 @@ public class LanguageModel extends 
ArtifactModel<LanguageModel.LanguageOptionMod
             this.constantName = constantName;
         }
 
+        public boolean isOgnl() {
+            return ognl;
+        }
+
+        public void setOgnl(boolean ognl) {
+            this.ognl = ognl;
+        }
+
         @Override
         public String getPrefix() {
             return prefix;
diff --git 
a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageLanguageMojo.java
 
b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageLanguageMojo.java
index 9535b311415..81b8adf5b0c 100644
--- 
a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageLanguageMojo.java
+++ 
b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageLanguageMojo.java
@@ -336,9 +336,16 @@ public class PackageLanguageMojo extends 
AbstractGeneratorMojo {
         fun.setDeprecated(field.isAnnotationPresent(Deprecated.class));
         fun.setDeprecationNote(metadata.deprecationNote());
         fun.setSecret(metadata.secret());
-        String group = EndpointHelper.labelAsGroupName(metadata.label(), 
false, false);
+        String label = metadata.label();
+        boolean ognl = false;
+        if (label.contains(",ognl")) {
+            ognl = true;
+            label = label.replace(",ognl", "");
+        }
+        String group = EndpointHelper.labelAsGroupName(label, false, false);
         fun.setGroup(group);
-        fun.setLabel(metadata.label());
+        fun.setLabel(label);
+        fun.setOgnl(ognl);
         model.addFunction(fun);
     }
 

Reply via email to