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

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

commit 06b8176b534746336e3b0026608ec08b9dcd6162
Author: Claus Ibsen <[email protected]>
AuthorDate: Sat Oct 24 19:57:06 2026 +0200

    CAMEL-24961: Catalog body types for the seven huawei cloud components and 
the six openstack components (#28406)
    
    Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
    Signed-off-by: Claus Ibsen <[email protected]>
---
 .../camel/catalog/components/hwcloud-dms.json      |  4 ++
 .../camel/catalog/components/hwcloud-frs.json      |  4 ++
 .../catalog/components/hwcloud-functiongraph.json  |  4 ++
 .../camel/catalog/components/hwcloud-iam.json      |  4 ++
 .../components/hwcloud-imagerecognition.json       |  4 ++
 .../camel/catalog/components/hwcloud-obs.json      |  5 +++
 .../camel/catalog/components/hwcloud-smn.json      |  4 ++
 .../camel/catalog/components/openstack-cinder.json |  4 ++
 .../camel/catalog/components/openstack-glance.json |  4 ++
 .../catalog/components/openstack-keystone.json     |  4 ++
 .../catalog/components/openstack-neutron.json      |  4 ++
 .../camel/catalog/components/openstack-nova.json   |  4 ++
 .../camel/catalog/components/openstack-swift.json  |  4 ++
 .../catalog/docs/openstack-swift-component.adoc    |  3 ++
 .../component/huaweicloud/dms/hwcloud-dms.json     |  4 ++
 .../component/huaweicloud/dms/DMSEndpoint.java     | 32 +++++++++++++++
 .../component/huaweicloud/frs/hwcloud-frs.json     |  4 ++
 .../huaweicloud/frs/FaceRecognitionEndpoint.java   | 14 +++++++
 .../org/apache/camel/hwcloud-functiongraph.json    |  4 ++
 .../org/apache/camel/FunctionGraphEndpoint.java    | 12 ++++++
 .../component/huaweicloud/iam/hwcloud-iam.json     |  4 ++
 .../component/huaweicloud/iam/IAMEndpoint.java     | 19 +++++++++
 .../image/hwcloud-imagerecognition.json            |  4 ++
 .../image/ImageRecognitionEndpoint.java            | 18 +++++++++
 .../component/huaweicloud/obs/hwcloud-obs.json     |  5 +++
 .../component/huaweicloud/obs/OBSEndpoint.java     | 45 ++++++++++++++++++++++
 .../component/huaweicloud/smn/hwcloud-smn.json     |  4 ++
 .../smn/SimpleNotificationEndpoint.java            | 16 ++++++++
 .../openstack/cinder/openstack-cinder.json         |  4 ++
 .../openstack/glance/openstack-glance.json         |  4 ++
 .../openstack/keystone/openstack-keystone.json     |  4 ++
 .../openstack/neutron/openstack-neutron.json       |  4 ++
 .../component/openstack/nova/openstack-nova.json   |  4 ++
 .../component/openstack/swift/openstack-swift.json |  4 ++
 .../src/main/docs/openstack-swift-component.adoc   |  3 ++
 .../component/openstack/cinder/CinderEndpoint.java | 15 ++++++++
 .../component/openstack/glance/GlanceEndpoint.java | 20 ++++++++++
 .../openstack/keystone/KeystoneEndpoint.java       | 24 ++++++++++++
 .../openstack/neutron/NeutronEndpoint.java         | 19 +++++++++
 .../component/openstack/nova/NovaEndpoint.java     | 20 ++++++++++
 .../component/openstack/swift/SwiftEndpoint.java   | 22 +++++++++++
 41 files changed, 388 insertions(+)

diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/hwcloud-dms.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/hwcloud-dms.json
index a46f4bfa101f..a3e5a7107b55 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/hwcloud-dms.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/hwcloud-dms.json
@@ -27,6 +27,10 @@
     "lazyStartProducer": { "index": 0, "kind": "property", "displayName": 
"Lazy Start Producer", "group": "producer", "label": "producer", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, "description": 
"Whether the producer should be started lazy (on the first message). By 
starting lazy you can use this to allow CamelContext and routes to startup in 
situations where a producer may otherwise fail [...]
     "autowiredEnabled": { "index": 1, "kind": "property", "displayName": 
"Autowired Enabled", "group": "advanced", "label": "advanced", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": true, "description": 
"Whether autowiring is enabled. This is used for automatic autowiring options 
(the option must be marked as autowired) by looking up in the registry to find 
if there is a single instance of matching t [...]
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": 
"operation", "value": "createInstance", "carriers": [ "text", "pojo" ] }, { 
"option": "operation", "value": "updateInstance", "carriers": [ "text", "pojo" 
] } ], "description": "Not used by deleteInstance, listInstances and 
queryInstance, which take the instance id and the engine from the options or 
exchange properties such as CamelHwCloudDmsInstanceId. createInstance takes a 
CreateInstanceRequestBody or its JSON as tex [...]
+    "producerOut": { "carriers": [ "unchanged" ], "byOption": [ { "option": 
"operation", "value": "createInstance", "carriers": [ "text" ], "javaType": 
"java.lang.String" }, { "option": "operation", "value": "listInstances", 
"carriers": [ "text" ], "javaType": "java.lang.String" }, { "option": 
"operation", "value": "queryInstance", "carriers": [ "text" ], "javaType": 
"java.lang.String" } ], "description": "The JSON of the response as text: the 
id of the new instance for createInstance, t [...]
+  },
   "properties": {
     "operation": { "index": 0, "kind": "path", "displayName": "Operation", 
"group": "producer", "label": "producer", "required": true, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Operation to be performed" 
},
     "accessKey": { "index": 1, "kind": "parameter", "displayName": "API access 
key (AK)", "group": "producer", "label": "", "required": true, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": true, "security": 
"secret", "description": "Access key for the cloud user" },
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/hwcloud-frs.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/hwcloud-frs.json
index 213725c4de6c..e5cf4dfaa5d3 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/hwcloud-frs.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/hwcloud-frs.json
@@ -27,6 +27,10 @@
     "lazyStartProducer": { "index": 0, "kind": "property", "displayName": 
"Lazy Start Producer", "group": "producer", "label": "producer", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, "description": 
"Whether the producer should be started lazy (on the first message). By 
starting lazy you can use this to allow CamelContext and routes to startup in 
situations where a producer may otherwise fail [...]
     "autowiredEnabled": { "index": 1, "kind": "property", "displayName": 
"Autowired Enabled", "group": "advanced", "label": "advanced", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": true, "description": 
"Whether autowiring is enabled. This is used for automatic autowiring options 
(the option must be marked as autowired) by looking up in the registry to find 
if there is a single instance of matching t [...]
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "description": "Not used, not even 
for the image: the image comes from the options or the exchange properties as 
base64 (CamelHwCloudFrsImageBase64), a URL (CamelHwCloudFrsImageUrl) or a local 
file path (CamelHwCloudFrsImageFilePath), the second image of faceVerification 
from the CamelHwCloudFrsAnotherImage properties, and the video of 
faceLiveDetection from the CamelHwCloudFrsVideo properties" },
+    "producerOut": { "carriers": [ "pojo" ], "description": "The response of 
the Huawei Cloud SDK for the operation and the source of the image, such as the 
DetectFaceByBase64Response of faceDetection with base64, which holds the faces 
found" }
+  },
   "properties": {
     "operation": { "index": 0, "kind": "path", "displayName": "Operation 
name", "group": "producer", "label": "producer", "required": true, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": 
"Name of Face Recognition operation to perform, including faceDetection, 
faceVerification and faceLiveDetection" },
     "accessKey": { "index": 1, "kind": "parameter", "displayName": "Account 
access key (AK)", "group": "producer", "label": "", "required": true, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": true, "security": 
"secret", "description": "Access key for the cloud user" },
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/hwcloud-functiongraph.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/hwcloud-functiongraph.json
index ca11b59ccc62..d4329e6c5174 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/hwcloud-functiongraph.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/hwcloud-functiongraph.json
@@ -27,6 +27,10 @@
     "lazyStartProducer": { "index": 0, "kind": "property", "displayName": 
"Lazy Start Producer", "group": "producer", "label": "producer", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, "description": 
"Whether the producer should be started lazy (on the first message). By 
starting lazy you can use this to allow CamelContext and routes to startup in 
situations where a producer may otherwise fail [...]
     "autowiredEnabled": { "index": 1, "kind": "property", "displayName": 
"Autowired Enabled", "group": "advanced", "label": "advanced", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": true, "description": 
"Whether autowiring is enabled. This is used for automatic autowiring options 
(the option must be marked as autowired) by looking up in the registry to find 
if there is a single instance of matching t [...]
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "map", "text" ], "description": "The event 
of the function, as a Map or a JSON object as text. Bytes, a stream, a file, a 
JSON array, a POJO or no body fail: convert the body to a String or a Map 
first" },
+    "producerOut": { "carriers": [ "text", "null" ], "description": "The body 
field of the result of the function as text: a string as it is, an object or an 
array as JSON. No body when the result has no body field. With the 
CamelHwCloudFgXCffLogType exchange property set, the log of the call is in the 
CamelHwCloudFgXCffLogs exchange property" }
+  },
   "properties": {
     "operation": { "index": 0, "kind": "path", "displayName": "Operation", 
"group": "producer", "label": "producer", "required": true, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Operation to be performed" 
},
     "endpoint": { "index": 1, "kind": "parameter", "displayName": "Service 
endpoint", "group": "producer", "label": "", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": 
"FunctionGraph url. Carries higher precedence than region parameter based 
client initialization" },
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/hwcloud-iam.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/hwcloud-iam.json
index 87ee67035a88..b8f04f244e6f 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/hwcloud-iam.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/hwcloud-iam.json
@@ -27,6 +27,10 @@
     "lazyStartProducer": { "index": 0, "kind": "property", "displayName": 
"Lazy Start Producer", "group": "producer", "label": "producer", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, "description": 
"Whether the producer should be started lazy (on the first message). By 
starting lazy you can use this to allow CamelContext and routes to startup in 
situations where a producer may otherwise fail [...]
     "autowiredEnabled": { "index": 1, "kind": "property", "displayName": 
"Autowired Enabled", "group": "advanced", "label": "advanced", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": true, "description": 
"Whether autowiring is enabled. This is used for automatic autowiring options 
(the option must be marked as autowired) by looking up in the registry to find 
if there is a single instance of matching t [...]
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": 
"operation", "value": "updateUser", "carriers": [ "text", "pojo" ] }, { 
"option": "operation", "value": "updateGroup", "carriers": [ "text", "pojo" ] } 
], "description": "Not used by the list and get operations, which take the ids 
from the options or the CamelHwCloudIamUserId and CamelHwCloudIamGroupId 
exchange properties. updateUser needs an UpdateUserOption of the Huawei Cloud 
SDK or its JSON as text, and updateGroup  [...]
+    "producerOut": { "carriers": [ "text" ], "javaType": "java.lang.String", 
"format": "json", "description": "The JSON of the result as text: the array of 
the users or the groups for listUsers, listGroups and getGroupUsers, the user 
or the group for getUser, updateUser and updateGroup. The keys are the field 
names of the Huawei Cloud SDK, such as domainId" }
+  },
   "properties": {
     "operation": { "index": 0, "kind": "path", "displayName": "Operation", 
"group": "producer", "label": "producer", "required": true, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Operation to be performed" 
},
     "accessKey": { "index": 1, "kind": "parameter", "displayName": "API access 
key (AK)", "group": "producer", "label": "", "required": true, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": true, "security": 
"secret", "description": "Access key for the cloud user" },
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/hwcloud-imagerecognition.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/hwcloud-imagerecognition.json
index 62d32ec88fc2..0dc79160f15f 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/hwcloud-imagerecognition.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/hwcloud-imagerecognition.json
@@ -27,6 +27,10 @@
     "lazyStartProducer": { "index": 0, "kind": "property", "displayName": 
"Lazy Start Producer", "group": "producer", "label": "producer", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, "description": 
"Whether the producer should be started lazy (on the first message). By 
starting lazy you can use this to allow CamelContext and routes to startup in 
situations where a producer may otherwise fail [...]
     "autowiredEnabled": { "index": 1, "kind": "property", "displayName": 
"Autowired Enabled", "group": "advanced", "label": "advanced", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": true, "description": 
"Whether autowiring is enabled. This is used for automatic autowiring options 
(the option must be marked as autowired) by looking up in the registry to find 
if there is a single instance of matching t [...]
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "description": "Not used, not even 
for the image: the image comes from the imageContent option or the 
CamelHwCloudImageContent exchange property as base64, or from the imageUrl 
option or the CamelHwCloudImageUrl exchange property as a URL" },
+    "producerOut": { "carriers": [ "list", "pojo" ], "byOption": [ { "option": 
"operation", "value": "celebrityRecognition", "carriers": [ "list" ], 
"javaType": 
"java.util.List<com.huaweicloud.sdk.image.v2.model.CelebrityRecognitionResultBody>"
 }, { "option": "operation", "value": "tagRecognition", "carriers": [ "pojo" ], 
"javaType": "com.huaweicloud.sdk.image.v2.model.ImageTaggingResponseResult" } 
], "description": "The result of the Huawei Cloud SDK: for celebrityRecognition 
a List wit [...]
+  },
   "properties": {
     "operation": { "index": 0, "kind": "path", "displayName": "Operation 
name", "group": "producer", "label": "producer", "required": true, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": 
"Name of Image Recognition operation to perform, including celebrityRecognition 
and tagRecognition" },
     "accessKey": { "index": 1, "kind": "parameter", "displayName": "Account 
access key (AK)", "group": "producer", "label": "", "required": true, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": true, "security": 
"secret", "description": "Access key for the cloud user" },
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/hwcloud-obs.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/hwcloud-obs.json
index 07a27257ba6d..136e28769e21 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/hwcloud-obs.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/hwcloud-obs.json
@@ -41,6 +41,11 @@
     "Content-Type": { "index": 7, "kind": "header", "displayName": "", 
"group": "consumer", "label": "consumer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The type of content stored in the object", 
"constantName": 
"org.apache.camel.component.huaweicloud.obs.constants.OBSHeaders#CONTENT_TYPE" 
},
     "CamelFileName": { "index": 8, "kind": "header", "displayName": "", 
"group": "consumer", "label": "consumer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Name of the object with which the operation is 
to be performed", "constantName": 
"org.apache.camel.component.huaweicloud.obs.constants.OBSHeaders#FILE_NAME" }
   },
+  "bodyTypes": {
+    "consumerOut": { "carriers": [ "bytes" ], "javaType": "byte[]", 
"description": "The content of the object as a byte array, one message per 
object, with its bucket, key and metadata in headers such as 
CamelHwCloudObsObjectKey, and the key in CamelFileName too. Folders are 
consumed too, with an empty body, unless includeFolders=false" },
+    "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": 
"operation", "value": "putObject", "carriers": [ "text", "bytes", "stream", 
"file" ] }, { "option": "operation", "value": "createBucket", "carriers": [ 
"text", "pojo" ] }, { "option": "operation", "value": "listObjects", 
"carriers": [ "text", "pojo" ] } ], "description": "For putObject the content 
to upload: text, bytes, a stream or a file, such as the file of a file 
consumer, whose name is the object name when objectNa [...]
+    "producerOut": { "carriers": [ "unchanged" ], "byOption": [ { "option": 
"operation", "value": "putObject", "carriers": [ "text" ], "javaType": 
"java.lang.String" }, { "option": "operation", "value": "getObject", 
"carriers": [ "bytes" ], "javaType": "byte[]" }, { "option": "operation", 
"value": "listObjects", "carriers": [ "text" ], "javaType": "java.lang.String" 
}, { "option": "operation", "value": "listBuckets", "carriers": [ "text" ], 
"javaType": "java.lang.String" }, { "option": " [...]
+  },
   "properties": {
     "operation": { "index": 0, "kind": "path", "displayName": "Operation", 
"group": "producer", "label": "producer", "required": true, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Operation to be performed" 
},
     "bucketName": { "index": 1, "kind": "parameter", "displayName": "Bucket 
Name", "group": "common", "label": "", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "endpointIdentity": true, "description": 
"Name of bucket to perform operation on" },
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/hwcloud-smn.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/hwcloud-smn.json
index bc9d4331b5ba..9264f439019a 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/hwcloud-smn.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/hwcloud-smn.json
@@ -27,6 +27,10 @@
     "lazyStartProducer": { "index": 0, "kind": "property", "displayName": 
"Lazy Start Producer", "group": "producer", "label": "producer", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, "description": 
"Whether the producer should be started lazy (on the first message). By 
starting lazy you can use this to allow CamelContext and routes to startup in 
situations where a producer may otherwise fail [...]
     "autowiredEnabled": { "index": 1, "kind": "property", "displayName": 
"Autowired Enabled", "group": "advanced", "label": "advanced", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": true, "description": 
"Whether autowiring is enabled. This is used for automatic autowiring options 
(the option must be marked as autowired) by looking up in the registry to find 
if there is a single instance of matching t [...]
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "text", "bytes", "stream", "file" ], 
"byOption": [ { "option": "operation", "value": "publishAsTemplatedMessage", 
"carriers": [ "text", "bytes", "stream", "file", "null" ] } ], "description": 
"The message to publish, as text: bytes, a stream or a file are read as text, 
and a Map or a POJO is sent as its toString(): marshal it first. No body fails 
for publishAsTextMessage, while publishAsTemplatedMessage can have no body, 
with the template from the CamelH [...]
+    "producerOut": { "carriers": [ "unchanged" ], "description": "Unchanged, 
with the ids of the message and of the request in the CamelHwCloudSmnMesssageId 
and CamelHwCloudSmnRequestId exchange properties" }
+  },
   "properties": {
     "smnService": { "index": 0, "kind": "path", "displayName": "Service name", 
"group": "producer", "label": "producer", "required": true, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Name of SMN service to 
invoke" },
     "accessKey": { "index": 1, "kind": "parameter", "displayName": "API access 
key (AK)", "group": "producer", "label": "", "required": true, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": true, "security": 
"secret", "description": "Access key for the cloud user" },
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/openstack-cinder.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/openstack-cinder.json
index d2cafdeab7fe..73d6bf76d429 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/openstack-cinder.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/openstack-cinder.json
@@ -40,6 +40,10 @@
     "CamelOpenstackName": { "index": 9, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The name.", "constantName": 
"org.apache.camel.component.openstack.common.OpenstackConstants#NAME" },
     "CamelOpenstackDescription": { "index": 10, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The description.", "constantName": 
"org.apache.camel.component.openstack.common.OpenstackConstants#DESCRIPTION" }
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "description": "Read by create and 
update only: a Volume or VolumeSnapshot of openstack4j, or else the fields from 
headers such as CamelOpenstackName. The other operations take the id from a 
header" },
+    "producerOut": { "carriers": [ "pojo", "list", "null", "unchanged" ], 
"byOption": [ { "option": "operation", "value": "create", "carriers": [ "pojo" 
] }, { "option": "operation", "value": "get", "carriers": [ "pojo", "null" ] }, 
{ "option": "operation", "value": "getAll", "carriers": [ "list" ] }, { 
"option": "operation", "value": "getAllTypes", "carriers": [ "list" ] }, { 
"option": "operation", "value": "update", "carriers": [ "unchanged" ] }, { 
"option": "operation", "value": "dele [...]
+  },
   "properties": {
     "host": { "index": 0, "kind": "path", "displayName": "Host", "group": 
"producer", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "OpenStack host url" },
     "apiVersion": { "index": 1, "kind": "parameter", "displayName": "Api 
Version", "group": "producer", "label": "", "required": false, "type": "enum", 
"javaType": "java.lang.String", "enum": [ "V2", "V3" ], "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": "V3", "description": 
"OpenStack API version" },
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/openstack-glance.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/openstack-glance.json
index 21882d5994c7..e3ec1c39a4d0 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/openstack-glance.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/openstack-glance.json
@@ -41,6 +41,10 @@
     "CamelOpenstackName": { "index": 10, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The name.", "constantName": 
"org.apache.camel.component.openstack.common.OpenstackConstants#NAME" },
     "CamelOpenstackProperties": { "index": 11, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "Map<String, String>", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The image properties.", 
"constantName": 
"org.apache.camel.component.openstack.common.OpenstackConstants#PROPERTIES" }
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": 
"operation", "value": "create", "carriers": [ "stream", "file", "pojo" ] }, { 
"option": "operation", "value": "upload", "carriers": [ "stream", "file", 
"pojo" ] } ], "description": "For create and upload the image data: an 
InputStream, a File, a URL or a Payload of openstack4j; text, bytes or the file 
of the file consumer fail: convert it to a File or an InputStream first. 
reserve and update take an Image of openstack4j [...]
+    "producerOut": { "carriers": [ "pojo", "list", "null", "unchanged" ], 
"byOption": [ { "option": "operation", "value": "reserve", "carriers": [ "pojo" 
] }, { "option": "operation", "value": "create", "carriers": [ "pojo" ] }, { 
"option": "operation", "value": "upload", "carriers": [ "pojo" ] }, { "option": 
"operation", "value": "update", "carriers": [ "pojo" ] }, { "option": 
"operation", "value": "get", "carriers": [ "pojo", "null" ] }, { "option": 
"operation", "value": "getAll", "car [...]
+  },
   "properties": {
     "host": { "index": 0, "kind": "path", "displayName": "Host", "group": 
"producer", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "OpenStack host url" },
     "apiVersion": { "index": 1, "kind": "parameter", "displayName": "Api 
Version", "group": "producer", "label": "", "required": false, "type": "enum", 
"javaType": "java.lang.String", "enum": [ "V2", "V3" ], "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": "V3", "description": 
"OpenStack API version" },
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/openstack-keystone.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/openstack-keystone.json
index 56ebed2fbd1f..593ce641b978 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/openstack-keystone.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/openstack-keystone.json
@@ -39,6 +39,10 @@
     "CamelOpenstackId": { "index": 8, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The ID.", "constantName": 
"org.apache.camel.component.openstack.common.OpenstackConstants#ID" },
     "CamelOpenstackName": { "index": 9, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The name.", "constantName": 
"org.apache.camel.component.openstack.common.OpenstackConstants#NAME" }
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "description": "Read by create and 
update only: a Region, Domain, Project, User or Group of openstack4j, or else 
the fields from headers such as CamelOpenstackName. The other operations take 
the ids from headers" },
+    "producerOut": { "carriers": [ "pojo", "list", "value", "null", 
"unchanged" ], "byOption": [ { "option": "operation", "value": "create", 
"carriers": [ "pojo" ] }, { "option": "operation", "value": "get", "carriers": 
[ "pojo", "null" ] }, { "option": "operation", "value": "getAll", "carriers": [ 
"list" ] }, { "option": "operation", "value": "update", "carriers": [ "pojo" ] 
}, { "option": "operation", "value": "delete", "carriers": [ "unchanged" ] }, { 
"option": "operation", "value": " [...]
+  },
   "properties": {
     "host": { "index": 0, "kind": "path", "displayName": "Host", "group": 
"producer", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "OpenStack host url" },
     "config": { "index": 1, "kind": "parameter", "displayName": "Config", 
"group": "producer", "label": "", "required": false, "type": "object", 
"javaType": "org.openstack4j.core.transport.Config", "deprecated": false, 
"autowired": false, "secret": false, "description": "OpenStack configuration" },
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/openstack-neutron.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/openstack-neutron.json
index e5c629100cd1..0a150984a242 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/openstack-neutron.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/openstack-neutron.json
@@ -51,6 +51,10 @@
     "CamelOpenstackId": { "index": 20, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The ID.", "constantName": 
"org.apache.camel.component.openstack.common.OpenstackConstants#ID" },
     "CamelOpenstackName": { "index": 21, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The name.", "constantName": 
"org.apache.camel.component.openstack.common.OpenstackConstants#NAME" }
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "description": "Read by create and 
update only: a Network, Subnet, Port or Router of openstack4j, or else the 
fields from headers such as CamelOpenstackName. The other operations take the 
ids from headers" },
+    "producerOut": { "carriers": [ "pojo", "list", "null", "unchanged" ], 
"byOption": [ { "option": "operation", "value": "create", "carriers": [ "pojo" 
] }, { "option": "operation", "value": "get", "carriers": [ "pojo", "null" ] }, 
{ "option": "operation", "value": "getAll", "carriers": [ "list" ] }, { 
"option": "operation", "value": "update", "carriers": [ "pojo" ] }, { "option": 
"operation", "value": "delete", "carriers": [ "unchanged" ] }, { "option": 
"operation", "value": "attachInt [...]
+  },
   "properties": {
     "host": { "index": 0, "kind": "path", "displayName": "Host", "group": 
"producer", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "OpenStack host url" },
     "apiVersion": { "index": 1, "kind": "parameter", "displayName": "Api 
Version", "group": "producer", "label": "", "required": false, "type": "enum", 
"javaType": "java.lang.String", "enum": [ "V2", "V3" ], "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": "V3", "description": 
"OpenStack API version" },
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/openstack-nova.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/openstack-nova.json
index aea1a77b347c..d8fcd3b87dcb 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/openstack-nova.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/openstack-nova.json
@@ -43,6 +43,10 @@
     "CamelOpenstackId": { "index": 12, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The ID.", "constantName": 
"org.apache.camel.component.openstack.common.OpenstackConstants#ID" },
     "CamelOpenstackName": { "index": 13, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The name.", "constantName": 
"org.apache.camel.component.openstack.common.OpenstackConstants#NAME" }
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "description": "Read by create 
only: a Flavor or ServerCreate of openstack4j, or else the fields from headers 
such as CamelOpenstackName; for keypairs the public key as text, or no body to 
have the key pair generated. The other operations take the id or name from 
headers" },
+    "producerOut": { "carriers": [ "pojo", "list", "text", "null", "unchanged" 
], "byOption": [ { "option": "operation", "value": "create", "carriers": [ 
"pojo" ] }, { "option": "operation", "value": "get", "carriers": [ "pojo", 
"null" ] }, { "option": "operation", "value": "getAll", "carriers": [ "list" ] 
}, { "option": "operation", "value": "createSnapshot", "carriers": [ "text" ], 
"javaType": "java.lang.String" }, { "option": "operation", "value": "delete", 
"carriers": [ "unchanged" ] [...]
+  },
   "properties": {
     "host": { "index": 0, "kind": "path", "displayName": "Host", "group": 
"producer", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "OpenStack host url" },
     "apiVersion": { "index": 1, "kind": "parameter", "displayName": "Api 
Version", "group": "producer", "label": "", "required": false, "type": "enum", 
"javaType": "java.lang.String", "enum": [ "V2", "V3" ], "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": "V3", "description": 
"OpenStack API version" },
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/openstack-swift.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/openstack-swift.json
index 4563b934a010..f830823a94c3 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/openstack-swift.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/openstack-swift.json
@@ -43,6 +43,10 @@
     "CamelOpenstackId": { "index": 12, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The ID.", "constantName": 
"org.apache.camel.component.openstack.common.OpenstackConstants#ID" },
     "CamelOpenstackName": { "index": 13, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The name.", "constantName": 
"org.apache.camel.component.openstack.common.OpenstackConstants#NAME" }
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "description": "For create of an 
object the content: an InputStream, a File, a URL or a Payload of openstack4j; 
text, bytes or the file of the file consumer fail: convert it to a File or an 
InputStream first. createUpdateMetadata and deleteMetadata take the metadata as 
a Map. The containers take a CreateUpdateContainerOptions or 
ContainerListOptions of openstack4j, or else headers" },
+    "producerOut": { "carriers": [ "text", "pojo", "list", "map", "null", 
"unchanged" ], "byOption": [ { "option": "operation", "value": "getAll", 
"carriers": [ "list" ] }, { "option": "operation", "value": "getMetadata", 
"carriers": [ "map" ] }, { "option": "operation", "value": "delete", 
"carriers": [ "unchanged" ] }, { "option": "operation", "value": 
"createUpdateMetadata", "carriers": [ "unchanged" ] }, { "option": "operation", 
"value": "deleteMetadata", "carriers": [ "unchanged" ] } [...]
+  },
   "properties": {
     "host": { "index": 0, "kind": "path", "displayName": "Host", "group": 
"producer", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "OpenStack host url" },
     "apiVersion": { "index": 1, "kind": "parameter", "displayName": "Api 
Version", "group": "producer", "label": "", "required": false, "type": "enum", 
"javaType": "java.lang.String", "enum": [ "V2", "V3" ], "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": "V3", "description": 
"OpenStack API version" },
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/openstack-swift-component.adoc
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/openstack-swift-component.adoc
index 23f05bbb7d4d..9ec139f27562 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/openstack-swift-component.adoc
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/openstack-swift-component.adoc
@@ -103,6 +103,7 @@ or 
`org.openstack4j.model.storage.object.options.ContainerListOptions` for listi
 === Example
 
 The following route stores each file of the `outbox` folder as an object of 
the `reports` container.
+The body must be an `InputStream`, a `File`, a `URL` or a `Payload` of 
openstack4j, so the route converts the file of the file consumer to a 
`java.io.File` first.
 The endpoint is the address of the identity service (Keystone), and the 
credentials are property placeholders:
 
 [source,yaml]
@@ -121,6 +122,8 @@ The endpoint is the address of the identity service 
(Keystone), and the credenti
             expression:
               simple:
                 expression: "${header.CamelFileName}"
+        - convertBodyTo:
+            type: java.io.File
         - to:
             uri: openstack-swift:http://controller:5000/v3
             parameters:
diff --git 
a/components/camel-huawei/camel-huaweicloud-dms/src/generated/resources/META-INF/org/apache/camel/component/huaweicloud/dms/hwcloud-dms.json
 
b/components/camel-huawei/camel-huaweicloud-dms/src/generated/resources/META-INF/org/apache/camel/component/huaweicloud/dms/hwcloud-dms.json
index a46f4bfa101f..a3e5a7107b55 100644
--- 
a/components/camel-huawei/camel-huaweicloud-dms/src/generated/resources/META-INF/org/apache/camel/component/huaweicloud/dms/hwcloud-dms.json
+++ 
b/components/camel-huawei/camel-huaweicloud-dms/src/generated/resources/META-INF/org/apache/camel/component/huaweicloud/dms/hwcloud-dms.json
@@ -27,6 +27,10 @@
     "lazyStartProducer": { "index": 0, "kind": "property", "displayName": 
"Lazy Start Producer", "group": "producer", "label": "producer", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, "description": 
"Whether the producer should be started lazy (on the first message). By 
starting lazy you can use this to allow CamelContext and routes to startup in 
situations where a producer may otherwise fail [...]
     "autowiredEnabled": { "index": 1, "kind": "property", "displayName": 
"Autowired Enabled", "group": "advanced", "label": "advanced", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": true, "description": 
"Whether autowiring is enabled. This is used for automatic autowiring options 
(the option must be marked as autowired) by looking up in the registry to find 
if there is a single instance of matching t [...]
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": 
"operation", "value": "createInstance", "carriers": [ "text", "pojo" ] }, { 
"option": "operation", "value": "updateInstance", "carriers": [ "text", "pojo" 
] } ], "description": "Not used by deleteInstance, listInstances and 
queryInstance, which take the instance id and the engine from the options or 
exchange properties such as CamelHwCloudDmsInstanceId. createInstance takes a 
CreateInstanceRequestBody or its JSON as tex [...]
+    "producerOut": { "carriers": [ "unchanged" ], "byOption": [ { "option": 
"operation", "value": "createInstance", "carriers": [ "text" ], "javaType": 
"java.lang.String" }, { "option": "operation", "value": "listInstances", 
"carriers": [ "text" ], "javaType": "java.lang.String" }, { "option": 
"operation", "value": "queryInstance", "carriers": [ "text" ], "javaType": 
"java.lang.String" } ], "description": "The JSON of the response as text: the 
id of the new instance for createInstance, t [...]
+  },
   "properties": {
     "operation": { "index": 0, "kind": "path", "displayName": "Operation", 
"group": "producer", "label": "producer", "required": true, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Operation to be performed" 
},
     "accessKey": { "index": 1, "kind": "parameter", "displayName": "API access 
key (AK)", "group": "producer", "label": "", "required": true, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": true, "security": 
"secret", "description": "Access key for the cloud user" },
diff --git 
a/components/camel-huawei/camel-huaweicloud-dms/src/main/java/org/apache/camel/component/huaweicloud/dms/DMSEndpoint.java
 
b/components/camel-huawei/camel-huaweicloud-dms/src/main/java/org/apache/camel/component/huaweicloud/dms/DMSEndpoint.java
index 58a60ccfc76d..97694fc9ad46 100644
--- 
a/components/camel-huawei/camel-huaweicloud-dms/src/main/java/org/apache/camel/component/huaweicloud/dms/DMSEndpoint.java
+++ 
b/components/camel-huawei/camel-huaweicloud-dms/src/main/java/org/apache/camel/component/huaweicloud/dms/DMSEndpoint.java
@@ -27,6 +27,9 @@ import org.apache.camel.Processor;
 import org.apache.camel.Producer;
 import org.apache.camel.component.huaweicloud.common.models.ServiceKeys;
 import org.apache.camel.component.huaweicloud.dms.models.DmsRegion;
+import org.apache.camel.spi.BodyType;
+import org.apache.camel.spi.BodyType.Carrier;
+import org.apache.camel.spi.BodyTypes;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
@@ -40,6 +43,35 @@ import org.apache.camel.util.ObjectHelper;
 @UriEndpoint(firstVersion = "3.12.0", scheme = "hwcloud-dms", title = "Huawei 
Distributed Message Service (DMS)",
              syntax = "hwcloud-dms:operation",
              category = { Category.CLOUD }, producerOnly = true)
+@BodyTypes(producerIn = @BodyType(value = Carrier.ANY,
+                                  byOption = {
+                                          @BodyType.When(option = "operation", 
value = "createInstance",
+                                                         carriers = { 
Carrier.TEXT, Carrier.POJO }),
+                                          @BodyType.When(option = "operation", 
value = "updateInstance",
+                                                         carriers = { 
Carrier.TEXT, Carrier.POJO }) },
+                                  description = "Not used by deleteInstance, 
listInstances and queryInstance, which take the"
+                                                + " instance id and the engine 
from the options or exchange properties such as"
+                                                + " CamelHwCloudDmsInstanceId. 
createInstance takes a CreateInstanceRequestBody or"
+                                                + " its JSON as text, and with 
another body, JSON as bytes or a stream too, creates"
+                                                + " the instance from the 
options. updateInstance needs an UpdateInstanceRequestBody"
+                                                + " or its JSON as text: 
another body fails"),
+           producerOut = @BodyType(value = Carrier.UNCHANGED,
+                                   byOption = {
+                                           @BodyType.When(option = 
"operation", value = "createInstance",
+                                                          carriers = 
Carrier.TEXT,
+                                                          javaType = 
"java.lang.String"),
+                                           @BodyType.When(option = 
"operation", value = "listInstances",
+                                                          carriers = 
Carrier.TEXT,
+                                                          javaType = 
"java.lang.String"),
+                                           @BodyType.When(option = 
"operation", value = "queryInstance",
+                                                          carriers = 
Carrier.TEXT,
+                                                          javaType = 
"java.lang.String") },
+                                   description = "The JSON of the response as 
text: the id of the new instance for"
+                                                 + " createInstance, the array 
of the instances for listInstances and the instance"
+                                                 + " for queryInstance. 
Unchanged after deleteInstance and updateInstance, which set"
+                                                 + " the 
CamelHwCloudDmsInstanceDeleted or CamelHwCloudDmsInstanceUpdated exchange"
+                                                 + " property to true. The 
CamelHwCloudDmsOperation exchange property overrides the"
+                                                 + " operation"))
 public class DMSEndpoint extends DefaultEndpoint {
 
     @UriPath(description = "Operation to be performed", displayName = 
"Operation", label = "producer")
diff --git 
a/components/camel-huawei/camel-huaweicloud-frs/src/generated/resources/META-INF/org/apache/camel/component/huaweicloud/frs/hwcloud-frs.json
 
b/components/camel-huawei/camel-huaweicloud-frs/src/generated/resources/META-INF/org/apache/camel/component/huaweicloud/frs/hwcloud-frs.json
index 213725c4de6c..e5cf4dfaa5d3 100644
--- 
a/components/camel-huawei/camel-huaweicloud-frs/src/generated/resources/META-INF/org/apache/camel/component/huaweicloud/frs/hwcloud-frs.json
+++ 
b/components/camel-huawei/camel-huaweicloud-frs/src/generated/resources/META-INF/org/apache/camel/component/huaweicloud/frs/hwcloud-frs.json
@@ -27,6 +27,10 @@
     "lazyStartProducer": { "index": 0, "kind": "property", "displayName": 
"Lazy Start Producer", "group": "producer", "label": "producer", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, "description": 
"Whether the producer should be started lazy (on the first message). By 
starting lazy you can use this to allow CamelContext and routes to startup in 
situations where a producer may otherwise fail [...]
     "autowiredEnabled": { "index": 1, "kind": "property", "displayName": 
"Autowired Enabled", "group": "advanced", "label": "advanced", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": true, "description": 
"Whether autowiring is enabled. This is used for automatic autowiring options 
(the option must be marked as autowired) by looking up in the registry to find 
if there is a single instance of matching t [...]
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "description": "Not used, not even 
for the image: the image comes from the options or the exchange properties as 
base64 (CamelHwCloudFrsImageBase64), a URL (CamelHwCloudFrsImageUrl) or a local 
file path (CamelHwCloudFrsImageFilePath), the second image of faceVerification 
from the CamelHwCloudFrsAnotherImage properties, and the video of 
faceLiveDetection from the CamelHwCloudFrsVideo properties" },
+    "producerOut": { "carriers": [ "pojo" ], "description": "The response of 
the Huawei Cloud SDK for the operation and the source of the image, such as the 
DetectFaceByBase64Response of faceDetection with base64, which holds the faces 
found" }
+  },
   "properties": {
     "operation": { "index": 0, "kind": "path", "displayName": "Operation 
name", "group": "producer", "label": "producer", "required": true, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": 
"Name of Face Recognition operation to perform, including faceDetection, 
faceVerification and faceLiveDetection" },
     "accessKey": { "index": 1, "kind": "parameter", "displayName": "Account 
access key (AK)", "group": "producer", "label": "", "required": true, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": true, "security": 
"secret", "description": "Access key for the cloud user" },
diff --git 
a/components/camel-huawei/camel-huaweicloud-frs/src/main/java/org/apache/camel/component/huaweicloud/frs/FaceRecognitionEndpoint.java
 
b/components/camel-huawei/camel-huaweicloud-frs/src/main/java/org/apache/camel/component/huaweicloud/frs/FaceRecognitionEndpoint.java
index 2f4ce8f071ec..550182c22247 100644
--- 
a/components/camel-huawei/camel-huaweicloud-frs/src/main/java/org/apache/camel/component/huaweicloud/frs/FaceRecognitionEndpoint.java
+++ 
b/components/camel-huawei/camel-huaweicloud-frs/src/main/java/org/apache/camel/component/huaweicloud/frs/FaceRecognitionEndpoint.java
@@ -22,6 +22,9 @@ import org.apache.camel.Consumer;
 import org.apache.camel.Processor;
 import org.apache.camel.Producer;
 import org.apache.camel.component.huaweicloud.common.models.ServiceKeys;
+import org.apache.camel.spi.BodyType;
+import org.apache.camel.spi.BodyType.Carrier;
+import org.apache.camel.spi.BodyTypes;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
@@ -35,6 +38,17 @@ import org.apache.camel.support.DefaultEndpoint;
 @UriEndpoint(firstVersion = "3.15.0", scheme = "hwcloud-frs", title = "Huawei 
Cloud Face Recognition Service (FRS)",
              syntax = "hwcloud-frs:operation",
              category = { Category.CLOUD, Category.MESSAGING }, producerOnly = 
true)
+@BodyTypes(producerIn = @BodyType(value = Carrier.ANY,
+                                  description = "Not used, not even for the 
image: the image comes from the options or the"
+                                                + " exchange properties as 
base64 (CamelHwCloudFrsImageBase64), a URL"
+                                                + " (CamelHwCloudFrsImageUrl) 
or a local file path (CamelHwCloudFrsImageFilePath),"
+                                                + " the second image of 
faceVerification from the CamelHwCloudFrsAnotherImage"
+                                                + " properties, and the video 
of faceLiveDetection from the CamelHwCloudFrsVideo"
+                                                + " properties"),
+           producerOut = @BodyType(value = Carrier.POJO,
+                                   description = "The response of the Huawei 
Cloud SDK for the operation and the source of the"
+                                                 + " image, such as the 
DetectFaceByBase64Response of faceDetection with base64,"
+                                                 + " which holds the faces 
found"))
 public class FaceRecognitionEndpoint extends DefaultEndpoint {
     @UriPath(
              description = "Name of Face Recognition operation to perform, 
including faceDetection, faceVerification and faceLiveDetection",
diff --git 
a/components/camel-huawei/camel-huaweicloud-functiongraph/src/generated/resources/META-INF/org/apache/camel/hwcloud-functiongraph.json
 
b/components/camel-huawei/camel-huaweicloud-functiongraph/src/generated/resources/META-INF/org/apache/camel/hwcloud-functiongraph.json
index ca11b59ccc62..d4329e6c5174 100644
--- 
a/components/camel-huawei/camel-huaweicloud-functiongraph/src/generated/resources/META-INF/org/apache/camel/hwcloud-functiongraph.json
+++ 
b/components/camel-huawei/camel-huaweicloud-functiongraph/src/generated/resources/META-INF/org/apache/camel/hwcloud-functiongraph.json
@@ -27,6 +27,10 @@
     "lazyStartProducer": { "index": 0, "kind": "property", "displayName": 
"Lazy Start Producer", "group": "producer", "label": "producer", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, "description": 
"Whether the producer should be started lazy (on the first message). By 
starting lazy you can use this to allow CamelContext and routes to startup in 
situations where a producer may otherwise fail [...]
     "autowiredEnabled": { "index": 1, "kind": "property", "displayName": 
"Autowired Enabled", "group": "advanced", "label": "advanced", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": true, "description": 
"Whether autowiring is enabled. This is used for automatic autowiring options 
(the option must be marked as autowired) by looking up in the registry to find 
if there is a single instance of matching t [...]
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "map", "text" ], "description": "The event 
of the function, as a Map or a JSON object as text. Bytes, a stream, a file, a 
JSON array, a POJO or no body fail: convert the body to a String or a Map 
first" },
+    "producerOut": { "carriers": [ "text", "null" ], "description": "The body 
field of the result of the function as text: a string as it is, an object or an 
array as JSON. No body when the result has no body field. With the 
CamelHwCloudFgXCffLogType exchange property set, the log of the call is in the 
CamelHwCloudFgXCffLogs exchange property" }
+  },
   "properties": {
     "operation": { "index": 0, "kind": "path", "displayName": "Operation", 
"group": "producer", "label": "producer", "required": true, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Operation to be performed" 
},
     "endpoint": { "index": 1, "kind": "parameter", "displayName": "Service 
endpoint", "group": "producer", "label": "", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": 
"FunctionGraph url. Carries higher precedence than region parameter based 
client initialization" },
diff --git 
a/components/camel-huawei/camel-huaweicloud-functiongraph/src/main/java/org/apache/camel/FunctionGraphEndpoint.java
 
b/components/camel-huawei/camel-huaweicloud-functiongraph/src/main/java/org/apache/camel/FunctionGraphEndpoint.java
index 0992b4c9a41f..2df0b0625ef1 100644
--- 
a/components/camel-huawei/camel-huaweicloud-functiongraph/src/main/java/org/apache/camel/FunctionGraphEndpoint.java
+++ 
b/components/camel-huawei/camel-huaweicloud-functiongraph/src/main/java/org/apache/camel/FunctionGraphEndpoint.java
@@ -22,6 +22,9 @@ import 
com.huaweicloud.sdk.functiongraph.v2.FunctionGraphClient;
 import com.huaweicloud.sdk.functiongraph.v2.region.FunctionGraphRegion;
 import org.apache.camel.component.huaweicloud.common.models.ServiceKeys;
 import org.apache.camel.constants.FunctionGraphConstants;
+import org.apache.camel.spi.BodyType;
+import org.apache.camel.spi.BodyType.Carrier;
+import org.apache.camel.spi.BodyTypes;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
@@ -35,6 +38,15 @@ import org.apache.camel.util.ObjectHelper;
 @UriEndpoint(firstVersion = "3.11.0", scheme = "hwcloud-functiongraph", title 
= "Huawei FunctionGraph",
              syntax = "hwcloud-functiongraph:operation",
              category = { Category.CLOUD, Category.SERVERLESS }, producerOnly 
= true)
+@BodyTypes(producerIn = @BodyType(value = { Carrier.MAP, Carrier.TEXT },
+                                  description = "The event of the function, as 
a Map or a JSON object as text. Bytes, a stream,"
+                                                + " a file, a JSON array, a 
POJO or no body fail: convert the body to a String or"
+                                                + " a Map first"),
+           producerOut = @BodyType(value = { Carrier.TEXT, Carrier.NULL },
+                                   description = "The body field of the result 
of the function as text: a string as it is, an"
+                                                 + " object or an array as 
JSON. No body when the result has no body field. With"
+                                                 + " the 
CamelHwCloudFgXCffLogType exchange property set, the log of the call is in"
+                                                 + " the 
CamelHwCloudFgXCffLogs exchange property"))
 public class FunctionGraphEndpoint extends DefaultEndpoint {
 
     @UriPath(description = "Operation to be performed", displayName = 
"Operation", label = "producer")
diff --git 
a/components/camel-huawei/camel-huaweicloud-iam/src/generated/resources/META-INF/org/apache/camel/component/huaweicloud/iam/hwcloud-iam.json
 
b/components/camel-huawei/camel-huaweicloud-iam/src/generated/resources/META-INF/org/apache/camel/component/huaweicloud/iam/hwcloud-iam.json
index 87ee67035a88..b8f04f244e6f 100644
--- 
a/components/camel-huawei/camel-huaweicloud-iam/src/generated/resources/META-INF/org/apache/camel/component/huaweicloud/iam/hwcloud-iam.json
+++ 
b/components/camel-huawei/camel-huaweicloud-iam/src/generated/resources/META-INF/org/apache/camel/component/huaweicloud/iam/hwcloud-iam.json
@@ -27,6 +27,10 @@
     "lazyStartProducer": { "index": 0, "kind": "property", "displayName": 
"Lazy Start Producer", "group": "producer", "label": "producer", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, "description": 
"Whether the producer should be started lazy (on the first message). By 
starting lazy you can use this to allow CamelContext and routes to startup in 
situations where a producer may otherwise fail [...]
     "autowiredEnabled": { "index": 1, "kind": "property", "displayName": 
"Autowired Enabled", "group": "advanced", "label": "advanced", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": true, "description": 
"Whether autowiring is enabled. This is used for automatic autowiring options 
(the option must be marked as autowired) by looking up in the registry to find 
if there is a single instance of matching t [...]
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": 
"operation", "value": "updateUser", "carriers": [ "text", "pojo" ] }, { 
"option": "operation", "value": "updateGroup", "carriers": [ "text", "pojo" ] } 
], "description": "Not used by the list and get operations, which take the ids 
from the options or the CamelHwCloudIamUserId and CamelHwCloudIamGroupId 
exchange properties. updateUser needs an UpdateUserOption of the Huawei Cloud 
SDK or its JSON as text, and updateGroup  [...]
+    "producerOut": { "carriers": [ "text" ], "javaType": "java.lang.String", 
"format": "json", "description": "The JSON of the result as text: the array of 
the users or the groups for listUsers, listGroups and getGroupUsers, the user 
or the group for getUser, updateUser and updateGroup. The keys are the field 
names of the Huawei Cloud SDK, such as domainId" }
+  },
   "properties": {
     "operation": { "index": 0, "kind": "path", "displayName": "Operation", 
"group": "producer", "label": "producer", "required": true, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Operation to be performed" 
},
     "accessKey": { "index": 1, "kind": "parameter", "displayName": "API access 
key (AK)", "group": "producer", "label": "", "required": true, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": true, "security": 
"secret", "description": "Access key for the cloud user" },
diff --git 
a/components/camel-huawei/camel-huaweicloud-iam/src/main/java/org/apache/camel/component/huaweicloud/iam/IAMEndpoint.java
 
b/components/camel-huawei/camel-huaweicloud-iam/src/main/java/org/apache/camel/component/huaweicloud/iam/IAMEndpoint.java
index 2c1256e52515..40ce05b7fcd1 100644
--- 
a/components/camel-huawei/camel-huaweicloud-iam/src/main/java/org/apache/camel/component/huaweicloud/iam/IAMEndpoint.java
+++ 
b/components/camel-huawei/camel-huaweicloud-iam/src/main/java/org/apache/camel/component/huaweicloud/iam/IAMEndpoint.java
@@ -25,6 +25,9 @@ import org.apache.camel.Consumer;
 import org.apache.camel.Processor;
 import org.apache.camel.Producer;
 import org.apache.camel.component.huaweicloud.common.models.ServiceKeys;
+import org.apache.camel.spi.BodyType;
+import org.apache.camel.spi.BodyType.Carrier;
+import org.apache.camel.spi.BodyTypes;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
@@ -38,6 +41,22 @@ import org.apache.camel.util.ObjectHelper;
 @UriEndpoint(firstVersion = "3.11.0", scheme = "hwcloud-iam", title = "Huawei 
Identity and Access Management (IAM)",
              syntax = "hwcloud-iam:operation",
              category = { Category.CLOUD }, producerOnly = true)
+@BodyTypes(producerIn = @BodyType(value = Carrier.ANY,
+                                  byOption = {
+                                          @BodyType.When(option = "operation", 
value = "updateUser",
+                                                         carriers = { 
Carrier.TEXT, Carrier.POJO }),
+                                          @BodyType.When(option = "operation", 
value = "updateGroup",
+                                                         carriers = { 
Carrier.TEXT, Carrier.POJO }) },
+                                  description = "Not used by the list and get 
operations, which take the ids from the options"
+                                                + " or the 
CamelHwCloudIamUserId and CamelHwCloudIamGroupId exchange properties."
+                                                + " updateUser needs an 
UpdateUserOption of the Huawei Cloud SDK or its JSON as"
+                                                + " text, and updateGroup a 
KeystoneUpdateGroupOption or its JSON: another body,"
+                                                + " JSON as bytes or a stream 
too, fails"),
+           producerOut = @BodyType(value = Carrier.TEXT, javaType = 
"java.lang.String", format = "json",
+                                   description = "The JSON of the result as 
text: the array of the users or the groups for"
+                                                 + " listUsers, listGroups and 
getGroupUsers, the user or the group for getUser,"
+                                                 + " updateUser and 
updateGroup. The keys are the field names of the Huawei Cloud"
+                                                 + " SDK, such as domainId"))
 public class IAMEndpoint extends DefaultEndpoint {
 
     @UriPath(description = "Operation to be performed", displayName = 
"Operation", label = "producer")
diff --git 
a/components/camel-huawei/camel-huaweicloud-imagerecognition/src/generated/resources/META-INF/org/apache/camel/component/huaweicloud/image/hwcloud-imagerecognition.json
 
b/components/camel-huawei/camel-huaweicloud-imagerecognition/src/generated/resources/META-INF/org/apache/camel/component/huaweicloud/image/hwcloud-imagerecognition.json
index 62d32ec88fc2..0dc79160f15f 100644
--- 
a/components/camel-huawei/camel-huaweicloud-imagerecognition/src/generated/resources/META-INF/org/apache/camel/component/huaweicloud/image/hwcloud-imagerecognition.json
+++ 
b/components/camel-huawei/camel-huaweicloud-imagerecognition/src/generated/resources/META-INF/org/apache/camel/component/huaweicloud/image/hwcloud-imagerecognition.json
@@ -27,6 +27,10 @@
     "lazyStartProducer": { "index": 0, "kind": "property", "displayName": 
"Lazy Start Producer", "group": "producer", "label": "producer", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, "description": 
"Whether the producer should be started lazy (on the first message). By 
starting lazy you can use this to allow CamelContext and routes to startup in 
situations where a producer may otherwise fail [...]
     "autowiredEnabled": { "index": 1, "kind": "property", "displayName": 
"Autowired Enabled", "group": "advanced", "label": "advanced", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": true, "description": 
"Whether autowiring is enabled. This is used for automatic autowiring options 
(the option must be marked as autowired) by looking up in the registry to find 
if there is a single instance of matching t [...]
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "description": "Not used, not even 
for the image: the image comes from the imageContent option or the 
CamelHwCloudImageContent exchange property as base64, or from the imageUrl 
option or the CamelHwCloudImageUrl exchange property as a URL" },
+    "producerOut": { "carriers": [ "list", "pojo" ], "byOption": [ { "option": 
"operation", "value": "celebrityRecognition", "carriers": [ "list" ], 
"javaType": 
"java.util.List<com.huaweicloud.sdk.image.v2.model.CelebrityRecognitionResultBody>"
 }, { "option": "operation", "value": "tagRecognition", "carriers": [ "pojo" ], 
"javaType": "com.huaweicloud.sdk.image.v2.model.ImageTaggingResponseResult" } 
], "description": "The result of the Huawei Cloud SDK: for celebrityRecognition 
a List wit [...]
+  },
   "properties": {
     "operation": { "index": 0, "kind": "path", "displayName": "Operation 
name", "group": "producer", "label": "producer", "required": true, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": 
"Name of Image Recognition operation to perform, including celebrityRecognition 
and tagRecognition" },
     "accessKey": { "index": 1, "kind": "parameter", "displayName": "Account 
access key (AK)", "group": "producer", "label": "", "required": true, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": true, "security": 
"secret", "description": "Access key for the cloud user" },
diff --git 
a/components/camel-huawei/camel-huaweicloud-imagerecognition/src/main/java/org/apache/camel/component/huaweicloud/image/ImageRecognitionEndpoint.java
 
b/components/camel-huawei/camel-huaweicloud-imagerecognition/src/main/java/org/apache/camel/component/huaweicloud/image/ImageRecognitionEndpoint.java
index 5c51c500a442..1933b43aa1ce 100644
--- 
a/components/camel-huawei/camel-huaweicloud-imagerecognition/src/main/java/org/apache/camel/component/huaweicloud/image/ImageRecognitionEndpoint.java
+++ 
b/components/camel-huawei/camel-huaweicloud-imagerecognition/src/main/java/org/apache/camel/component/huaweicloud/image/ImageRecognitionEndpoint.java
@@ -23,6 +23,9 @@ import org.apache.camel.Processor;
 import org.apache.camel.Producer;
 import org.apache.camel.component.huaweicloud.common.models.ServiceKeys;
 import 
org.apache.camel.component.huaweicloud.image.constants.ImageRecognitionConstants;
+import org.apache.camel.spi.BodyType;
+import org.apache.camel.spi.BodyType.Carrier;
+import org.apache.camel.spi.BodyTypes;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
@@ -35,6 +38,21 @@ import org.apache.camel.support.DefaultEndpoint;
 @UriEndpoint(firstVersion = "3.12.0", scheme = "hwcloud-imagerecognition", 
title = "Huawei Cloud Image Recognition",
              syntax = "hwcloud-imagerecognition:operation",
              category = { Category.CLOUD, Category.MESSAGING }, producerOnly = 
true)
+@BodyTypes(producerIn = @BodyType(value = Carrier.ANY,
+                                  description = "Not used, not even for the 
image: the image comes from the imageContent option"
+                                                + " or the 
CamelHwCloudImageContent exchange property as base64, or from the"
+                                                + " imageUrl option or the 
CamelHwCloudImageUrl exchange property as a URL"),
+           producerOut = @BodyType(value = { Carrier.LIST, Carrier.POJO },
+                                   byOption = {
+                                           @BodyType.When(option = 
"operation", value = "celebrityRecognition",
+                                                          carriers = 
Carrier.LIST,
+                                                          javaType = 
"java.util.List<com.huaweicloud.sdk.image.v2.model.CelebrityRecognitionResultBody>"),
+                                           @BodyType.When(option = 
"operation", value = "tagRecognition",
+                                                          carriers = 
Carrier.POJO,
+                                                          javaType = 
"com.huaweicloud.sdk.image.v2.model.ImageTaggingResponseResult") },
+                                   description = "The result of the Huawei 
Cloud SDK: for celebrityRecognition a List with a"
+                                                 + " 
CelebrityRecognitionResultBody per celebrity found, and for tagRecognition"
+                                                 + " an 
ImageTaggingResponseResult with the tags"))
 public class ImageRecognitionEndpoint extends DefaultEndpoint {
     @UriPath(
              description = "Name of Image Recognition operation to perform, 
including celebrityRecognition and tagRecognition",
diff --git 
a/components/camel-huawei/camel-huaweicloud-obs/src/generated/resources/META-INF/org/apache/camel/component/huaweicloud/obs/hwcloud-obs.json
 
b/components/camel-huawei/camel-huaweicloud-obs/src/generated/resources/META-INF/org/apache/camel/component/huaweicloud/obs/hwcloud-obs.json
index 07a27257ba6d..136e28769e21 100644
--- 
a/components/camel-huawei/camel-huaweicloud-obs/src/generated/resources/META-INF/org/apache/camel/component/huaweicloud/obs/hwcloud-obs.json
+++ 
b/components/camel-huawei/camel-huaweicloud-obs/src/generated/resources/META-INF/org/apache/camel/component/huaweicloud/obs/hwcloud-obs.json
@@ -41,6 +41,11 @@
     "Content-Type": { "index": 7, "kind": "header", "displayName": "", 
"group": "consumer", "label": "consumer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The type of content stored in the object", 
"constantName": 
"org.apache.camel.component.huaweicloud.obs.constants.OBSHeaders#CONTENT_TYPE" 
},
     "CamelFileName": { "index": 8, "kind": "header", "displayName": "", 
"group": "consumer", "label": "consumer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Name of the object with which the operation is 
to be performed", "constantName": 
"org.apache.camel.component.huaweicloud.obs.constants.OBSHeaders#FILE_NAME" }
   },
+  "bodyTypes": {
+    "consumerOut": { "carriers": [ "bytes" ], "javaType": "byte[]", 
"description": "The content of the object as a byte array, one message per 
object, with its bucket, key and metadata in headers such as 
CamelHwCloudObsObjectKey, and the key in CamelFileName too. Folders are 
consumed too, with an empty body, unless includeFolders=false" },
+    "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": 
"operation", "value": "putObject", "carriers": [ "text", "bytes", "stream", 
"file" ] }, { "option": "operation", "value": "createBucket", "carriers": [ 
"text", "pojo" ] }, { "option": "operation", "value": "listObjects", 
"carriers": [ "text", "pojo" ] } ], "description": "For putObject the content 
to upload: text, bytes, a stream or a file, such as the file of a file 
consumer, whose name is the object name when objectNa [...]
+    "producerOut": { "carriers": [ "unchanged" ], "byOption": [ { "option": 
"operation", "value": "putObject", "carriers": [ "text" ], "javaType": 
"java.lang.String" }, { "option": "operation", "value": "getObject", 
"carriers": [ "bytes" ], "javaType": "byte[]" }, { "option": "operation", 
"value": "listObjects", "carriers": [ "text" ], "javaType": "java.lang.String" 
}, { "option": "operation", "value": "listBuckets", "carriers": [ "text" ], 
"javaType": "java.lang.String" }, { "option": " [...]
+  },
   "properties": {
     "operation": { "index": 0, "kind": "path", "displayName": "Operation", 
"group": "producer", "label": "producer", "required": true, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Operation to be performed" 
},
     "bucketName": { "index": 1, "kind": "parameter", "displayName": "Bucket 
Name", "group": "common", "label": "", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "endpointIdentity": true, "description": 
"Name of bucket to perform operation on" },
diff --git 
a/components/camel-huawei/camel-huaweicloud-obs/src/main/java/org/apache/camel/component/huaweicloud/obs/OBSEndpoint.java
 
b/components/camel-huawei/camel-huaweicloud-obs/src/main/java/org/apache/camel/component/huaweicloud/obs/OBSEndpoint.java
index 72a32a897e34..a0e621264180 100644
--- 
a/components/camel-huawei/camel-huaweicloud-obs/src/main/java/org/apache/camel/component/huaweicloud/obs/OBSEndpoint.java
+++ 
b/components/camel-huawei/camel-huaweicloud-obs/src/main/java/org/apache/camel/component/huaweicloud/obs/OBSEndpoint.java
@@ -26,6 +26,9 @@ import org.apache.camel.Producer;
 import org.apache.camel.component.huaweicloud.common.models.ServiceKeys;
 import org.apache.camel.component.huaweicloud.obs.constants.OBSHeaders;
 import org.apache.camel.component.huaweicloud.obs.models.OBSRegion;
+import org.apache.camel.spi.BodyType;
+import org.apache.camel.spi.BodyType.Carrier;
+import org.apache.camel.spi.BodyTypes;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
@@ -39,6 +42,48 @@ import org.apache.camel.util.ObjectHelper;
 @UriEndpoint(firstVersion = "3.12.0", scheme = "hwcloud-obs", title = "Huawei 
Object Storage Service (OBS)",
              syntax = "hwcloud-obs:operation",
              category = { Category.CLOUD }, headersClass = OBSHeaders.class)
+@BodyTypes(consumerOut = @BodyType(value = Carrier.BYTES, javaType = "byte[]",
+                                   description = "The content of the object as 
a byte array, one message per object, with its"
+                                                 + " bucket, key and metadata 
in headers such as CamelHwCloudObsObjectKey, and the"
+                                                 + " key in CamelFileName too. 
Folders are consumed too, with an empty body, unless"
+                                                 + " includeFolders=false"),
+           producerIn = @BodyType(value = Carrier.ANY,
+                                  byOption = {
+                                          @BodyType.When(option = "operation", 
value = "putObject",
+                                                         carriers = {
+                                                                 Carrier.TEXT, 
Carrier.BYTES, Carrier.STREAM, Carrier.FILE }),
+                                          @BodyType.When(option = "operation", 
value = "createBucket",
+                                                         carriers = { 
Carrier.TEXT, Carrier.POJO }),
+                                          @BodyType.When(option = "operation", 
value = "listObjects",
+                                                         carriers = { 
Carrier.TEXT, Carrier.POJO }) },
+                                  description = "For putObject the content to 
upload: text, bytes, a stream or a file, such as"
+                                                + " the file of a file 
consumer, whose name is the object name when objectName is"
+                                                + " not set. A Map or a POJO 
fails: marshal it first. createBucket takes a"
+                                                + " CreateBucketRequest of the 
OBS SDK or its JSON as text, and listObjects a"
+                                                + " ListObjectsRequest or its 
JSON, and with another body use the options. The"
+                                                + " other operations do not 
use the body"),
+           producerOut = @BodyType(value = Carrier.UNCHANGED,
+                                   byOption = {
+                                           @BodyType.When(option = 
"operation", value = "putObject", carriers = Carrier.TEXT,
+                                                          javaType = 
"java.lang.String"),
+                                           @BodyType.When(option = 
"operation", value = "getObject", carriers = Carrier.BYTES,
+                                                          javaType = "byte[]"),
+                                           @BodyType.When(option = 
"operation", value = "listObjects", carriers = Carrier.TEXT,
+                                                          javaType = 
"java.lang.String"),
+                                           @BodyType.When(option = 
"operation", value = "listBuckets", carriers = Carrier.TEXT,
+                                                          javaType = 
"java.lang.String"),
+                                           @BodyType.When(option = 
"operation", value = "createBucket", carriers = Carrier.TEXT,
+                                                          javaType = 
"java.lang.String"),
+                                           @BodyType.When(option = 
"operation", value = "deleteBucket", carriers = Carrier.TEXT,
+                                                          javaType = 
"java.lang.String"),
+                                           @BodyType.When(option = 
"operation", value = "getBucketMetadata",
+                                                          carriers = 
Carrier.TEXT, javaType = "java.lang.String") },
+                                   description = "The JSON of the result as 
text: the PutObjectResult of putObject, the array of"
+                                                 + " the objects or the 
buckets for listObjects and listBuckets, the bucket for"
+                                                 + " createBucket, the 
response headers for deleteBucket and the metadata for"
+                                                 + " getBucketMetadata. 
getObject gives the content of the object as a byte array"
+                                                 + " with its metadata in 
headers. Unchanged after checkBucketExists, which sets the"
+                                                 + " 
CamelHwCloudObsBucketExists exchange property"))
 public class OBSEndpoint extends ScheduledPollEndpoint {
 
     @UriPath(description = "Operation to be performed", displayName = 
"Operation", label = "producer")
diff --git 
a/components/camel-huawei/camel-huaweicloud-smn/src/generated/resources/META-INF/org/apache/camel/component/huaweicloud/smn/hwcloud-smn.json
 
b/components/camel-huawei/camel-huaweicloud-smn/src/generated/resources/META-INF/org/apache/camel/component/huaweicloud/smn/hwcloud-smn.json
index bc9d4331b5ba..9264f439019a 100644
--- 
a/components/camel-huawei/camel-huaweicloud-smn/src/generated/resources/META-INF/org/apache/camel/component/huaweicloud/smn/hwcloud-smn.json
+++ 
b/components/camel-huawei/camel-huaweicloud-smn/src/generated/resources/META-INF/org/apache/camel/component/huaweicloud/smn/hwcloud-smn.json
@@ -27,6 +27,10 @@
     "lazyStartProducer": { "index": 0, "kind": "property", "displayName": 
"Lazy Start Producer", "group": "producer", "label": "producer", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, "description": 
"Whether the producer should be started lazy (on the first message). By 
starting lazy you can use this to allow CamelContext and routes to startup in 
situations where a producer may otherwise fail [...]
     "autowiredEnabled": { "index": 1, "kind": "property", "displayName": 
"Autowired Enabled", "group": "advanced", "label": "advanced", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": true, "description": 
"Whether autowiring is enabled. This is used for automatic autowiring options 
(the option must be marked as autowired) by looking up in the registry to find 
if there is a single instance of matching t [...]
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "text", "bytes", "stream", "file" ], 
"byOption": [ { "option": "operation", "value": "publishAsTemplatedMessage", 
"carriers": [ "text", "bytes", "stream", "file", "null" ] } ], "description": 
"The message to publish, as text: bytes, a stream or a file are read as text, 
and a Map or a POJO is sent as its toString(): marshal it first. No body fails 
for publishAsTextMessage, while publishAsTemplatedMessage can have no body, 
with the template from the CamelH [...]
+    "producerOut": { "carriers": [ "unchanged" ], "description": "Unchanged, 
with the ids of the message and of the request in the CamelHwCloudSmnMesssageId 
and CamelHwCloudSmnRequestId exchange properties" }
+  },
   "properties": {
     "smnService": { "index": 0, "kind": "path", "displayName": "Service name", 
"group": "producer", "label": "producer", "required": true, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Name of SMN service to 
invoke" },
     "accessKey": { "index": 1, "kind": "parameter", "displayName": "API access 
key (AK)", "group": "producer", "label": "", "required": true, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": true, "security": 
"secret", "description": "Access key for the cloud user" },
diff --git 
a/components/camel-huawei/camel-huaweicloud-smn/src/main/java/org/apache/camel/component/huaweicloud/smn/SimpleNotificationEndpoint.java
 
b/components/camel-huawei/camel-huaweicloud-smn/src/main/java/org/apache/camel/component/huaweicloud/smn/SimpleNotificationEndpoint.java
index 997d076bf8e7..ec7d2ee14572 100644
--- 
a/components/camel-huawei/camel-huaweicloud-smn/src/main/java/org/apache/camel/component/huaweicloud/smn/SimpleNotificationEndpoint.java
+++ 
b/components/camel-huawei/camel-huaweicloud-smn/src/main/java/org/apache/camel/component/huaweicloud/smn/SimpleNotificationEndpoint.java
@@ -22,6 +22,9 @@ import org.apache.camel.Consumer;
 import org.apache.camel.Processor;
 import org.apache.camel.Producer;
 import org.apache.camel.component.huaweicloud.common.models.ServiceKeys;
+import org.apache.camel.spi.BodyType;
+import org.apache.camel.spi.BodyType.Carrier;
+import org.apache.camel.spi.BodyTypes;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
@@ -34,6 +37,19 @@ import org.apache.camel.support.DefaultEndpoint;
 @UriEndpoint(firstVersion = "3.8.0", scheme = "hwcloud-smn", title = "Huawei 
Simple Message Notification (SMN)",
              syntax = "hwcloud-smn:smnService",
              category = { Category.CLOUD, Category.MESSAGING }, producerOnly = 
true)
+@BodyTypes(producerIn = @BodyType(value = { Carrier.TEXT, Carrier.BYTES, 
Carrier.STREAM, Carrier.FILE },
+                                  byOption = @BodyType.When(option = 
"operation", value = "publishAsTemplatedMessage",
+                                                            carriers = {
+                                                                    
Carrier.TEXT, Carrier.BYTES, Carrier.STREAM, Carrier.FILE,
+                                                                    
Carrier.NULL }),
+                                  description = "The message to publish, as 
text: bytes, a stream or a file are read as text,"
+                                                + " and a Map or a POJO is 
sent as its toString(): marshal it first. No body fails"
+                                                + " for publishAsTextMessage, 
while publishAsTemplatedMessage can have no body,"
+                                                + " with the template from the 
CamelHwCloudSmnTemplateName exchange property. The"
+                                                + " topic comes from the 
CamelHwCloudSmnTopic exchange property"),
+           producerOut = @BodyType(value = Carrier.UNCHANGED,
+                                   description = "Unchanged, with the ids of 
the message and of the request in the"
+                                                 + " CamelHwCloudSmnMesssageId 
and CamelHwCloudSmnRequestId exchange properties"))
 public class SimpleNotificationEndpoint extends DefaultEndpoint {
 
     @UriPath(description = "Name of SMN service to invoke", displayName = 
"Service name", label = "producer")
diff --git 
a/components/camel-openstack/src/generated/resources/META-INF/org/apache/camel/component/openstack/cinder/openstack-cinder.json
 
b/components/camel-openstack/src/generated/resources/META-INF/org/apache/camel/component/openstack/cinder/openstack-cinder.json
index d2cafdeab7fe..73d6bf76d429 100644
--- 
a/components/camel-openstack/src/generated/resources/META-INF/org/apache/camel/component/openstack/cinder/openstack-cinder.json
+++ 
b/components/camel-openstack/src/generated/resources/META-INF/org/apache/camel/component/openstack/cinder/openstack-cinder.json
@@ -40,6 +40,10 @@
     "CamelOpenstackName": { "index": 9, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The name.", "constantName": 
"org.apache.camel.component.openstack.common.OpenstackConstants#NAME" },
     "CamelOpenstackDescription": { "index": 10, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The description.", "constantName": 
"org.apache.camel.component.openstack.common.OpenstackConstants#DESCRIPTION" }
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "description": "Read by create and 
update only: a Volume or VolumeSnapshot of openstack4j, or else the fields from 
headers such as CamelOpenstackName. The other operations take the id from a 
header" },
+    "producerOut": { "carriers": [ "pojo", "list", "null", "unchanged" ], 
"byOption": [ { "option": "operation", "value": "create", "carriers": [ "pojo" 
] }, { "option": "operation", "value": "get", "carriers": [ "pojo", "null" ] }, 
{ "option": "operation", "value": "getAll", "carriers": [ "list" ] }, { 
"option": "operation", "value": "getAllTypes", "carriers": [ "list" ] }, { 
"option": "operation", "value": "update", "carriers": [ "unchanged" ] }, { 
"option": "operation", "value": "dele [...]
+  },
   "properties": {
     "host": { "index": 0, "kind": "path", "displayName": "Host", "group": 
"producer", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "OpenStack host url" },
     "apiVersion": { "index": 1, "kind": "parameter", "displayName": "Api 
Version", "group": "producer", "label": "", "required": false, "type": "enum", 
"javaType": "java.lang.String", "enum": [ "V2", "V3" ], "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": "V3", "description": 
"OpenStack API version" },
diff --git 
a/components/camel-openstack/src/generated/resources/META-INF/org/apache/camel/component/openstack/glance/openstack-glance.json
 
b/components/camel-openstack/src/generated/resources/META-INF/org/apache/camel/component/openstack/glance/openstack-glance.json
index 21882d5994c7..e3ec1c39a4d0 100644
--- 
a/components/camel-openstack/src/generated/resources/META-INF/org/apache/camel/component/openstack/glance/openstack-glance.json
+++ 
b/components/camel-openstack/src/generated/resources/META-INF/org/apache/camel/component/openstack/glance/openstack-glance.json
@@ -41,6 +41,10 @@
     "CamelOpenstackName": { "index": 10, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The name.", "constantName": 
"org.apache.camel.component.openstack.common.OpenstackConstants#NAME" },
     "CamelOpenstackProperties": { "index": 11, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "Map<String, String>", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The image properties.", 
"constantName": 
"org.apache.camel.component.openstack.common.OpenstackConstants#PROPERTIES" }
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": 
"operation", "value": "create", "carriers": [ "stream", "file", "pojo" ] }, { 
"option": "operation", "value": "upload", "carriers": [ "stream", "file", 
"pojo" ] } ], "description": "For create and upload the image data: an 
InputStream, a File, a URL or a Payload of openstack4j; text, bytes or the file 
of the file consumer fail: convert it to a File or an InputStream first. 
reserve and update take an Image of openstack4j [...]
+    "producerOut": { "carriers": [ "pojo", "list", "null", "unchanged" ], 
"byOption": [ { "option": "operation", "value": "reserve", "carriers": [ "pojo" 
] }, { "option": "operation", "value": "create", "carriers": [ "pojo" ] }, { 
"option": "operation", "value": "upload", "carriers": [ "pojo" ] }, { "option": 
"operation", "value": "update", "carriers": [ "pojo" ] }, { "option": 
"operation", "value": "get", "carriers": [ "pojo", "null" ] }, { "option": 
"operation", "value": "getAll", "car [...]
+  },
   "properties": {
     "host": { "index": 0, "kind": "path", "displayName": "Host", "group": 
"producer", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "OpenStack host url" },
     "apiVersion": { "index": 1, "kind": "parameter", "displayName": "Api 
Version", "group": "producer", "label": "", "required": false, "type": "enum", 
"javaType": "java.lang.String", "enum": [ "V2", "V3" ], "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": "V3", "description": 
"OpenStack API version" },
diff --git 
a/components/camel-openstack/src/generated/resources/META-INF/org/apache/camel/component/openstack/keystone/openstack-keystone.json
 
b/components/camel-openstack/src/generated/resources/META-INF/org/apache/camel/component/openstack/keystone/openstack-keystone.json
index 56ebed2fbd1f..593ce641b978 100644
--- 
a/components/camel-openstack/src/generated/resources/META-INF/org/apache/camel/component/openstack/keystone/openstack-keystone.json
+++ 
b/components/camel-openstack/src/generated/resources/META-INF/org/apache/camel/component/openstack/keystone/openstack-keystone.json
@@ -39,6 +39,10 @@
     "CamelOpenstackId": { "index": 8, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The ID.", "constantName": 
"org.apache.camel.component.openstack.common.OpenstackConstants#ID" },
     "CamelOpenstackName": { "index": 9, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The name.", "constantName": 
"org.apache.camel.component.openstack.common.OpenstackConstants#NAME" }
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "description": "Read by create and 
update only: a Region, Domain, Project, User or Group of openstack4j, or else 
the fields from headers such as CamelOpenstackName. The other operations take 
the ids from headers" },
+    "producerOut": { "carriers": [ "pojo", "list", "value", "null", 
"unchanged" ], "byOption": [ { "option": "operation", "value": "create", 
"carriers": [ "pojo" ] }, { "option": "operation", "value": "get", "carriers": 
[ "pojo", "null" ] }, { "option": "operation", "value": "getAll", "carriers": [ 
"list" ] }, { "option": "operation", "value": "update", "carriers": [ "pojo" ] 
}, { "option": "operation", "value": "delete", "carriers": [ "unchanged" ] }, { 
"option": "operation", "value": " [...]
+  },
   "properties": {
     "host": { "index": 0, "kind": "path", "displayName": "Host", "group": 
"producer", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "OpenStack host url" },
     "config": { "index": 1, "kind": "parameter", "displayName": "Config", 
"group": "producer", "label": "", "required": false, "type": "object", 
"javaType": "org.openstack4j.core.transport.Config", "deprecated": false, 
"autowired": false, "secret": false, "description": "OpenStack configuration" },
diff --git 
a/components/camel-openstack/src/generated/resources/META-INF/org/apache/camel/component/openstack/neutron/openstack-neutron.json
 
b/components/camel-openstack/src/generated/resources/META-INF/org/apache/camel/component/openstack/neutron/openstack-neutron.json
index e5c629100cd1..0a150984a242 100644
--- 
a/components/camel-openstack/src/generated/resources/META-INF/org/apache/camel/component/openstack/neutron/openstack-neutron.json
+++ 
b/components/camel-openstack/src/generated/resources/META-INF/org/apache/camel/component/openstack/neutron/openstack-neutron.json
@@ -51,6 +51,10 @@
     "CamelOpenstackId": { "index": 20, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The ID.", "constantName": 
"org.apache.camel.component.openstack.common.OpenstackConstants#ID" },
     "CamelOpenstackName": { "index": 21, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The name.", "constantName": 
"org.apache.camel.component.openstack.common.OpenstackConstants#NAME" }
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "description": "Read by create and 
update only: a Network, Subnet, Port or Router of openstack4j, or else the 
fields from headers such as CamelOpenstackName. The other operations take the 
ids from headers" },
+    "producerOut": { "carriers": [ "pojo", "list", "null", "unchanged" ], 
"byOption": [ { "option": "operation", "value": "create", "carriers": [ "pojo" 
] }, { "option": "operation", "value": "get", "carriers": [ "pojo", "null" ] }, 
{ "option": "operation", "value": "getAll", "carriers": [ "list" ] }, { 
"option": "operation", "value": "update", "carriers": [ "pojo" ] }, { "option": 
"operation", "value": "delete", "carriers": [ "unchanged" ] }, { "option": 
"operation", "value": "attachInt [...]
+  },
   "properties": {
     "host": { "index": 0, "kind": "path", "displayName": "Host", "group": 
"producer", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "OpenStack host url" },
     "apiVersion": { "index": 1, "kind": "parameter", "displayName": "Api 
Version", "group": "producer", "label": "", "required": false, "type": "enum", 
"javaType": "java.lang.String", "enum": [ "V2", "V3" ], "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": "V3", "description": 
"OpenStack API version" },
diff --git 
a/components/camel-openstack/src/generated/resources/META-INF/org/apache/camel/component/openstack/nova/openstack-nova.json
 
b/components/camel-openstack/src/generated/resources/META-INF/org/apache/camel/component/openstack/nova/openstack-nova.json
index aea1a77b347c..d8fcd3b87dcb 100644
--- 
a/components/camel-openstack/src/generated/resources/META-INF/org/apache/camel/component/openstack/nova/openstack-nova.json
+++ 
b/components/camel-openstack/src/generated/resources/META-INF/org/apache/camel/component/openstack/nova/openstack-nova.json
@@ -43,6 +43,10 @@
     "CamelOpenstackId": { "index": 12, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The ID.", "constantName": 
"org.apache.camel.component.openstack.common.OpenstackConstants#ID" },
     "CamelOpenstackName": { "index": 13, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The name.", "constantName": 
"org.apache.camel.component.openstack.common.OpenstackConstants#NAME" }
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "description": "Read by create 
only: a Flavor or ServerCreate of openstack4j, or else the fields from headers 
such as CamelOpenstackName; for keypairs the public key as text, or no body to 
have the key pair generated. The other operations take the id or name from 
headers" },
+    "producerOut": { "carriers": [ "pojo", "list", "text", "null", "unchanged" 
], "byOption": [ { "option": "operation", "value": "create", "carriers": [ 
"pojo" ] }, { "option": "operation", "value": "get", "carriers": [ "pojo", 
"null" ] }, { "option": "operation", "value": "getAll", "carriers": [ "list" ] 
}, { "option": "operation", "value": "createSnapshot", "carriers": [ "text" ], 
"javaType": "java.lang.String" }, { "option": "operation", "value": "delete", 
"carriers": [ "unchanged" ] [...]
+  },
   "properties": {
     "host": { "index": 0, "kind": "path", "displayName": "Host", "group": 
"producer", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "OpenStack host url" },
     "apiVersion": { "index": 1, "kind": "parameter", "displayName": "Api 
Version", "group": "producer", "label": "", "required": false, "type": "enum", 
"javaType": "java.lang.String", "enum": [ "V2", "V3" ], "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": "V3", "description": 
"OpenStack API version" },
diff --git 
a/components/camel-openstack/src/generated/resources/META-INF/org/apache/camel/component/openstack/swift/openstack-swift.json
 
b/components/camel-openstack/src/generated/resources/META-INF/org/apache/camel/component/openstack/swift/openstack-swift.json
index 4563b934a010..f830823a94c3 100644
--- 
a/components/camel-openstack/src/generated/resources/META-INF/org/apache/camel/component/openstack/swift/openstack-swift.json
+++ 
b/components/camel-openstack/src/generated/resources/META-INF/org/apache/camel/component/openstack/swift/openstack-swift.json
@@ -43,6 +43,10 @@
     "CamelOpenstackId": { "index": 12, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The ID.", "constantName": 
"org.apache.camel.component.openstack.common.OpenstackConstants#ID" },
     "CamelOpenstackName": { "index": 13, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The name.", "constantName": 
"org.apache.camel.component.openstack.common.OpenstackConstants#NAME" }
   },
+  "bodyTypes": {
+    "producerIn": { "carriers": [ "any" ], "description": "For create of an 
object the content: an InputStream, a File, a URL or a Payload of openstack4j; 
text, bytes or the file of the file consumer fail: convert it to a File or an 
InputStream first. createUpdateMetadata and deleteMetadata take the metadata as 
a Map. The containers take a CreateUpdateContainerOptions or 
ContainerListOptions of openstack4j, or else headers" },
+    "producerOut": { "carriers": [ "text", "pojo", "list", "map", "null", 
"unchanged" ], "byOption": [ { "option": "operation", "value": "getAll", 
"carriers": [ "list" ] }, { "option": "operation", "value": "getMetadata", 
"carriers": [ "map" ] }, { "option": "operation", "value": "delete", 
"carriers": [ "unchanged" ] }, { "option": "operation", "value": 
"createUpdateMetadata", "carriers": [ "unchanged" ] }, { "option": "operation", 
"value": "deleteMetadata", "carriers": [ "unchanged" ] } [...]
+  },
   "properties": {
     "host": { "index": 0, "kind": "path", "displayName": "Host", "group": 
"producer", "label": "", "required": true, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "OpenStack host url" },
     "apiVersion": { "index": 1, "kind": "parameter", "displayName": "Api 
Version", "group": "producer", "label": "", "required": false, "type": "enum", 
"javaType": "java.lang.String", "enum": [ "V2", "V3" ], "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": "V3", "description": 
"OpenStack API version" },
diff --git 
a/components/camel-openstack/src/main/docs/openstack-swift-component.adoc 
b/components/camel-openstack/src/main/docs/openstack-swift-component.adoc
index 23f05bbb7d4d..9ec139f27562 100644
--- a/components/camel-openstack/src/main/docs/openstack-swift-component.adoc
+++ b/components/camel-openstack/src/main/docs/openstack-swift-component.adoc
@@ -103,6 +103,7 @@ or 
`org.openstack4j.model.storage.object.options.ContainerListOptions` for listi
 === Example
 
 The following route stores each file of the `outbox` folder as an object of 
the `reports` container.
+The body must be an `InputStream`, a `File`, a `URL` or a `Payload` of 
openstack4j, so the route converts the file of the file consumer to a 
`java.io.File` first.
 The endpoint is the address of the identity service (Keystone), and the 
credentials are property placeholders:
 
 [source,yaml]
@@ -121,6 +122,8 @@ The endpoint is the address of the identity service 
(Keystone), and the credenti
             expression:
               simple:
                 expression: "${header.CamelFileName}"
+        - convertBodyTo:
+            type: java.io.File
         - to:
             uri: openstack-swift:http://controller:5000/v3
             parameters:
diff --git 
a/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/cinder/CinderEndpoint.java
 
b/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/cinder/CinderEndpoint.java
index 8b955724cafd..aec1a3bbb490 100644
--- 
a/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/cinder/CinderEndpoint.java
+++ 
b/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/cinder/CinderEndpoint.java
@@ -21,6 +21,9 @@ import org.apache.camel.Producer;
 import org.apache.camel.component.openstack.cinder.producer.SnapshotProducer;
 import org.apache.camel.component.openstack.cinder.producer.VolumeProducer;
 import org.apache.camel.component.openstack.common.AbstractOpenstackEndpoint;
+import org.apache.camel.spi.BodyType;
+import org.apache.camel.spi.BodyType.Carrier;
+import org.apache.camel.spi.BodyTypes;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
@@ -34,6 +37,18 @@ import static 
org.apache.camel.component.openstack.common.OpenstackConstants.SCH
  */
 @UriEndpoint(firstVersion = "2.19.0", scheme = SCHEME_CINDER, title = 
"OpenStack Cinder", syntax = "openstack-cinder:host",
              category = { Category.CONTAINER }, producerOnly = true, 
headersClass = CinderConstants.class)
+@BodyTypes(producerIn = @BodyType(value = Carrier.ANY,
+                                  description = "Read by create and update 
only: a Volume or VolumeSnapshot of openstack4j, or else the fields "
+                                                + "from headers such as 
CamelOpenstackName. The other operations take the id from a header"),
+           producerOut = @BodyType(value = { Carrier.POJO, Carrier.LIST, 
Carrier.NULL, Carrier.UNCHANGED }, byOption = {
+                   @BodyType.When(option = "operation", value = "create", 
carriers = Carrier.POJO),
+                   @BodyType.When(option = "operation", value = "get", 
carriers = { Carrier.POJO, Carrier.NULL }),
+                   @BodyType.When(option = "operation", value = "getAll", 
carriers = Carrier.LIST),
+                   @BodyType.When(option = "operation", value = "getAllTypes", 
carriers = Carrier.LIST),
+                   @BodyType.When(option = "operation", value = "update", 
carriers = Carrier.UNCHANGED),
+                   @BodyType.When(option = "operation", value = "delete", 
carriers = Carrier.UNCHANGED) },
+                                   description = "The Volume or VolumeSnapshot 
of openstack4j created or read (null when get finds none), a List "
+                                                 + "of them for getAll and of 
VolumeType for getAllTypes; update and delete keep the body"))
 public class CinderEndpoint extends AbstractOpenstackEndpoint {
 
     @UriParam(enums = "snapshots,volumes")
diff --git 
a/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/glance/GlanceEndpoint.java
 
b/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/glance/GlanceEndpoint.java
index eaf5be0ecd9c..a0f0defb853d 100644
--- 
a/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/glance/GlanceEndpoint.java
+++ 
b/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/glance/GlanceEndpoint.java
@@ -19,6 +19,9 @@ package org.apache.camel.component.openstack.glance;
 import org.apache.camel.Category;
 import org.apache.camel.Producer;
 import org.apache.camel.component.openstack.common.AbstractOpenstackEndpoint;
+import org.apache.camel.spi.BodyType;
+import org.apache.camel.spi.BodyType.Carrier;
+import org.apache.camel.spi.BodyTypes;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
@@ -32,6 +35,23 @@ import static 
org.apache.camel.component.openstack.common.OpenstackConstants.SCH
  */
 @UriEndpoint(firstVersion = "2.19.0", scheme = SCHEME_GLANCE, title = 
"OpenStack Glance", syntax = "openstack-glance:host",
              category = { Category.CONTAINER }, producerOnly = true, 
headersClass = GlanceConstants.class)
+@BodyTypes(producerIn = @BodyType(value = Carrier.ANY, byOption = {
+        @BodyType.When(option = "operation", value = "create", carriers = { 
Carrier.STREAM, Carrier.FILE, Carrier.POJO }),
+        @BodyType.When(option = "operation", value = "upload", carriers = { 
Carrier.STREAM, Carrier.FILE, Carrier.POJO }) },
+                                  description = "For create and upload the 
image data: an InputStream, a File, a URL or a Payload of "
+                                                + "openstack4j; text, bytes or 
the file of the file consumer fail: convert it to a File or "
+                                                + "an InputStream first. 
reserve and update take an Image of openstack4j, or else the fields from "
+                                                + "headers such as 
CamelOpenstackName"),
+           producerOut = @BodyType(value = { Carrier.POJO, Carrier.LIST, 
Carrier.NULL, Carrier.UNCHANGED }, byOption = {
+                   @BodyType.When(option = "operation", value = "reserve", 
carriers = Carrier.POJO),
+                   @BodyType.When(option = "operation", value = "create", 
carriers = Carrier.POJO),
+                   @BodyType.When(option = "operation", value = "upload", 
carriers = Carrier.POJO),
+                   @BodyType.When(option = "operation", value = "update", 
carriers = Carrier.POJO),
+                   @BodyType.When(option = "operation", value = "get", 
carriers = { Carrier.POJO, Carrier.NULL }),
+                   @BodyType.When(option = "operation", value = "getAll", 
carriers = Carrier.LIST),
+                   @BodyType.When(option = "operation", value = "delete", 
carriers = Carrier.UNCHANGED) },
+                                   description = "The Image of openstack4j 
reserved, created, uploaded, updated or read (null when get finds "
+                                                 + "none), a List of them for 
getAll; delete keeps the body"))
 public class GlanceEndpoint extends AbstractOpenstackEndpoint {
 
     @UriPath
diff --git 
a/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/keystone/KeystoneEndpoint.java
 
b/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/keystone/KeystoneEndpoint.java
index 946a5b77c5c5..5b0f99f75ccb 100644
--- 
a/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/keystone/KeystoneEndpoint.java
+++ 
b/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/keystone/KeystoneEndpoint.java
@@ -24,6 +24,9 @@ import 
org.apache.camel.component.openstack.keystone.producer.GroupProducer;
 import org.apache.camel.component.openstack.keystone.producer.ProjectProducer;
 import org.apache.camel.component.openstack.keystone.producer.RegionProducer;
 import org.apache.camel.component.openstack.keystone.producer.UserProducer;
+import org.apache.camel.spi.BodyType;
+import org.apache.camel.spi.BodyType.Carrier;
+import org.apache.camel.spi.BodyTypes;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
@@ -39,6 +42,27 @@ import static 
org.apache.camel.component.openstack.common.OpenstackConstants.SCH
 @UriEndpoint(firstVersion = "2.19.0", scheme = SCHEME_KEYSTONE, title = 
"OpenStack Keystone",
              syntax = "openstack-keystone:host", category = { 
Category.CONTAINER }, producerOnly = true,
              headersClass = KeystoneConstants.class)
+@BodyTypes(producerIn = @BodyType(value = Carrier.ANY,
+                                  description = "Read by create and update 
only: a Region, Domain, Project, User or Group of openstack4j, or "
+                                                + "else the fields from 
headers such as CamelOpenstackName. The other operations take the ids from "
+                                                + "headers"),
+           producerOut = @BodyType(value = { Carrier.POJO, Carrier.LIST, 
Carrier.VALUE, Carrier.NULL, Carrier.UNCHANGED },
+                                   byOption = {
+                                           @BodyType.When(option = 
"operation", value = "create", carriers = Carrier.POJO),
+                                           @BodyType.When(option = 
"operation", value = "get",
+                                                          carriers = { 
Carrier.POJO, Carrier.NULL }),
+                                           @BodyType.When(option = 
"operation", value = "getAll", carriers = Carrier.LIST),
+                                           @BodyType.When(option = 
"operation", value = "update", carriers = Carrier.POJO),
+                                           @BodyType.When(option = 
"operation", value = "delete", carriers = Carrier.UNCHANGED),
+                                           @BodyType.When(option = 
"operation", value = "addUserToGroup",
+                                                          carriers = 
Carrier.UNCHANGED),
+                                           @BodyType.When(option = 
"operation", value = "checkUserGroup",
+                                                          carriers = 
Carrier.VALUE, javaType = "java.lang.Boolean"),
+                                           @BodyType.When(option = 
"operation", value = "removeUserFromGroup",
+                                                          carriers = 
Carrier.UNCHANGED) },
+                                   description = "The Region, Domain, Project, 
User or Group of openstack4j created, read or updated (null when "
+                                                 + "get finds none), a List of 
them for getAll, true or false for checkUserGroup; delete, "
+                                                 + "addUserToGroup and 
removeUserFromGroup keep the body"))
 public class KeystoneEndpoint extends AbstractOpenstackEndpoint {
 
     @UriParam(enums = "regions,domains,projects,users,groups")
diff --git 
a/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/neutron/NeutronEndpoint.java
 
b/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/neutron/NeutronEndpoint.java
index e0184e9cdeb8..75c27d9a63a3 100644
--- 
a/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/neutron/NeutronEndpoint.java
+++ 
b/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/neutron/NeutronEndpoint.java
@@ -23,6 +23,9 @@ import 
org.apache.camel.component.openstack.neutron.producer.NetworkProducer;
 import org.apache.camel.component.openstack.neutron.producer.PortProducer;
 import org.apache.camel.component.openstack.neutron.producer.RouterProducer;
 import org.apache.camel.component.openstack.neutron.producer.SubnetProducer;
+import org.apache.camel.spi.BodyType;
+import org.apache.camel.spi.BodyType.Carrier;
+import org.apache.camel.spi.BodyTypes;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
@@ -37,6 +40,22 @@ import static 
org.apache.camel.component.openstack.common.OpenstackConstants.SCH
 @UriEndpoint(firstVersion = "2.19.0", scheme = SCHEME_NEUTRON, title = 
"OpenStack Neutron",
              syntax = "openstack-neutron:host", category = { 
Category.CONTAINER }, producerOnly = true,
              headersClass = NeutronConstants.class)
+@BodyTypes(producerIn = @BodyType(value = Carrier.ANY,
+                                  description = "Read by create and update 
only: a Network, Subnet, Port or Router of openstack4j, or else the "
+                                                + "fields from headers such as 
CamelOpenstackName. The other operations take the ids from headers"),
+           producerOut = @BodyType(value = { Carrier.POJO, Carrier.LIST, 
Carrier.NULL, Carrier.UNCHANGED }, byOption = {
+                   @BodyType.When(option = "operation", value = "create", 
carriers = Carrier.POJO),
+                   @BodyType.When(option = "operation", value = "get", 
carriers = { Carrier.POJO, Carrier.NULL }),
+                   @BodyType.When(option = "operation", value = "getAll", 
carriers = Carrier.LIST),
+                   @BodyType.When(option = "operation", value = "update", 
carriers = Carrier.POJO),
+                   @BodyType.When(option = "operation", value = "delete", 
carriers = Carrier.UNCHANGED),
+                   @BodyType.When(option = "operation", value = 
"attachInterface", carriers = Carrier.POJO,
+                                  javaType = 
"org.openstack4j.model.network.RouterInterface"),
+                   @BodyType.When(option = "operation", value = 
"detachInterface", carriers = Carrier.POJO,
+                                  javaType = 
"org.openstack4j.model.network.RouterInterface") },
+                                   description = "The Network, Subnet, Port or 
Router of openstack4j created, read or updated (null when get "
+                                                 + "finds none), a List of 
them for getAll, the RouterInterface for attachInterface and "
+                                                 + "detachInterface; delete 
keeps the body"))
 public class NeutronEndpoint extends AbstractOpenstackEndpoint {
 
     @UriParam(enums = "networks,subnets,ports,routers")
diff --git 
a/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/nova/NovaEndpoint.java
 
b/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/nova/NovaEndpoint.java
index af3e5a042404..fdcb54a94ea3 100644
--- 
a/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/nova/NovaEndpoint.java
+++ 
b/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/nova/NovaEndpoint.java
@@ -22,6 +22,9 @@ import 
org.apache.camel.component.openstack.common.AbstractOpenstackEndpoint;
 import org.apache.camel.component.openstack.nova.producer.FlavorsProducer;
 import org.apache.camel.component.openstack.nova.producer.KeypairProducer;
 import org.apache.camel.component.openstack.nova.producer.ServerProducer;
+import org.apache.camel.spi.BodyType;
+import org.apache.camel.spi.BodyType.Carrier;
+import org.apache.camel.spi.BodyTypes;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
@@ -35,6 +38,23 @@ import static 
org.apache.camel.component.openstack.common.OpenstackConstants.SCH
  */
 @UriEndpoint(firstVersion = "2.19.0", scheme = SCHEME_NOVA, title = "OpenStack 
Nova", syntax = "openstack-nova:host",
              category = { Category.CONTAINER }, producerOnly = true, 
headersClass = NovaConstants.class)
+@BodyTypes(producerIn = @BodyType(value = Carrier.ANY,
+                                  description = "Read by create only: a Flavor 
or ServerCreate of openstack4j, or else the fields from headers "
+                                                + "such as CamelOpenstackName; 
for keypairs the public key as text, or no body to have the key "
+                                                + "pair generated. The other 
operations take the id or name from headers"),
+           producerOut = @BodyType(value = { Carrier.POJO, Carrier.LIST, 
Carrier.TEXT, Carrier.NULL, Carrier.UNCHANGED },
+                                   byOption = {
+                                           @BodyType.When(option = 
"operation", value = "create", carriers = Carrier.POJO),
+                                           @BodyType.When(option = 
"operation", value = "get",
+                                                          carriers = { 
Carrier.POJO, Carrier.NULL }),
+                                           @BodyType.When(option = 
"operation", value = "getAll", carriers = Carrier.LIST),
+                                           @BodyType.When(option = 
"operation", value = "createSnapshot",
+                                                          carriers = 
Carrier.TEXT, javaType = "java.lang.String"),
+                                           @BodyType.When(option = 
"operation", value = "delete",
+                                                          carriers = 
Carrier.UNCHANGED) },
+                                   description = "The Flavor, Server or 
Keypair of openstack4j created or read (null when get finds none), a List "
+                                                 + "of them for getAll, the id 
of the image as text for createSnapshot; delete and a server action "
+                                                 + "keep the body"))
 public class NovaEndpoint extends AbstractOpenstackEndpoint {
 
     @UriParam(enums = "flavors,servers,keypairs")
diff --git 
a/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/swift/SwiftEndpoint.java
 
b/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/swift/SwiftEndpoint.java
index 6e59033cf208..c070f6d2a683 100644
--- 
a/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/swift/SwiftEndpoint.java
+++ 
b/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/swift/SwiftEndpoint.java
@@ -21,6 +21,9 @@ import org.apache.camel.Producer;
 import org.apache.camel.component.openstack.common.AbstractOpenstackEndpoint;
 import org.apache.camel.component.openstack.swift.producer.ContainerProducer;
 import org.apache.camel.component.openstack.swift.producer.ObjectProducer;
+import org.apache.camel.spi.BodyType;
+import org.apache.camel.spi.BodyType.Carrier;
+import org.apache.camel.spi.BodyTypes;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
@@ -34,6 +37,25 @@ import static 
org.apache.camel.component.openstack.common.OpenstackConstants.SCH
  */
 @UriEndpoint(firstVersion = "2.19.0", scheme = SCHEME_SWIFT, title = 
"OpenStack Swift", syntax = "openstack-swift:host",
              category = { Category.CONTAINER }, producerOnly = true, 
headersClass = SwiftConstants.class)
+@BodyTypes(producerIn = @BodyType(value = Carrier.ANY,
+                                  description = "For create of an object the 
content: an InputStream, a File, a URL or a Payload of openstack4j; "
+                                                + "text, bytes or the file of 
the file consumer fail: convert it to a File or an InputStream first. "
+                                                + "createUpdateMetadata and 
deleteMetadata take the metadata as a Map. The containers take a "
+                                                + 
"CreateUpdateContainerOptions or ContainerListOptions of openstack4j, or else 
headers"),
+           producerOut = @BodyType(value = {
+                   Carrier.TEXT, Carrier.POJO, Carrier.LIST, Carrier.MAP, 
Carrier.NULL, Carrier.UNCHANGED },
+                                   byOption = {
+                                           @BodyType.When(option = 
"operation", value = "getAll", carriers = Carrier.LIST),
+                                           @BodyType.When(option = 
"operation", value = "getMetadata", carriers = Carrier.MAP),
+                                           @BodyType.When(option = 
"operation", value = "delete", carriers = Carrier.UNCHANGED),
+                                           @BodyType.When(option = 
"operation", value = "createUpdateMetadata",
+                                                          carriers = 
Carrier.UNCHANGED),
+                                           @BodyType.When(option = 
"operation", value = "deleteMetadata",
+                                                          carriers = 
Carrier.UNCHANGED) },
+                                   description = "For objects: the ETag as 
text after create, the SwiftObject of openstack4j for get (its "
+                                                 + "download() gives the 
content), a List of them for getAll. For containers: a List of "
+                                                 + "SwiftContainer for get and 
getAll; create and update keep the body. getMetadata gives a Map of "
+                                                 + "the metadata; delete and 
the metadata updates keep the body"))
 public class SwiftEndpoint extends AbstractOpenstackEndpoint {
 
     @UriParam(enums = "objects,containers")

Reply via email to