This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch feature/CAMEL-24961-catalog-body-types-aws-4 in repository https://gitbox.apache.org/repos/asf/camel.git
commit b1bc0f6a46fc32bec8ebe114ffb0da5834724ca4 Author: Claus Ibsen <[email protected]> AuthorDate: Fri Oct 23 12:45:18 2026 +0200 CAMEL-24961: Catalog body types for Athena, S3 Vectors, Step Functions and eight more AWS components Declares the body types of aws-config, aws-parameter-store, aws-security-hub, aws2-athena, aws2-ecs, aws2-eks, aws2-mq, aws2-msk, aws2-redshift-data, aws2-s3-vectors and aws2-step-functions. All were checked at runtime with camel run, against the AWS emulator of camel infra and, for Security Hub, Athena and Redshift Data, a fake of the AWS API. The bodies that are read: the SQL of startQueryExecution of athena, the value of putParameter, the findings of batchImportFindings and the vector or the keys of s3-vectors, each unless a header has it. The other operations take their input from headers. athena leaves no body after startQueryExecution unless it waits, and gives the results as an iterable of pages; getParameter gives the value as text; s3-vectors gives a List for its query, get and list operations, and its consumer one QueryOutputVector per vector found; the rest give the response of the AWS SDK. aws-parameter-store is not registered for the catalog generation, so only its own JSON has the body types, not the catalog. Fixes the doc prose about the body of athena: getQueryExecution gives a GetQueryExecutionResponse, listQueryExecutions a ListQueryExecutionsResponse, S3Pointer the location of the results as text, and startQueryExecution no body unless it waits. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]> Signed-off-by: Claus Ibsen <[email protected]> --- .../camel/catalog/components/aws-config.json | 4 ++ .../camel/catalog/components/aws-security-hub.json | 4 ++ .../camel/catalog/components/aws2-athena.json | 4 ++ .../apache/camel/catalog/components/aws2-ecs.json | 4 ++ .../apache/camel/catalog/components/aws2-eks.json | 4 ++ .../apache/camel/catalog/components/aws2-mq.json | 4 ++ .../apache/camel/catalog/components/aws2-msk.json | 4 ++ .../catalog/components/aws2-redshift-data.json | 4 ++ .../camel/catalog/components/aws2-s3-vectors.json | 5 ++ .../catalog/components/aws2-step-functions.json | 4 ++ .../camel/catalog/docs/aws2-athena-component.adoc | 30 ++++++----- .../camel/component/aws/config/aws-config.json | 4 ++ .../component/aws/config/AWSConfigEndpoint.java | 16 ++++++ .../aws/parameterstore/aws-parameter-store.json | 4 ++ .../aws/parameterstore/ParameterStoreEndpoint.java | 21 ++++++++ .../aws/securityhub/aws-security-hub.json | 4 ++ .../aws/securityhub/SecurityHubEndpoint.java | 19 +++++++ .../camel/component/aws2/athena/aws2-athena.json | 4 ++ .../src/main/docs/aws2-athena-component.adoc | 30 ++++++----- .../component/aws2/athena/Athena2Endpoint.java | 27 ++++++++++ .../apache/camel/component/aws2/ecs/aws2-ecs.json | 4 ++ .../camel/component/aws2/ecs/ECS2Endpoint.java | 14 +++++ .../apache/camel/component/aws2/eks/aws2-eks.json | 4 ++ .../camel/component/aws2/eks/EKS2Endpoint.java | 13 +++++ .../apache/camel/component/aws2/mq/aws2-mq.json | 4 ++ .../camel/component/aws2/mq/MQ2Endpoint.java | 13 +++++ .../apache/camel/component/aws2/msk/aws2-msk.json | 4 ++ .../camel/component/aws2/msk/MSK2Endpoint.java | 13 +++++ .../aws2/redshift/data/aws2-redshift-data.json | 4 ++ .../aws2/redshift/data/RedshiftData2Endpoint.java | 14 +++++ .../component/aws2/s3vectors/aws2-s3-vectors.json | 5 ++ .../aws2/s3vectors/AWS2S3VectorsEndpoint.java | 34 ++++++++++++ .../aws2/stepfunctions/aws2-step-functions.json | 4 ++ .../aws2/stepfunctions/StepFunctions2Endpoint.java | 16 ++++++ .../camel/dsl/yaml/validator/TextBodyFlowTest.java | 62 ++++++++++++++++++++++ 35 files changed, 384 insertions(+), 24 deletions(-) diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws-config.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws-config.json index c9b79f9de9fd..7ed9e9726c47 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws-config.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws-config.json @@ -56,6 +56,10 @@ "CamelAwsConfigConformacePackS3TemplateURI": { "index": 5, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The location of the file containing the template body in S3", "constantName": "org.apache.camel.component.aws.config.AWSConfigConstants#CONFORMACE_PACK_S3_TEMPLATE_URI" }, "CamelAwsConfigConformacePackTemplateBody": { "index": 6, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "A string containing the full conformance pack template body", "constantName": "org.apache.camel.component.aws.config.AWSConfigConstants#CONFORMACE_PACK_TEMPLATE_BODY" } }, + "bodyTypes": { + "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": "pojoRequest", "value": "true", "carriers": [ "pojo" ] } ], "description": "Not used: the operations take their input from headers, such as the rule of putConfigRule in CamelAwsConfigRuleName, CamelAwsConfigRuleSource and CamelAwsConfigRuleSourceIdentifier, and the template of putConformancePack in CamelAwsConfigConformacePackTemplateBody. With pojoRequest=true the request of the AWS SDK for the operation, such as a Put [...] + "producerOut": { "carriers": [ "pojo" ], "description": "The response of the AWS SDK for the operation, such as the DescribeComplianceByConfigRuleResponse of describeRuleCompliance, or the PutConformancePackResponse with the ARN of the pack. putConfigRule, removeConfigRule and removeConformancePack give an empty response" } + }, "properties": { "label": { "index": 0, "kind": "path", "displayName": "Label", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws.config.AWSConfigConfiguration", "configurationField": "configuration", "description": "Logical name" }, "operation": { "index": 1, "kind": "parameter", "displayName": "Operation", "group": "producer", "label": "", "required": true, "type": "enum", "javaType": "org.apache.camel.component.aws.config.AWSConfigOperations", "enum": [ "putConfigRule", "removeConfigRule", "describeRuleCompliance", "putConformancePack", "removeConformancePack" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws.config.AWSConf [...] diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws-security-hub.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws-security-hub.json index c550f5a64599..46894fe3a2ce 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws-security-hub.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws-security-hub.json @@ -71,6 +71,10 @@ "CamelAwsSecurityHubProductArn": { "index": 20, "kind": "header", "displayName": "", "group": "getFindingHistory", "label": "getFindingHistory", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The product ARN for the finding", "constantName": "org.apache.camel.component.aws.securityhub.SecurityHubConstants#PRODUCT_ARN" }, "CamelAwsSecurityHubFindingAggregatorArn": { "index": 21, "kind": "header", "displayName": "", "group": "getFindingAggregator", "label": "getFindingAggregator", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The ARN of the finding aggregator to retrieve", "constantName": "org.apache.camel.component.aws.securityhub.SecurityHubConstants#FINDING_AGGREGATOR_ARN" } }, + "bodyTypes": { + "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": "pojoRequest", "value": "true", "carriers": [ "pojo" ] } ], "description": "batchImportFindings, the default, imports the findings of the CamelAwsSecurityHubFindings header, or else of the body: a List of the AwsSecurityFinding of the AWS SDK, or one AwsSecurityFinding. JSON text, a Map, an array or a List of anything else fails. The other operations take their input from headers, such as CamelAwsSecurityHubFilters. Wit [...] + "producerOut": { "carriers": [ "pojo" ], "description": "The response of the AWS SDK for the operation, such as the BatchImportFindingsResponse of batchImportFindings, with the counts in the CamelAwsSecurityHubSuccessCount and CamelAwsSecurityHubFailedCount headers: a finding that is not imported does not fail the exchange. getFindings gives a GetFindingsResponse, with the token of the next page in the CamelAwsSecurityHubNextToken header" } + }, "properties": { "label": { "index": 0, "kind": "path", "displayName": "Label", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Logical name" }, "operation": { "index": 1, "kind": "parameter", "displayName": "Operation", "group": "producer", "label": "", "required": true, "type": "enum", "javaType": "org.apache.camel.component.aws.securityhub.SecurityHubOperations", "enum": [ "batchImportFindings", "getFindings", "batchUpdateFindings", "getFindingHistory", "describeHub", "listEnabledProductsForImport", "getFindingAggregator" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": "b [...] diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-athena.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-athena.json index bc651c82adb4..57ed65b66f76 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-athena.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-athena.json @@ -89,6 +89,10 @@ "CamelAwsAthenaStartQueryExecutionAttempts": { "index": 21, "kind": "header", "displayName": "", "group": "startQueryExecution", "label": "startQueryExecution", "required": false, "javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Total number of attempts made to run the query. Will be greater than 1 if the query is retried.", "constantName": "org.apache.camel.component.aws2.athena.Athena2Constants#START_QUERY_EXECUTION [...] "CamelAwsAthenaStartQueryExecutionElapsedMillis": { "index": 22, "kind": "header", "displayName": "", "group": "startQueryExecution", "label": "startQueryExecution", "required": false, "javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Total time in millis taken in startQueryExecution (mostly relevant when waiting for query completion within startQueryExecution).", "constantName": "org.apache.camel.component.aws2.athen [...] }, + "bodyTypes": { + "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": "operation", "value": "startQueryExecution", "carriers": [ "text", "bytes", "stream", "file", "null" ] } ], "description": "The SQL of startQueryExecution, the default, as text: bytes, a stream or a file are read as text, a Map or a POJO is sent as its toString(). With no body the SQL comes from the CamelAwsAthenaQueryString header or the queryString option. The other operations do not use the body: they take the id of [...] + "producerOut": { "carriers": [ "pojo" ], "byOption": [ { "option": "operation", "value": "startQueryExecution", "carriers": [ "null", "pojo" ] }, { "option": "operation", "value": "getQueryResults", "carriers": [ "iterator", "pojo", "text" ] } ], "description": "startQueryExecution, the default, leaves no body, with the id of the query in the CamelAwsAthenaQueryExecutionId header; with waitTimeout, the GetQueryExecutionResponse of the AWS SDK of the last check, whatever the state of [...] + }, "properties": { "label": { "index": 0, "kind": "path", "displayName": "Label", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.athena.Athena2Configuration", "configurationField": "configuration", "description": "Logical name" }, "database": { "index": 1, "kind": "parameter", "displayName": "Database", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.athena.Athena2Configuration", "configurationField": "configuration", "description": "The Athena database to use." }, diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-ecs.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-ecs.json index 1078e8b06d89..a0bffdbfb326 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-ecs.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-ecs.json @@ -55,6 +55,10 @@ "CamelAwsECSIsTruncated": { "index": 4, "kind": "header", "displayName": "", "group": "listClusters", "label": "listClusters", "required": false, "javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Whether the response has more results (is truncated).", "constantName": "org.apache.camel.component.aws2.ecs.ECS2Constants#IS_TRUNCATED" }, "CamelAwsECSClusterArn": { "index": 5, "kind": "header", "displayName": "", "group": "createCluster describeCluster deleteCluster", "label": "createCluster describeCluster deleteCluster", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The ARN of the cluster.", "constantName": "org.apache.camel.component.aws2.ecs.ECS2Constants#CLUSTER_ARN" } }, + "bodyTypes": { + "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": "pojoRequest", "value": "true", "carriers": [ "pojo" ] } ], "description": "Not used: the operations take their input from headers, such as the name of the cluster in CamelAwsECSClusterName. With pojoRequest=true the request of the AWS SDK for the operation, such as a ListClustersRequest: another body fails" }, + "producerOut": { "carriers": [ "pojo" ], "description": "The response of the AWS SDK for the operation, such as the ListClustersResponse of listClusters, with the token of the next page in a header. describeCluster of a cluster that does not exist does not fail: the response lists it in its failures" } + }, "properties": { "label": { "index": 0, "kind": "path", "displayName": "Label", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.ecs.ECS2Configuration", "configurationField": "configuration", "description": "Logical name" }, "operation": { "index": 1, "kind": "parameter", "displayName": "Operation", "group": "producer", "label": "", "required": true, "type": "enum", "javaType": "org.apache.camel.component.aws2.ecs.ECS2Operations", "enum": [ "listClusters", "describeCluster", "createCluster", "deleteCluster" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.ecs.ECS2Configuration", "configurationField": "configuration" [...] diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-eks.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-eks.json index b43403c1ba00..3cca2693328d 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-eks.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-eks.json @@ -58,6 +58,10 @@ "CamelAwsEKSIsTruncated": { "index": 7, "kind": "header", "displayName": "", "group": "listClusters", "label": "listClusters", "required": false, "javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Whether the response has more results (is truncated).", "constantName": "org.apache.camel.component.aws2.eks.EKS2Constants#IS_TRUNCATED" }, "CamelAwsEKSClusterArn": { "index": 8, "kind": "header", "displayName": "", "group": "createCluster describeCluster deleteCluster", "label": "createCluster describeCluster deleteCluster", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The ARN of the cluster.", "constantName": "org.apache.camel.component.aws2.eks.EKS2Constants#CLUSTER_ARN" } }, + "bodyTypes": { + "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": "pojoRequest", "value": "true", "carriers": [ "pojo" ] } ], "description": "Not used: the operations take their input from headers, such as the name of the cluster in CamelAwsEKSClusterName. With pojoRequest=true the request of the AWS SDK for the operation, such as a ListClustersRequest: another body fails" }, + "producerOut": { "carriers": [ "pojo" ], "description": "The response of the AWS SDK for the operation, such as the ListClustersResponse of listClusters, with the token of the next page in a header" } + }, "properties": { "label": { "index": 0, "kind": "path", "displayName": "Label", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.eks.EKS2Configuration", "configurationField": "configuration", "description": "Logical name" }, "operation": { "index": 1, "kind": "parameter", "displayName": "Operation", "group": "producer", "label": "", "required": true, "type": "enum", "javaType": "org.apache.camel.component.aws2.eks.EKS2Operations", "enum": [ "listClusters", "describeCluster", "createCluster", "deleteCluster" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.eks.EKS2Configuration", "configurationField": "configuration" [...] diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-mq.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-mq.json index a100694868ff..fe992fd16870 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-mq.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-mq.json @@ -64,6 +64,10 @@ "CamelAwsMQBrokerArn": { "index": 13, "kind": "header", "displayName": "", "group": "createBroker", "label": "createBroker", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Amazon Resource Name (ARN) of the broker.", "constantName": "org.apache.camel.component.aws2.mq.MQ2Constants#BROKER_ARN" }, "CamelAwsMQBrokerState": { "index": 14, "kind": "header", "displayName": "", "group": "describeBroker", "label": "describeBroker", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The state of the broker.", "constantName": "org.apache.camel.component.aws2.mq.MQ2Constants#BROKER_STATE" } }, + "bodyTypes": { + "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": "pojoRequest", "value": "true", "carriers": [ "pojo" ] } ], "description": "Not used: the operations take their input from headers, such as the id of the broker in CamelAwsMQBrokerID, and the users of createBroker as a List of the User of the AWS SDK. With pojoRequest=true the request of the AWS SDK for the operation, such as a ListBrokersRequest: another body fails" }, + "producerOut": { "carriers": [ "pojo" ], "description": "The response of the AWS SDK for the operation, such as the ListBrokersResponse of listBrokers, with the token of the next page in a header" } + }, "properties": { "label": { "index": 0, "kind": "path", "displayName": "Label", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.mq.MQ2Configuration", "configurationField": "configuration", "description": "Logical name" }, "operation": { "index": 1, "kind": "parameter", "displayName": "Operation", "group": "producer", "label": "", "required": true, "type": "enum", "javaType": "org.apache.camel.component.aws2.mq.MQ2Operations", "enum": [ "listBrokers", "createBroker", "deleteBroker", "rebootBroker", "updateBroker", "describeBroker" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.mq.MQ2Configuration", "configuratio [...] diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-msk.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-msk.json index 42f2250df7fa..12ece07f27ef 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-msk.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-msk.json @@ -60,6 +60,10 @@ "CamelAwsMSKIsTruncated": { "index": 9, "kind": "header", "displayName": "", "group": "listClusters", "label": "listClusters", "required": false, "javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Whether the response has more results (is truncated).", "constantName": "org.apache.camel.component.aws2.msk.MSK2Constants#IS_TRUNCATED" }, "CamelAwsMSKClusterState": { "index": 10, "kind": "header", "displayName": "", "group": "createCluster describeCluster", "label": "createCluster describeCluster", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The state of the cluster.", "constantName": "org.apache.camel.component.aws2.msk.MSK2Constants#CLUSTER_STATE" } }, + "bodyTypes": { + "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": "pojoRequest", "value": "true", "carriers": [ "pojo" ] } ], "description": "Not used: the operations take their input from headers, such as the ARN of the cluster in CamelAwsMSKClusterArn. With pojoRequest=true the request of the AWS SDK for the operation, such as a ListClustersRequest: another body fails" }, + "producerOut": { "carriers": [ "pojo" ], "description": "The response of the AWS SDK for the operation, such as the ListClustersResponse of listClusters, with the token of the next page in a header" } + }, "properties": { "label": { "index": 0, "kind": "path", "displayName": "Label", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.msk.MSK2Configuration", "configurationField": "configuration", "description": "Logical name" }, "operation": { "index": 1, "kind": "parameter", "displayName": "Operation", "group": "producer", "label": "", "required": true, "type": "enum", "javaType": "org.apache.camel.component.aws2.msk.MSK2Operations", "enum": [ "listClusters", "createCluster", "deleteCluster", "describeCluster" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.msk.MSK2Configuration", "configurationField": "configuration" [...] diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-redshift-data.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-redshift-data.json index 7db6bb872123..7175a5841d2f 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-redshift-data.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-redshift-data.json @@ -74,6 +74,10 @@ "CamelAwsRedshiftDataSqlParameterList": { "index": 23, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "List<SqlParameterList>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The parameters for the SQL statement.", "constantName": "org.apache.camel.component.aws2.redshift.data.RedshiftData2Constants#SQL_PARAMETER_LIST" }, "CamelAwsRedshiftDataSqlStatementList": { "index": 24, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "List", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The List of SQL statements text to run.", "constantName": "org.apache.camel.component.aws2.redshift.data.RedshiftData2Constants#SQL_STATEMENT_LIST" } }, + "bodyTypes": { + "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": "pojoRequest", "value": "true", "carriers": [ "pojo" ] } ], "description": "Not used: the operations take their input from headers, such as the SQL of executeStatement in CamelAwsRedshiftDataSqlStatement; SQL in the body is not run. With pojoRequest=true the request of the AWS SDK for the operation, such as an ExecuteStatementRequest: another body fails" }, + "producerOut": { "carriers": [ "pojo" ], "description": "The response of the AWS SDK for the operation, such as the ExecuteStatementResponse of executeStatement, which does not wait for the statement, or the GetStatementResultResponse of getStatementResult with one page of records" } + }, "properties": { "label": { "index": 0, "kind": "path", "displayName": "Label", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.redshift.data.RedshiftData2Configuration", "configurationField": "configuration", "description": "Logical name" }, "operation": { "index": 1, "kind": "parameter", "displayName": "Operation", "group": "producer", "label": "", "required": true, "type": "enum", "javaType": "org.apache.camel.component.aws2.redshift.data.RedshiftData2Operations", "enum": [ "listDatabases", "listSchemas", "listStatements", "listTables", "describeTable", "executeStatement", "batchExecuteStatement", "cancelStatement", "describeStatement", "getStatementResult" ], "deprecated": false, "deprecationNote": "", "autowired": fa [...] diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-s3-vectors.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-s3-vectors.json index 58da8dc70451..bb56e4dada37 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-s3-vectors.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-s3-vectors.json @@ -77,6 +77,11 @@ "CamelAwsS3VectorsIndexStatus": { "index": 15, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The status of the vector index", "constantName": "org.apache.camel.component.aws2.s3vectors.AWS2S3VectorsConstants#INDEX_STATUS" }, "CamelAwsS3VectorsVectorBucketArn": { "index": 16, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The ARN of the vector bucket", "constantName": "org.apache.camel.component.aws2.s3vectors.AWS2S3VectorsConstants#VECTOR_BUCKET_ARN" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "pojo" ], "javaType": "software.amazon.awssdk.services.s3vectors.model.QueryOutputVector", "description": "One message per vector that the similarity search of consumerQueryVector finds and that was not sent before, as a QueryOutputVector of the AWS SDK with its key only, also in the CamelAwsS3VectorsVectorId header" }, + "producerIn": { "carriers": [ "any" ], "description": "The vector of putVectors and queryVectors, unless the CamelAwsS3VectorsVectorData or CamelAwsS3VectorsQueryVector header has it: one vector as a List of numbers, a float[] or a double[]. Text such as a JSON array fails, so unmarshal it first. The keys of getVectors and deleteVectors, unless the CamelAwsS3VectorsVectorId header has them: a String, a String[] or a List of Strings. The other operations do not use the body" }, + "producerOut": { "carriers": [ "pojo" ], "byOption": [ { "option": "operation", "value": "queryVectors", "carriers": [ "list" ], "javaType": "java.util.List<software.amazon.awssdk.services.s3vectors.model.QueryOutputVector>" }, { "option": "operation", "value": "getVectors", "carriers": [ "list" ], "javaType": "java.util.List<software.amazon.awssdk.services.s3vectors.model.GetOutputVector>" }, { "option": "operation", "value": "listVectorBuckets", "carriers": [ "list" ], "javaType": [...] + }, "properties": { "vectorBucketName": { "index": 0, "kind": "path", "displayName": "Vector Bucket Name", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Vector bucket name or ARN" }, "dataType": { "index": 1, "kind": "parameter", "displayName": "Data Type", "group": "common", "label": "", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "float32", "float16" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "float32", "configurationClass": "org.apache.camel.component.aws2.s3vectors.AWS2S3VectorsConfiguration", "configurationField": "configuration", "description": "The data type of the vector. Options: float32, [...] diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-step-functions.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-step-functions.json index da6f5ed00df0..1cf61fbe57f1 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-step-functions.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-step-functions.json @@ -67,6 +67,10 @@ "CamelAwsStepFunctionsExecutionHistoryReverseOrder": { "index": 16, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Lists events in descending order of their timeStamp.", "constantName": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#EXECUTION_HISTORY_REVERSE_ORDER" }, "CamelAwsStepFunctionsExecutionMaxResults": { "index": 17, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The limit number of results while listing executions", "constantName": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#EXECUTIONS_MAX_RESULTS" } }, + "bodyTypes": { + "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": "pojoRequest", "value": "true", "carriers": [ "pojo" ] } ], "description": "Not used: the operations take their input from headers, such as the input of startExecution and startSyncExecution in the CamelAwsStepFunctionsExecutionInput header as JSON text: marshal a Map or a POJO first. With pojoRequest=true the request of the AWS SDK for the operation, such as a StartExecutionRequest: another body fails" }, + "producerOut": { "carriers": [ "pojo" ], "description": "The response of the AWS SDK for the operation, such as the StartExecutionResponse of startExecution with the ARN of the execution. startSyncExecution gives a StartSyncExecutionResponse whose output is the JSON that the execution returns, as text: a failed execution does not fail the exchange, so check its status" } + }, "properties": { "label": { "index": 0, "kind": "path", "displayName": "Label", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "Logical name" }, "operation": { "index": 1, "kind": "parameter", "displayName": "Operation", "group": "producer", "label": "", "required": true, "type": "enum", "javaType": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Operations", "enum": [ "createStateMachine", "deleteStateMachine", "updateStateMachine", "describeStateMachine", "listStateMachines", "createActivity", "deleteActivity", "describeActivity", "getActivityTask", "listActivities", "startExecution", "startSyncExecution", "sto [...] diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/aws2-athena-component.adoc b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/aws2-athena-component.adoc index 2c701f18bfb7..69337622a404 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/aws2-athena-component.adoc +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/aws2-athena-component.adoc @@ -341,8 +341,10 @@ YAML:: ---- ==== -The preceding example will yield an -https://docs.aws.amazon.com/athena/latest/APIReference/API_QueryExecution.html[Athena QueryExecution] in the body. +The preceding example will yield a +https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/athena/model/GetQueryExecutionResponse.html[GetQueryExecutionResponse] +in the body, whose `queryExecution()` is the +https://docs.aws.amazon.com/athena/latest/APIReference/API_QueryExecution.html[Athena QueryExecution]. The getQueryExecution operation also supports retrieving the query execution ID from a header (`CamelAwsAthenaQueryExecutionId`), and since startQueryExecution sets the same header, upon starting a query, @@ -400,7 +402,7 @@ YAML:: ---- ==== -The preceding example will yield an Athena QueryExecution in the body for the query that was just started. +The preceding example will yield a GetQueryExecutionResponse in the body for the query that was just started. - getQueryResults: this operation returns the results of a query that has succeeded. The results are returned in the body in one of three formats. @@ -489,7 +491,7 @@ from("direct:start") The preceding example will print the results of the query as CSV to the console. `SelectList` - returns a -https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/athena/model/GetQueryResultsResponse.html[GetQueryResponse] +https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/athena/model/GetQueryResultsResponse.html[GetQueryResultsResponse] in the body containing at most 1,000 rows, plus the NextToken value as a header (`CamelAwsAthenaNextToken`), which can be used for manual pagination of results: @@ -548,11 +550,11 @@ YAML:: ==== The preceding example will return a -https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/athena/model/GetQueryResultsResponse.html[GetQueryResponse] +https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/athena/model/GetQueryResultsResponse.html[GetQueryResultsResponse] in the body plus the NextToken value as a header (`CamelAwsAthenaNextToken`), which can be used to manually page through the results 1,000 rows at a time. -`S3Pointer` - return an S3 path (e.g. `s3://bucket/path/`) pointing to the results: +`S3Pointer` - returns the S3 location of the results of the query as text: [tabs] ==== @@ -608,9 +610,8 @@ YAML:: ---- ==== -The preceding example will return an -S3 path (e.g. `s3://bucket/path/`) in the body pointing to the results. The path will also be set in a header -(`CamelAwsAthenaOutputLocation`). +The preceding example will return the S3 location of the results of the query as text in the body. +The location will also be set in a header (`CamelAwsAthenaOutputLocation`). - listQueryExecutions: this operation returns a list of query execution IDs @@ -653,8 +654,9 @@ YAML:: ---- ==== -The preceding example will return a list of query executions in the body, plus the NextToken value as a -header (`CamelAwsAthenaNextToken`) than can be used for manual pagination of results. +The preceding example will return a ListQueryExecutionsResponse in the body, whose `queryExecutionIds()` lists the +ids of the query executions, plus the NextToken value as a header (`CamelAwsAthenaNextToken`) that can be used for +manual pagination of results. - startQueryExecution: this operation starts the execution of a query. It supports waiting for the query to complete before proceeding, and retrying the query based on a set of configurable failure conditions: @@ -707,7 +709,8 @@ YAML:: The preceding example will start the query `SELECT 1` and configure the results to be saved to `s3://bucket/path/`, but will not wait for the query -to complete. +to complete. The body is then empty, and the id of the query is in the +`CamelAwsAthenaQueryExecutionId` header. [tabs] ==== @@ -759,6 +762,9 @@ YAML:: The preceding example will start a query and wait up to 60 seconds for it to reach a status that indicates it is complete (one of SUCCEEDED, FAILED, CANCELLED, or UNKNOWN_TO_SDK_VERSION). Upon failure, the query would not be retried. +The body is then the GetQueryExecutionResponse of the last check: a query that fails, or +still runs after the wait, does not fail the exchange, so check the state of the query in the +`CamelAwsAthenaQueryExecutionState` header. [tabs] ==== diff --git a/components/camel-aws/camel-aws-config/src/generated/resources/META-INF/org/apache/camel/component/aws/config/aws-config.json b/components/camel-aws/camel-aws-config/src/generated/resources/META-INF/org/apache/camel/component/aws/config/aws-config.json index c9b79f9de9fd..7ed9e9726c47 100644 --- a/components/camel-aws/camel-aws-config/src/generated/resources/META-INF/org/apache/camel/component/aws/config/aws-config.json +++ b/components/camel-aws/camel-aws-config/src/generated/resources/META-INF/org/apache/camel/component/aws/config/aws-config.json @@ -56,6 +56,10 @@ "CamelAwsConfigConformacePackS3TemplateURI": { "index": 5, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The location of the file containing the template body in S3", "constantName": "org.apache.camel.component.aws.config.AWSConfigConstants#CONFORMACE_PACK_S3_TEMPLATE_URI" }, "CamelAwsConfigConformacePackTemplateBody": { "index": 6, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "A string containing the full conformance pack template body", "constantName": "org.apache.camel.component.aws.config.AWSConfigConstants#CONFORMACE_PACK_TEMPLATE_BODY" } }, + "bodyTypes": { + "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": "pojoRequest", "value": "true", "carriers": [ "pojo" ] } ], "description": "Not used: the operations take their input from headers, such as the rule of putConfigRule in CamelAwsConfigRuleName, CamelAwsConfigRuleSource and CamelAwsConfigRuleSourceIdentifier, and the template of putConformancePack in CamelAwsConfigConformacePackTemplateBody. With pojoRequest=true the request of the AWS SDK for the operation, such as a Put [...] + "producerOut": { "carriers": [ "pojo" ], "description": "The response of the AWS SDK for the operation, such as the DescribeComplianceByConfigRuleResponse of describeRuleCompliance, or the PutConformancePackResponse with the ARN of the pack. putConfigRule, removeConfigRule and removeConformancePack give an empty response" } + }, "properties": { "label": { "index": 0, "kind": "path", "displayName": "Label", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws.config.AWSConfigConfiguration", "configurationField": "configuration", "description": "Logical name" }, "operation": { "index": 1, "kind": "parameter", "displayName": "Operation", "group": "producer", "label": "", "required": true, "type": "enum", "javaType": "org.apache.camel.component.aws.config.AWSConfigOperations", "enum": [ "putConfigRule", "removeConfigRule", "describeRuleCompliance", "putConformancePack", "removeConformancePack" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws.config.AWSConf [...] diff --git a/components/camel-aws/camel-aws-config/src/main/java/org/apache/camel/component/aws/config/AWSConfigEndpoint.java b/components/camel-aws/camel-aws-config/src/main/java/org/apache/camel/component/aws/config/AWSConfigEndpoint.java index 4bbb097c7c42..8ff6a102b545 100644 --- a/components/camel-aws/camel-aws-config/src/main/java/org/apache/camel/component/aws/config/AWSConfigEndpoint.java +++ b/components/camel-aws/camel-aws-config/src/main/java/org/apache/camel/component/aws/config/AWSConfigEndpoint.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.aws.config.client.AWSConfigClientFactory; +import org.apache.camel.spi.BodyType; +import org.apache.camel.spi.BodyType.Carrier; +import org.apache.camel.spi.BodyTypes; import org.apache.camel.spi.EndpointServiceLocation; import org.apache.camel.spi.UriEndpoint; import org.apache.camel.spi.UriParam; @@ -35,6 +38,19 @@ import software.amazon.awssdk.services.config.ConfigClient; @UriEndpoint(firstVersion = "4.3.0", scheme = "aws-config", title = "AWS Config Service", syntax = "aws-config:label", producerOnly = true, category = { Category.CLOUD, Category.MANAGEMENT }, headersClass = AWSConfigConstants.class) +@BodyTypes(producerIn = @BodyType(value = Carrier.ANY, + byOption = @BodyType.When(option = "pojoRequest", value = "true", carriers = Carrier.POJO), + description = "Not used: the operations take their input from headers, such as the rule of" + + " putConfigRule in CamelAwsConfigRuleName, CamelAwsConfigRuleSource and" + + " CamelAwsConfigRuleSourceIdentifier, and the template of putConformancePack" + + " in CamelAwsConfigConformacePackTemplateBody. With pojoRequest=true the" + + " request of the AWS SDK for the operation, such as a PutConfigRuleRequest:" + + " another body fails"), + producerOut = @BodyType(value = Carrier.POJO, + description = "The response of the AWS SDK for the operation, such as the" + + " DescribeComplianceByConfigRuleResponse of describeRuleCompliance, or the" + + " PutConformancePackResponse with the ARN of the pack. putConfigRule," + + " removeConfigRule and removeConformancePack give an empty response")) public class AWSConfigEndpoint extends DefaultEndpoint implements EndpointServiceLocation { private ConfigClient configClient; diff --git a/components/camel-aws/camel-aws-parameter-store/src/generated/resources/META-INF/org/apache/camel/component/aws/parameterstore/aws-parameter-store.json b/components/camel-aws/camel-aws-parameter-store/src/generated/resources/META-INF/org/apache/camel/component/aws/parameterstore/aws-parameter-store.json index ca3e6283d7c9..05ef7282d4e9 100644 --- a/components/camel-aws/camel-aws-parameter-store/src/generated/resources/META-INF/org/apache/camel/component/aws/parameterstore/aws-parameter-store.json +++ b/components/camel-aws/camel-aws-parameter-store/src/generated/resources/META-INF/org/apache/camel/component/aws/parameterstore/aws-parameter-store.json @@ -63,6 +63,10 @@ "CamelAwsParameterStoreKmsKeyId": { "index": 12, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The KMS Key ID to use for SecureString encryption.", "constantName": "org.apache.camel.component.aws.parameterstore.ParameterStoreConstants#KMS_KEY_ID" }, "CamelAwsParameterStoreTier": { "index": 13, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The tier for the parameter (Standard, Advanced, Intelligent-Tiering).", "constantName": "org.apache.camel.component.aws.parameterstore.ParameterStoreConstants#PARAMETER_TIER" } }, + "bodyTypes": { + "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": "pojoRequest", "value": "true", "carriers": [ "pojo" ] } ], "description": "Not used, except by putParameter when the CamelAwsParameterStoreValue header is not set: the value of the parameter as text. Bytes, a stream or a file are read as text, a Map or a POJO is stored as its toString(), so marshal it first, and no body fails. The other operations take their input from headers, such as CamelAwsParameterStoreName. With [...] + "producerOut": { "carriers": [ "pojo" ], "byOption": [ { "option": "operation", "value": "getParameter", "carriers": [ "text" ], "javaType": "java.lang.String" } ], "description": "The value of the parameter as text for getParameter, with its version in the CamelAwsParameterStoreVersion header: a SecureString is decrypted only when the CamelAwsParameterStoreWithDecryption header is true. The response of the AWS SDK for the other operations, such as the GetParametersResponse of getPar [...] + }, "properties": { "label": { "index": 0, "kind": "path", "displayName": "Label", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws.parameterstore.ParameterStoreConfiguration", "configurationField": "configuration", "description": "Logical name" }, "operation": { "index": 1, "kind": "parameter", "displayName": "Operation", "group": "producer", "label": "", "required": true, "type": "enum", "javaType": "org.apache.camel.component.aws.parameterstore.ParameterStoreOperations", "enum": [ "getParameter", "getParameters", "getParametersByPath", "putParameter", "deleteParameter", "deleteParameters", "describeParameters", "getParameterHistory" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configur [...] diff --git a/components/camel-aws/camel-aws-parameter-store/src/main/java/org/apache/camel/component/aws/parameterstore/ParameterStoreEndpoint.java b/components/camel-aws/camel-aws-parameter-store/src/main/java/org/apache/camel/component/aws/parameterstore/ParameterStoreEndpoint.java index 7f87915a4c85..63a63e4029e5 100644 --- a/components/camel-aws/camel-aws-parameter-store/src/main/java/org/apache/camel/component/aws/parameterstore/ParameterStoreEndpoint.java +++ b/components/camel-aws/camel-aws-parameter-store/src/main/java/org/apache/camel/component/aws/parameterstore/ParameterStoreEndpoint.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.aws.parameterstore.client.ParameterStoreClientFactory; +import org.apache.camel.spi.BodyType; +import org.apache.camel.spi.BodyType.Carrier; +import org.apache.camel.spi.BodyTypes; import org.apache.camel.spi.EndpointServiceLocation; import org.apache.camel.spi.UriEndpoint; import org.apache.camel.spi.UriParam; @@ -35,6 +38,24 @@ import software.amazon.awssdk.services.ssm.SsmClient; @UriEndpoint(firstVersion = "4.17.0", scheme = "aws-parameter-store", title = "AWS Parameter Store", syntax = "aws-parameter-store:label", producerOnly = true, category = { Category.CLOUD, Category.MANAGEMENT }, headersClass = ParameterStoreConstants.class) +@BodyTypes(producerIn = @BodyType(value = Carrier.ANY, + byOption = @BodyType.When(option = "pojoRequest", value = "true", carriers = Carrier.POJO), + description = "Not used, except by putParameter when the CamelAwsParameterStoreValue header" + + " is not set: the value of the parameter as text. Bytes, a stream or a file" + + " are read as text, a Map or a POJO is stored as its toString(), so marshal" + + " it first, and no body fails. The other operations take their input from" + + " headers, such as CamelAwsParameterStoreName. With pojoRequest=true the" + + " request of the AWS SDK for the operation, such as a GetParameterRequest:" + + " another body fails"), + producerOut = @BodyType(value = Carrier.POJO, + byOption = @BodyType.When(option = "operation", value = "getParameter", + carriers = Carrier.TEXT, + javaType = "java.lang.String"), + description = "The value of the parameter as text for getParameter, with its version in the" + + " CamelAwsParameterStoreVersion header: a SecureString is decrypted only" + + " when the CamelAwsParameterStoreWithDecryption header is true. The response" + + " of the AWS SDK for the other operations, such as the GetParametersResponse" + + " of getParameters, whose invalidParameters() lists the names not found")) public class ParameterStoreEndpoint extends ScheduledPollEndpoint implements EndpointServiceLocation { private SsmClient ssmClient; diff --git a/components/camel-aws/camel-aws-security-hub/src/generated/resources/META-INF/org/apache/camel/component/aws/securityhub/aws-security-hub.json b/components/camel-aws/camel-aws-security-hub/src/generated/resources/META-INF/org/apache/camel/component/aws/securityhub/aws-security-hub.json index c550f5a64599..46894fe3a2ce 100644 --- a/components/camel-aws/camel-aws-security-hub/src/generated/resources/META-INF/org/apache/camel/component/aws/securityhub/aws-security-hub.json +++ b/components/camel-aws/camel-aws-security-hub/src/generated/resources/META-INF/org/apache/camel/component/aws/securityhub/aws-security-hub.json @@ -71,6 +71,10 @@ "CamelAwsSecurityHubProductArn": { "index": 20, "kind": "header", "displayName": "", "group": "getFindingHistory", "label": "getFindingHistory", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The product ARN for the finding", "constantName": "org.apache.camel.component.aws.securityhub.SecurityHubConstants#PRODUCT_ARN" }, "CamelAwsSecurityHubFindingAggregatorArn": { "index": 21, "kind": "header", "displayName": "", "group": "getFindingAggregator", "label": "getFindingAggregator", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The ARN of the finding aggregator to retrieve", "constantName": "org.apache.camel.component.aws.securityhub.SecurityHubConstants#FINDING_AGGREGATOR_ARN" } }, + "bodyTypes": { + "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": "pojoRequest", "value": "true", "carriers": [ "pojo" ] } ], "description": "batchImportFindings, the default, imports the findings of the CamelAwsSecurityHubFindings header, or else of the body: a List of the AwsSecurityFinding of the AWS SDK, or one AwsSecurityFinding. JSON text, a Map, an array or a List of anything else fails. The other operations take their input from headers, such as CamelAwsSecurityHubFilters. Wit [...] + "producerOut": { "carriers": [ "pojo" ], "description": "The response of the AWS SDK for the operation, such as the BatchImportFindingsResponse of batchImportFindings, with the counts in the CamelAwsSecurityHubSuccessCount and CamelAwsSecurityHubFailedCount headers: a finding that is not imported does not fail the exchange. getFindings gives a GetFindingsResponse, with the token of the next page in the CamelAwsSecurityHubNextToken header" } + }, "properties": { "label": { "index": 0, "kind": "path", "displayName": "Label", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Logical name" }, "operation": { "index": 1, "kind": "parameter", "displayName": "Operation", "group": "producer", "label": "", "required": true, "type": "enum", "javaType": "org.apache.camel.component.aws.securityhub.SecurityHubOperations", "enum": [ "batchImportFindings", "getFindings", "batchUpdateFindings", "getFindingHistory", "describeHub", "listEnabledProductsForImport", "getFindingAggregator" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": "b [...] diff --git a/components/camel-aws/camel-aws-security-hub/src/main/java/org/apache/camel/component/aws/securityhub/SecurityHubEndpoint.java b/components/camel-aws/camel-aws-security-hub/src/main/java/org/apache/camel/component/aws/securityhub/SecurityHubEndpoint.java index 679a76f0378d..24e57b222aea 100644 --- a/components/camel-aws/camel-aws-security-hub/src/main/java/org/apache/camel/component/aws/securityhub/SecurityHubEndpoint.java +++ b/components/camel-aws/camel-aws-security-hub/src/main/java/org/apache/camel/component/aws/securityhub/SecurityHubEndpoint.java @@ -24,6 +24,9 @@ import org.apache.camel.Consumer; import org.apache.camel.Processor; import org.apache.camel.Producer; import org.apache.camel.component.aws.securityhub.client.SecurityHubClientFactory; +import org.apache.camel.spi.BodyType; +import org.apache.camel.spi.BodyType.Carrier; +import org.apache.camel.spi.BodyTypes; import org.apache.camel.spi.EndpointServiceLocation; import org.apache.camel.spi.Metadata; import org.apache.camel.spi.UriEndpoint; @@ -41,6 +44,22 @@ import software.amazon.awssdk.services.securityhub.SecurityHubClient; Category.CLOUD, Category.SECURITY }, headersClass = SecurityHubConstants.class) +@BodyTypes(producerIn = @BodyType(value = Carrier.ANY, + byOption = @BodyType.When(option = "pojoRequest", value = "true", carriers = Carrier.POJO), + description = "batchImportFindings, the default, imports the findings of the" + + " CamelAwsSecurityHubFindings header, or else of the body: a List of the" + + " AwsSecurityFinding of the AWS SDK, or one AwsSecurityFinding. JSON text, a" + + " Map, an array or a List of anything else fails. The other operations take" + + " their input from headers, such as CamelAwsSecurityHubFilters. With" + + " pojoRequest=true the request of the AWS SDK for the operation, such as a" + + " GetFindingsRequest: another body fails"), + producerOut = @BodyType(value = Carrier.POJO, + description = "The response of the AWS SDK for the operation, such as the" + + " BatchImportFindingsResponse of batchImportFindings, with the counts in the" + + " CamelAwsSecurityHubSuccessCount and CamelAwsSecurityHubFailedCount" + + " headers: a finding that is not imported does not fail the exchange." + + " getFindings gives a GetFindingsResponse, with the token of the next page" + + " in the CamelAwsSecurityHubNextToken header")) public class SecurityHubEndpoint extends DefaultEndpoint implements EndpointServiceLocation { private SecurityHubClient securityHubClient; diff --git a/components/camel-aws/camel-aws2-athena/src/generated/resources/META-INF/org/apache/camel/component/aws2/athena/aws2-athena.json b/components/camel-aws/camel-aws2-athena/src/generated/resources/META-INF/org/apache/camel/component/aws2/athena/aws2-athena.json index bc651c82adb4..57ed65b66f76 100644 --- a/components/camel-aws/camel-aws2-athena/src/generated/resources/META-INF/org/apache/camel/component/aws2/athena/aws2-athena.json +++ b/components/camel-aws/camel-aws2-athena/src/generated/resources/META-INF/org/apache/camel/component/aws2/athena/aws2-athena.json @@ -89,6 +89,10 @@ "CamelAwsAthenaStartQueryExecutionAttempts": { "index": 21, "kind": "header", "displayName": "", "group": "startQueryExecution", "label": "startQueryExecution", "required": false, "javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Total number of attempts made to run the query. Will be greater than 1 if the query is retried.", "constantName": "org.apache.camel.component.aws2.athena.Athena2Constants#START_QUERY_EXECUTION [...] "CamelAwsAthenaStartQueryExecutionElapsedMillis": { "index": 22, "kind": "header", "displayName": "", "group": "startQueryExecution", "label": "startQueryExecution", "required": false, "javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Total time in millis taken in startQueryExecution (mostly relevant when waiting for query completion within startQueryExecution).", "constantName": "org.apache.camel.component.aws2.athen [...] }, + "bodyTypes": { + "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": "operation", "value": "startQueryExecution", "carriers": [ "text", "bytes", "stream", "file", "null" ] } ], "description": "The SQL of startQueryExecution, the default, as text: bytes, a stream or a file are read as text, a Map or a POJO is sent as its toString(). With no body the SQL comes from the CamelAwsAthenaQueryString header or the queryString option. The other operations do not use the body: they take the id of [...] + "producerOut": { "carriers": [ "pojo" ], "byOption": [ { "option": "operation", "value": "startQueryExecution", "carriers": [ "null", "pojo" ] }, { "option": "operation", "value": "getQueryResults", "carriers": [ "iterator", "pojo", "text" ] } ], "description": "startQueryExecution, the default, leaves no body, with the id of the query in the CamelAwsAthenaQueryExecutionId header; with waitTimeout, the GetQueryExecutionResponse of the AWS SDK of the last check, whatever the state of [...] + }, "properties": { "label": { "index": 0, "kind": "path", "displayName": "Label", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.athena.Athena2Configuration", "configurationField": "configuration", "description": "Logical name" }, "database": { "index": 1, "kind": "parameter", "displayName": "Database", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.athena.Athena2Configuration", "configurationField": "configuration", "description": "The Athena database to use." }, diff --git a/components/camel-aws/camel-aws2-athena/src/main/docs/aws2-athena-component.adoc b/components/camel-aws/camel-aws2-athena/src/main/docs/aws2-athena-component.adoc index 2c701f18bfb7..69337622a404 100644 --- a/components/camel-aws/camel-aws2-athena/src/main/docs/aws2-athena-component.adoc +++ b/components/camel-aws/camel-aws2-athena/src/main/docs/aws2-athena-component.adoc @@ -341,8 +341,10 @@ YAML:: ---- ==== -The preceding example will yield an -https://docs.aws.amazon.com/athena/latest/APIReference/API_QueryExecution.html[Athena QueryExecution] in the body. +The preceding example will yield a +https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/athena/model/GetQueryExecutionResponse.html[GetQueryExecutionResponse] +in the body, whose `queryExecution()` is the +https://docs.aws.amazon.com/athena/latest/APIReference/API_QueryExecution.html[Athena QueryExecution]. The getQueryExecution operation also supports retrieving the query execution ID from a header (`CamelAwsAthenaQueryExecutionId`), and since startQueryExecution sets the same header, upon starting a query, @@ -400,7 +402,7 @@ YAML:: ---- ==== -The preceding example will yield an Athena QueryExecution in the body for the query that was just started. +The preceding example will yield a GetQueryExecutionResponse in the body for the query that was just started. - getQueryResults: this operation returns the results of a query that has succeeded. The results are returned in the body in one of three formats. @@ -489,7 +491,7 @@ from("direct:start") The preceding example will print the results of the query as CSV to the console. `SelectList` - returns a -https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/athena/model/GetQueryResultsResponse.html[GetQueryResponse] +https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/athena/model/GetQueryResultsResponse.html[GetQueryResultsResponse] in the body containing at most 1,000 rows, plus the NextToken value as a header (`CamelAwsAthenaNextToken`), which can be used for manual pagination of results: @@ -548,11 +550,11 @@ YAML:: ==== The preceding example will return a -https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/athena/model/GetQueryResultsResponse.html[GetQueryResponse] +https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/athena/model/GetQueryResultsResponse.html[GetQueryResultsResponse] in the body plus the NextToken value as a header (`CamelAwsAthenaNextToken`), which can be used to manually page through the results 1,000 rows at a time. -`S3Pointer` - return an S3 path (e.g. `s3://bucket/path/`) pointing to the results: +`S3Pointer` - returns the S3 location of the results of the query as text: [tabs] ==== @@ -608,9 +610,8 @@ YAML:: ---- ==== -The preceding example will return an -S3 path (e.g. `s3://bucket/path/`) in the body pointing to the results. The path will also be set in a header -(`CamelAwsAthenaOutputLocation`). +The preceding example will return the S3 location of the results of the query as text in the body. +The location will also be set in a header (`CamelAwsAthenaOutputLocation`). - listQueryExecutions: this operation returns a list of query execution IDs @@ -653,8 +654,9 @@ YAML:: ---- ==== -The preceding example will return a list of query executions in the body, plus the NextToken value as a -header (`CamelAwsAthenaNextToken`) than can be used for manual pagination of results. +The preceding example will return a ListQueryExecutionsResponse in the body, whose `queryExecutionIds()` lists the +ids of the query executions, plus the NextToken value as a header (`CamelAwsAthenaNextToken`) that can be used for +manual pagination of results. - startQueryExecution: this operation starts the execution of a query. It supports waiting for the query to complete before proceeding, and retrying the query based on a set of configurable failure conditions: @@ -707,7 +709,8 @@ YAML:: The preceding example will start the query `SELECT 1` and configure the results to be saved to `s3://bucket/path/`, but will not wait for the query -to complete. +to complete. The body is then empty, and the id of the query is in the +`CamelAwsAthenaQueryExecutionId` header. [tabs] ==== @@ -759,6 +762,9 @@ YAML:: The preceding example will start a query and wait up to 60 seconds for it to reach a status that indicates it is complete (one of SUCCEEDED, FAILED, CANCELLED, or UNKNOWN_TO_SDK_VERSION). Upon failure, the query would not be retried. +The body is then the GetQueryExecutionResponse of the last check: a query that fails, or +still runs after the wait, does not fail the exchange, so check the state of the query in the +`CamelAwsAthenaQueryExecutionState` header. [tabs] ==== diff --git a/components/camel-aws/camel-aws2-athena/src/main/java/org/apache/camel/component/aws2/athena/Athena2Endpoint.java b/components/camel-aws/camel-aws2-athena/src/main/java/org/apache/camel/component/aws2/athena/Athena2Endpoint.java index 86e00791af64..e7fff36bac8a 100644 --- a/components/camel-aws/camel-aws2-athena/src/main/java/org/apache/camel/component/aws2/athena/Athena2Endpoint.java +++ b/components/camel-aws/camel-aws2-athena/src/main/java/org/apache/camel/component/aws2/athena/Athena2Endpoint.java @@ -24,6 +24,9 @@ import org.apache.camel.Consumer; import org.apache.camel.Processor; import org.apache.camel.Producer; import org.apache.camel.component.aws2.athena.client.Athena2ClientFactory; +import org.apache.camel.spi.BodyType; +import org.apache.camel.spi.BodyType.Carrier; +import org.apache.camel.spi.BodyTypes; import org.apache.camel.spi.EndpointServiceLocation; import org.apache.camel.spi.UriEndpoint; import org.apache.camel.spi.UriParam; @@ -36,6 +39,30 @@ import software.amazon.awssdk.services.athena.AthenaClient; */ @UriEndpoint(firstVersion = "3.4.0", scheme = "aws2-athena", title = "AWS Athena", syntax = "aws2-athena:label", producerOnly = true, category = { Category.CLOUD, Category.DATABASE }, headersClass = Athena2Constants.class) +@BodyTypes(producerIn = @BodyType(value = Carrier.ANY, + byOption = @BodyType.When(option = "operation", value = "startQueryExecution", carriers = { + Carrier.TEXT, Carrier.BYTES, Carrier.STREAM, Carrier.FILE, Carrier.NULL }), + description = "The SQL of startQueryExecution, the default, as text: bytes, a stream or a" + + " file are read as text, a Map or a POJO is sent as its toString(). With no" + + " body the SQL comes from the CamelAwsAthenaQueryString header or the" + + " queryString option. The other operations do not use the body: they take the" + + " id of the query from the CamelAwsAthenaQueryExecutionId header, which" + + " startQueryExecution sets"), + producerOut = @BodyType(value = Carrier.POJO, + byOption = { + @BodyType.When(option = "operation", value = "startQueryExecution", + carriers = { Carrier.NULL, Carrier.POJO }), + @BodyType.When(option = "operation", value = "getQueryResults", + carriers = { Carrier.ITERATOR, Carrier.POJO, Carrier.TEXT }) }, + description = "startQueryExecution, the default, leaves no body, with the id of the query in" + + " the CamelAwsAthenaQueryExecutionId header; with waitTimeout, the" + + " GetQueryExecutionResponse of the AWS SDK of the last check, whatever the" + + " state of the query. getQueryResults gives by outputType: for StreamList," + + " the default, a GetQueryResultsIterable of the pages of rows, which calls" + + " Athena when it is read, such as by a split; for SelectList one page as a" + + " GetQueryResultsResponse; for S3Pointer the S3 location of the results as" + + " text. getQueryExecution and listQueryExecutions give the response of the" + + " AWS SDK")) public class Athena2Endpoint extends DefaultEndpoint implements EndpointServiceLocation { private AthenaClient athenaClient; diff --git a/components/camel-aws/camel-aws2-ecs/src/generated/resources/META-INF/org/apache/camel/component/aws2/ecs/aws2-ecs.json b/components/camel-aws/camel-aws2-ecs/src/generated/resources/META-INF/org/apache/camel/component/aws2/ecs/aws2-ecs.json index 1078e8b06d89..a0bffdbfb326 100644 --- a/components/camel-aws/camel-aws2-ecs/src/generated/resources/META-INF/org/apache/camel/component/aws2/ecs/aws2-ecs.json +++ b/components/camel-aws/camel-aws2-ecs/src/generated/resources/META-INF/org/apache/camel/component/aws2/ecs/aws2-ecs.json @@ -55,6 +55,10 @@ "CamelAwsECSIsTruncated": { "index": 4, "kind": "header", "displayName": "", "group": "listClusters", "label": "listClusters", "required": false, "javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Whether the response has more results (is truncated).", "constantName": "org.apache.camel.component.aws2.ecs.ECS2Constants#IS_TRUNCATED" }, "CamelAwsECSClusterArn": { "index": 5, "kind": "header", "displayName": "", "group": "createCluster describeCluster deleteCluster", "label": "createCluster describeCluster deleteCluster", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The ARN of the cluster.", "constantName": "org.apache.camel.component.aws2.ecs.ECS2Constants#CLUSTER_ARN" } }, + "bodyTypes": { + "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": "pojoRequest", "value": "true", "carriers": [ "pojo" ] } ], "description": "Not used: the operations take their input from headers, such as the name of the cluster in CamelAwsECSClusterName. With pojoRequest=true the request of the AWS SDK for the operation, such as a ListClustersRequest: another body fails" }, + "producerOut": { "carriers": [ "pojo" ], "description": "The response of the AWS SDK for the operation, such as the ListClustersResponse of listClusters, with the token of the next page in a header. describeCluster of a cluster that does not exist does not fail: the response lists it in its failures" } + }, "properties": { "label": { "index": 0, "kind": "path", "displayName": "Label", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.ecs.ECS2Configuration", "configurationField": "configuration", "description": "Logical name" }, "operation": { "index": 1, "kind": "parameter", "displayName": "Operation", "group": "producer", "label": "", "required": true, "type": "enum", "javaType": "org.apache.camel.component.aws2.ecs.ECS2Operations", "enum": [ "listClusters", "describeCluster", "createCluster", "deleteCluster" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.ecs.ECS2Configuration", "configurationField": "configuration" [...] diff --git a/components/camel-aws/camel-aws2-ecs/src/main/java/org/apache/camel/component/aws2/ecs/ECS2Endpoint.java b/components/camel-aws/camel-aws2-ecs/src/main/java/org/apache/camel/component/aws2/ecs/ECS2Endpoint.java index 285f629d1a41..23f15686e661 100644 --- a/components/camel-aws/camel-aws2-ecs/src/main/java/org/apache/camel/component/aws2/ecs/ECS2Endpoint.java +++ b/components/camel-aws/camel-aws2-ecs/src/main/java/org/apache/camel/component/aws2/ecs/ECS2Endpoint.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.aws2.ecs.client.ECS2ClientFactory; +import org.apache.camel.spi.BodyType; +import org.apache.camel.spi.BodyType.Carrier; +import org.apache.camel.spi.BodyTypes; import org.apache.camel.spi.EndpointServiceLocation; import org.apache.camel.spi.UriEndpoint; import org.apache.camel.spi.UriParam; @@ -35,6 +38,17 @@ import software.amazon.awssdk.services.ecs.EcsClient; @UriEndpoint(firstVersion = "3.1.0", scheme = "aws2-ecs", title = "AWS Elastic Container Service (ECS)", syntax = "aws2-ecs:label", producerOnly = true, category = { Category.CLOUD, Category.MANAGEMENT }, headersClass = ECS2Constants.class) +@BodyTypes(producerIn = @BodyType(value = Carrier.ANY, + byOption = @BodyType.When(option = "pojoRequest", value = "true", carriers = Carrier.POJO), + description = "Not used: the operations take their input from headers, such as the name of" + + " the cluster in CamelAwsECSClusterName. With pojoRequest=true the request of" + + " the AWS SDK for the operation, such as a ListClustersRequest: another body" + + " fails"), + producerOut = @BodyType(value = Carrier.POJO, + description = "The response of the AWS SDK for the operation, such as the" + + " ListClustersResponse of listClusters, with the token of the next page in a" + + " header. describeCluster of a cluster that does not exist does not fail:" + + " the response lists it in its failures")) public class ECS2Endpoint extends ScheduledPollEndpoint implements EndpointServiceLocation { private EcsClient ecsClient; diff --git a/components/camel-aws/camel-aws2-eks/src/generated/resources/META-INF/org/apache/camel/component/aws2/eks/aws2-eks.json b/components/camel-aws/camel-aws2-eks/src/generated/resources/META-INF/org/apache/camel/component/aws2/eks/aws2-eks.json index b43403c1ba00..3cca2693328d 100644 --- a/components/camel-aws/camel-aws2-eks/src/generated/resources/META-INF/org/apache/camel/component/aws2/eks/aws2-eks.json +++ b/components/camel-aws/camel-aws2-eks/src/generated/resources/META-INF/org/apache/camel/component/aws2/eks/aws2-eks.json @@ -58,6 +58,10 @@ "CamelAwsEKSIsTruncated": { "index": 7, "kind": "header", "displayName": "", "group": "listClusters", "label": "listClusters", "required": false, "javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Whether the response has more results (is truncated).", "constantName": "org.apache.camel.component.aws2.eks.EKS2Constants#IS_TRUNCATED" }, "CamelAwsEKSClusterArn": { "index": 8, "kind": "header", "displayName": "", "group": "createCluster describeCluster deleteCluster", "label": "createCluster describeCluster deleteCluster", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The ARN of the cluster.", "constantName": "org.apache.camel.component.aws2.eks.EKS2Constants#CLUSTER_ARN" } }, + "bodyTypes": { + "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": "pojoRequest", "value": "true", "carriers": [ "pojo" ] } ], "description": "Not used: the operations take their input from headers, such as the name of the cluster in CamelAwsEKSClusterName. With pojoRequest=true the request of the AWS SDK for the operation, such as a ListClustersRequest: another body fails" }, + "producerOut": { "carriers": [ "pojo" ], "description": "The response of the AWS SDK for the operation, such as the ListClustersResponse of listClusters, with the token of the next page in a header" } + }, "properties": { "label": { "index": 0, "kind": "path", "displayName": "Label", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.eks.EKS2Configuration", "configurationField": "configuration", "description": "Logical name" }, "operation": { "index": 1, "kind": "parameter", "displayName": "Operation", "group": "producer", "label": "", "required": true, "type": "enum", "javaType": "org.apache.camel.component.aws2.eks.EKS2Operations", "enum": [ "listClusters", "describeCluster", "createCluster", "deleteCluster" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.eks.EKS2Configuration", "configurationField": "configuration" [...] diff --git a/components/camel-aws/camel-aws2-eks/src/main/java/org/apache/camel/component/aws2/eks/EKS2Endpoint.java b/components/camel-aws/camel-aws2-eks/src/main/java/org/apache/camel/component/aws2/eks/EKS2Endpoint.java index 184c7290f94f..8dec2adb6a20 100644 --- a/components/camel-aws/camel-aws2-eks/src/main/java/org/apache/camel/component/aws2/eks/EKS2Endpoint.java +++ b/components/camel-aws/camel-aws2-eks/src/main/java/org/apache/camel/component/aws2/eks/EKS2Endpoint.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.aws2.eks.client.EKS2ClientFactory; +import org.apache.camel.spi.BodyType; +import org.apache.camel.spi.BodyType.Carrier; +import org.apache.camel.spi.BodyTypes; import org.apache.camel.spi.EndpointServiceLocation; import org.apache.camel.spi.UriEndpoint; import org.apache.camel.spi.UriParam; @@ -35,6 +38,16 @@ import software.amazon.awssdk.services.eks.EksClient; @UriEndpoint(firstVersion = "3.1.0", scheme = "aws2-eks", title = "AWS Elastic Kubernetes Service (EKS)", syntax = "aws2-eks:label", producerOnly = true, category = { Category.CLOUD, Category.MANAGEMENT }, headersClass = EKS2Constants.class) +@BodyTypes(producerIn = @BodyType(value = Carrier.ANY, + byOption = @BodyType.When(option = "pojoRequest", value = "true", carriers = Carrier.POJO), + description = "Not used: the operations take their input from headers, such as the name of" + + " the cluster in CamelAwsEKSClusterName. With pojoRequest=true the request of" + + " the AWS SDK for the operation, such as a ListClustersRequest: another body" + + " fails"), + producerOut = @BodyType(value = Carrier.POJO, + description = "The response of the AWS SDK for the operation, such as the" + + " ListClustersResponse of listClusters, with the token of the next page in a" + + " header")) public class EKS2Endpoint extends ScheduledPollEndpoint implements EndpointServiceLocation { private EksClient eksClient; diff --git a/components/camel-aws/camel-aws2-mq/src/generated/resources/META-INF/org/apache/camel/component/aws2/mq/aws2-mq.json b/components/camel-aws/camel-aws2-mq/src/generated/resources/META-INF/org/apache/camel/component/aws2/mq/aws2-mq.json index a100694868ff..fe992fd16870 100644 --- a/components/camel-aws/camel-aws2-mq/src/generated/resources/META-INF/org/apache/camel/component/aws2/mq/aws2-mq.json +++ b/components/camel-aws/camel-aws2-mq/src/generated/resources/META-INF/org/apache/camel/component/aws2/mq/aws2-mq.json @@ -64,6 +64,10 @@ "CamelAwsMQBrokerArn": { "index": 13, "kind": "header", "displayName": "", "group": "createBroker", "label": "createBroker", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Amazon Resource Name (ARN) of the broker.", "constantName": "org.apache.camel.component.aws2.mq.MQ2Constants#BROKER_ARN" }, "CamelAwsMQBrokerState": { "index": 14, "kind": "header", "displayName": "", "group": "describeBroker", "label": "describeBroker", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The state of the broker.", "constantName": "org.apache.camel.component.aws2.mq.MQ2Constants#BROKER_STATE" } }, + "bodyTypes": { + "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": "pojoRequest", "value": "true", "carriers": [ "pojo" ] } ], "description": "Not used: the operations take their input from headers, such as the id of the broker in CamelAwsMQBrokerID, and the users of createBroker as a List of the User of the AWS SDK. With pojoRequest=true the request of the AWS SDK for the operation, such as a ListBrokersRequest: another body fails" }, + "producerOut": { "carriers": [ "pojo" ], "description": "The response of the AWS SDK for the operation, such as the ListBrokersResponse of listBrokers, with the token of the next page in a header" } + }, "properties": { "label": { "index": 0, "kind": "path", "displayName": "Label", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.mq.MQ2Configuration", "configurationField": "configuration", "description": "Logical name" }, "operation": { "index": 1, "kind": "parameter", "displayName": "Operation", "group": "producer", "label": "", "required": true, "type": "enum", "javaType": "org.apache.camel.component.aws2.mq.MQ2Operations", "enum": [ "listBrokers", "createBroker", "deleteBroker", "rebootBroker", "updateBroker", "describeBroker" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.mq.MQ2Configuration", "configuratio [...] diff --git a/components/camel-aws/camel-aws2-mq/src/main/java/org/apache/camel/component/aws2/mq/MQ2Endpoint.java b/components/camel-aws/camel-aws2-mq/src/main/java/org/apache/camel/component/aws2/mq/MQ2Endpoint.java index 76267f10158d..26961e13d129 100644 --- a/components/camel-aws/camel-aws2-mq/src/main/java/org/apache/camel/component/aws2/mq/MQ2Endpoint.java +++ b/components/camel-aws/camel-aws2-mq/src/main/java/org/apache/camel/component/aws2/mq/MQ2Endpoint.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.aws2.mq.client.MQ2ClientFactory; +import org.apache.camel.spi.BodyType; +import org.apache.camel.spi.BodyType.Carrier; +import org.apache.camel.spi.BodyTypes; import org.apache.camel.spi.EndpointServiceLocation; import org.apache.camel.spi.UriEndpoint; import org.apache.camel.spi.UriParam; @@ -34,6 +37,16 @@ import software.amazon.awssdk.services.mq.MqClient; */ @UriEndpoint(firstVersion = "3.1.0", scheme = "aws2-mq", title = "AWS MQ", syntax = "aws2-mq:label", producerOnly = true, category = { Category.CLOUD, Category.MESSAGING }, headersClass = MQ2Constants.class) +@BodyTypes(producerIn = @BodyType(value = Carrier.ANY, + byOption = @BodyType.When(option = "pojoRequest", value = "true", carriers = Carrier.POJO), + description = "Not used: the operations take their input from headers, such as the id of the" + + " broker in CamelAwsMQBrokerID, and the users of createBroker as a List of" + + " the User of the AWS SDK. With pojoRequest=true the request of the AWS SDK" + + " for the operation, such as a ListBrokersRequest: another body fails"), + producerOut = @BodyType(value = Carrier.POJO, + description = "The response of the AWS SDK for the operation, such as the" + + " ListBrokersResponse of listBrokers, with the token of the next page in a" + + " header")) public class MQ2Endpoint extends ScheduledPollEndpoint implements EndpointServiceLocation { private MqClient mqClient; diff --git a/components/camel-aws/camel-aws2-msk/src/generated/resources/META-INF/org/apache/camel/component/aws2/msk/aws2-msk.json b/components/camel-aws/camel-aws2-msk/src/generated/resources/META-INF/org/apache/camel/component/aws2/msk/aws2-msk.json index 42f2250df7fa..12ece07f27ef 100644 --- a/components/camel-aws/camel-aws2-msk/src/generated/resources/META-INF/org/apache/camel/component/aws2/msk/aws2-msk.json +++ b/components/camel-aws/camel-aws2-msk/src/generated/resources/META-INF/org/apache/camel/component/aws2/msk/aws2-msk.json @@ -60,6 +60,10 @@ "CamelAwsMSKIsTruncated": { "index": 9, "kind": "header", "displayName": "", "group": "listClusters", "label": "listClusters", "required": false, "javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Whether the response has more results (is truncated).", "constantName": "org.apache.camel.component.aws2.msk.MSK2Constants#IS_TRUNCATED" }, "CamelAwsMSKClusterState": { "index": 10, "kind": "header", "displayName": "", "group": "createCluster describeCluster", "label": "createCluster describeCluster", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The state of the cluster.", "constantName": "org.apache.camel.component.aws2.msk.MSK2Constants#CLUSTER_STATE" } }, + "bodyTypes": { + "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": "pojoRequest", "value": "true", "carriers": [ "pojo" ] } ], "description": "Not used: the operations take their input from headers, such as the ARN of the cluster in CamelAwsMSKClusterArn. With pojoRequest=true the request of the AWS SDK for the operation, such as a ListClustersRequest: another body fails" }, + "producerOut": { "carriers": [ "pojo" ], "description": "The response of the AWS SDK for the operation, such as the ListClustersResponse of listClusters, with the token of the next page in a header" } + }, "properties": { "label": { "index": 0, "kind": "path", "displayName": "Label", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.msk.MSK2Configuration", "configurationField": "configuration", "description": "Logical name" }, "operation": { "index": 1, "kind": "parameter", "displayName": "Operation", "group": "producer", "label": "", "required": true, "type": "enum", "javaType": "org.apache.camel.component.aws2.msk.MSK2Operations", "enum": [ "listClusters", "createCluster", "deleteCluster", "describeCluster" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.msk.MSK2Configuration", "configurationField": "configuration" [...] diff --git a/components/camel-aws/camel-aws2-msk/src/main/java/org/apache/camel/component/aws2/msk/MSK2Endpoint.java b/components/camel-aws/camel-aws2-msk/src/main/java/org/apache/camel/component/aws2/msk/MSK2Endpoint.java index 2eaff93e3b84..686a15e16aee 100644 --- a/components/camel-aws/camel-aws2-msk/src/main/java/org/apache/camel/component/aws2/msk/MSK2Endpoint.java +++ b/components/camel-aws/camel-aws2-msk/src/main/java/org/apache/camel/component/aws2/msk/MSK2Endpoint.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.aws2.msk.client.MSK2ClientFactory; +import org.apache.camel.spi.BodyType; +import org.apache.camel.spi.BodyType.Carrier; +import org.apache.camel.spi.BodyTypes; import org.apache.camel.spi.EndpointServiceLocation; import org.apache.camel.spi.UriEndpoint; import org.apache.camel.spi.UriParam; @@ -35,6 +38,16 @@ import software.amazon.awssdk.services.kafka.KafkaClient; @UriEndpoint(firstVersion = "3.1.0", scheme = "aws2-msk", title = "AWS Managed Streaming for Apache Kafka (MSK)", syntax = "aws2-msk:label", producerOnly = true, category = { Category.CLOUD, Category.MANAGEMENT }, headersClass = MSK2Constants.class) +@BodyTypes(producerIn = @BodyType(value = Carrier.ANY, + byOption = @BodyType.When(option = "pojoRequest", value = "true", carriers = Carrier.POJO), + description = "Not used: the operations take their input from headers, such as the ARN of the" + + " cluster in CamelAwsMSKClusterArn. With pojoRequest=true the request of the" + + " AWS SDK for the operation, such as a ListClustersRequest: another body" + + " fails"), + producerOut = @BodyType(value = Carrier.POJO, + description = "The response of the AWS SDK for the operation, such as the" + + " ListClustersResponse of listClusters, with the token of the next page in a" + + " header")) public class MSK2Endpoint extends ScheduledPollEndpoint implements EndpointServiceLocation { private KafkaClient mskClient; diff --git a/components/camel-aws/camel-aws2-redshift/src/generated/resources/META-INF/org/apache/camel/component/aws2/redshift/data/aws2-redshift-data.json b/components/camel-aws/camel-aws2-redshift/src/generated/resources/META-INF/org/apache/camel/component/aws2/redshift/data/aws2-redshift-data.json index 7db6bb872123..7175a5841d2f 100644 --- a/components/camel-aws/camel-aws2-redshift/src/generated/resources/META-INF/org/apache/camel/component/aws2/redshift/data/aws2-redshift-data.json +++ b/components/camel-aws/camel-aws2-redshift/src/generated/resources/META-INF/org/apache/camel/component/aws2/redshift/data/aws2-redshift-data.json @@ -74,6 +74,10 @@ "CamelAwsRedshiftDataSqlParameterList": { "index": 23, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "List<SqlParameterList>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The parameters for the SQL statement.", "constantName": "org.apache.camel.component.aws2.redshift.data.RedshiftData2Constants#SQL_PARAMETER_LIST" }, "CamelAwsRedshiftDataSqlStatementList": { "index": 24, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "List", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The List of SQL statements text to run.", "constantName": "org.apache.camel.component.aws2.redshift.data.RedshiftData2Constants#SQL_STATEMENT_LIST" } }, + "bodyTypes": { + "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": "pojoRequest", "value": "true", "carriers": [ "pojo" ] } ], "description": "Not used: the operations take their input from headers, such as the SQL of executeStatement in CamelAwsRedshiftDataSqlStatement; SQL in the body is not run. With pojoRequest=true the request of the AWS SDK for the operation, such as an ExecuteStatementRequest: another body fails" }, + "producerOut": { "carriers": [ "pojo" ], "description": "The response of the AWS SDK for the operation, such as the ExecuteStatementResponse of executeStatement, which does not wait for the statement, or the GetStatementResultResponse of getStatementResult with one page of records" } + }, "properties": { "label": { "index": 0, "kind": "path", "displayName": "Label", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.redshift.data.RedshiftData2Configuration", "configurationField": "configuration", "description": "Logical name" }, "operation": { "index": 1, "kind": "parameter", "displayName": "Operation", "group": "producer", "label": "", "required": true, "type": "enum", "javaType": "org.apache.camel.component.aws2.redshift.data.RedshiftData2Operations", "enum": [ "listDatabases", "listSchemas", "listStatements", "listTables", "describeTable", "executeStatement", "batchExecuteStatement", "cancelStatement", "describeStatement", "getStatementResult" ], "deprecated": false, "deprecationNote": "", "autowired": fa [...] diff --git a/components/camel-aws/camel-aws2-redshift/src/main/java/org/apache/camel/component/aws2/redshift/data/RedshiftData2Endpoint.java b/components/camel-aws/camel-aws2-redshift/src/main/java/org/apache/camel/component/aws2/redshift/data/RedshiftData2Endpoint.java index 3ba18b0fc3aa..d1079c4bd61f 100644 --- a/components/camel-aws/camel-aws2-redshift/src/main/java/org/apache/camel/component/aws2/redshift/data/RedshiftData2Endpoint.java +++ b/components/camel-aws/camel-aws2-redshift/src/main/java/org/apache/camel/component/aws2/redshift/data/RedshiftData2Endpoint.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.aws2.redshift.data.client.RedshiftData2ClientFactory; +import org.apache.camel.spi.BodyType; +import org.apache.camel.spi.BodyType.Carrier; +import org.apache.camel.spi.BodyTypes; import org.apache.camel.spi.EndpointServiceLocation; import org.apache.camel.spi.UriEndpoint; import org.apache.camel.spi.UriParam; @@ -38,6 +41,17 @@ import software.amazon.awssdk.services.redshiftdata.RedshiftDataClient; Category.CLOUD, Category.SERVERLESS, Category.DATABASE, Category.BIGDATA }, headersClass = RedshiftData2Constants.class) +@BodyTypes(producerIn = @BodyType(value = Carrier.ANY, + byOption = @BodyType.When(option = "pojoRequest", value = "true", carriers = Carrier.POJO), + description = "Not used: the operations take their input from headers, such as the SQL of" + + " executeStatement in CamelAwsRedshiftDataSqlStatement; SQL in the body is" + + " not run. With pojoRequest=true the request of the AWS SDK for the" + + " operation, such as an ExecuteStatementRequest: another body fails"), + producerOut = @BodyType(value = Carrier.POJO, + description = "The response of the AWS SDK for the operation, such as the" + + " ExecuteStatementResponse of executeStatement, which does not wait for the" + + " statement, or the GetStatementResultResponse of getStatementResult with" + + " one page of records")) public class RedshiftData2Endpoint extends DefaultEndpoint implements EndpointServiceLocation { private RedshiftDataClient awsRedshiftDataClient; diff --git a/components/camel-aws/camel-aws2-s3-vectors/src/generated/resources/META-INF/org/apache/camel/component/aws2/s3vectors/aws2-s3-vectors.json b/components/camel-aws/camel-aws2-s3-vectors/src/generated/resources/META-INF/org/apache/camel/component/aws2/s3vectors/aws2-s3-vectors.json index 58da8dc70451..bb56e4dada37 100644 --- a/components/camel-aws/camel-aws2-s3-vectors/src/generated/resources/META-INF/org/apache/camel/component/aws2/s3vectors/aws2-s3-vectors.json +++ b/components/camel-aws/camel-aws2-s3-vectors/src/generated/resources/META-INF/org/apache/camel/component/aws2/s3vectors/aws2-s3-vectors.json @@ -77,6 +77,11 @@ "CamelAwsS3VectorsIndexStatus": { "index": 15, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The status of the vector index", "constantName": "org.apache.camel.component.aws2.s3vectors.AWS2S3VectorsConstants#INDEX_STATUS" }, "CamelAwsS3VectorsVectorBucketArn": { "index": 16, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The ARN of the vector bucket", "constantName": "org.apache.camel.component.aws2.s3vectors.AWS2S3VectorsConstants#VECTOR_BUCKET_ARN" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "pojo" ], "javaType": "software.amazon.awssdk.services.s3vectors.model.QueryOutputVector", "description": "One message per vector that the similarity search of consumerQueryVector finds and that was not sent before, as a QueryOutputVector of the AWS SDK with its key only, also in the CamelAwsS3VectorsVectorId header" }, + "producerIn": { "carriers": [ "any" ], "description": "The vector of putVectors and queryVectors, unless the CamelAwsS3VectorsVectorData or CamelAwsS3VectorsQueryVector header has it: one vector as a List of numbers, a float[] or a double[]. Text such as a JSON array fails, so unmarshal it first. The keys of getVectors and deleteVectors, unless the CamelAwsS3VectorsVectorId header has them: a String, a String[] or a List of Strings. The other operations do not use the body" }, + "producerOut": { "carriers": [ "pojo" ], "byOption": [ { "option": "operation", "value": "queryVectors", "carriers": [ "list" ], "javaType": "java.util.List<software.amazon.awssdk.services.s3vectors.model.QueryOutputVector>" }, { "option": "operation", "value": "getVectors", "carriers": [ "list" ], "javaType": "java.util.List<software.amazon.awssdk.services.s3vectors.model.GetOutputVector>" }, { "option": "operation", "value": "listVectorBuckets", "carriers": [ "list" ], "javaType": [...] + }, "properties": { "vectorBucketName": { "index": 0, "kind": "path", "displayName": "Vector Bucket Name", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Vector bucket name or ARN" }, "dataType": { "index": 1, "kind": "parameter", "displayName": "Data Type", "group": "common", "label": "", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "float32", "float16" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "float32", "configurationClass": "org.apache.camel.component.aws2.s3vectors.AWS2S3VectorsConfiguration", "configurationField": "configuration", "description": "The data type of the vector. Options: float32, [...] diff --git a/components/camel-aws/camel-aws2-s3-vectors/src/main/java/org/apache/camel/component/aws2/s3vectors/AWS2S3VectorsEndpoint.java b/components/camel-aws/camel-aws2-s3-vectors/src/main/java/org/apache/camel/component/aws2/s3vectors/AWS2S3VectorsEndpoint.java index 23dea141b1fd..9075c038b513 100644 --- a/components/camel-aws/camel-aws2-s3-vectors/src/main/java/org/apache/camel/component/aws2/s3vectors/AWS2S3VectorsEndpoint.java +++ b/components/camel-aws/camel-aws2-s3-vectors/src/main/java/org/apache/camel/component/aws2/s3vectors/AWS2S3VectorsEndpoint.java @@ -24,6 +24,9 @@ import org.apache.camel.Consumer; import org.apache.camel.Processor; import org.apache.camel.Producer; import org.apache.camel.component.aws2.s3vectors.client.AWS2S3VectorsClientFactory; +import org.apache.camel.spi.BodyType; +import org.apache.camel.spi.BodyType.Carrier; +import org.apache.camel.spi.BodyTypes; import org.apache.camel.spi.EndpointServiceLocation; import org.apache.camel.spi.Metadata; import org.apache.camel.spi.UriEndpoint; @@ -41,6 +44,37 @@ import software.amazon.awssdk.services.s3vectors.S3VectorsClient; @UriEndpoint(firstVersion = "4.17.0", scheme = "aws2-s3-vectors", title = "AWS S3 Vectors", syntax = "aws2-s3-vectors://vectorBucketName", category = { Category.CLOUD, Category.AI }, headersClass = AWS2S3VectorsConstants.class) +@BodyTypes(consumerOut = @BodyType(value = Carrier.POJO, + javaType = "software.amazon.awssdk.services.s3vectors.model.QueryOutputVector", + description = "One message per vector that the similarity search of consumerQueryVector" + + " finds and that was not sent before, as a QueryOutputVector of the AWS SDK" + + " with its key only, also in the CamelAwsS3VectorsVectorId header"), + producerIn = @BodyType(value = Carrier.ANY, + description = "The vector of putVectors and queryVectors, unless the" + + " CamelAwsS3VectorsVectorData or CamelAwsS3VectorsQueryVector header has it:" + + " one vector as a List of numbers, a float[] or a double[]. Text such as a" + + " JSON array fails, so unmarshal it first. The keys of getVectors and" + + " deleteVectors, unless the CamelAwsS3VectorsVectorId header has them: a" + + " String, a String[] or a List of Strings. The other operations do not use" + + " the body"), + producerOut = @BodyType(value = Carrier.POJO, + byOption = { + @BodyType.When(option = "operation", value = "queryVectors", carriers = Carrier.LIST, + javaType = "java.util.List<software.amazon.awssdk.services.s3vectors.model.QueryOutputVector>"), + @BodyType.When(option = "operation", value = "getVectors", carriers = Carrier.LIST, + javaType = "java.util.List<software.amazon.awssdk.services.s3vectors.model.GetOutputVector>"), + @BodyType.When(option = "operation", value = "listVectorBuckets", + carriers = Carrier.LIST, + javaType = "java.util.List<software.amazon.awssdk.services.s3vectors.model.VectorBucketSummary>"), + @BodyType.When(option = "operation", value = "listVectorIndexes", + carriers = Carrier.LIST, + javaType = "java.util.List<software.amazon.awssdk.services.s3vectors.model.IndexSummary>") }, + description = "The response of the AWS SDK for the operation, such as the PutVectorsResponse" + + " of putVectors, with the key of the vector in the CamelAwsS3VectorsVectorId" + + " header. A List for queryVectors, getVectors, listVectorBuckets and" + + " listVectorIndexes, the last two the first page only. The vectors of" + + " queryVectors and getVectors hold their keys only: the distance, the data" + + " and the metadata are not asked for")) public class AWS2S3VectorsEndpoint extends ScheduledPollEndpoint implements EndpointServiceLocation { private static final Logger LOG = LoggerFactory.getLogger(AWS2S3VectorsEndpoint.class); diff --git a/components/camel-aws/camel-aws2-step-functions/src/generated/resources/META-INF/org/apache/camel/component/aws2/stepfunctions/aws2-step-functions.json b/components/camel-aws/camel-aws2-step-functions/src/generated/resources/META-INF/org/apache/camel/component/aws2/stepfunctions/aws2-step-functions.json index da6f5ed00df0..1cf61fbe57f1 100644 --- a/components/camel-aws/camel-aws2-step-functions/src/generated/resources/META-INF/org/apache/camel/component/aws2/stepfunctions/aws2-step-functions.json +++ b/components/camel-aws/camel-aws2-step-functions/src/generated/resources/META-INF/org/apache/camel/component/aws2/stepfunctions/aws2-step-functions.json @@ -67,6 +67,10 @@ "CamelAwsStepFunctionsExecutionHistoryReverseOrder": { "index": 16, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Lists events in descending order of their timeStamp.", "constantName": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#EXECUTION_HISTORY_REVERSE_ORDER" }, "CamelAwsStepFunctionsExecutionMaxResults": { "index": 17, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The limit number of results while listing executions", "constantName": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#EXECUTIONS_MAX_RESULTS" } }, + "bodyTypes": { + "producerIn": { "carriers": [ "any" ], "byOption": [ { "option": "pojoRequest", "value": "true", "carriers": [ "pojo" ] } ], "description": "Not used: the operations take their input from headers, such as the input of startExecution and startSyncExecution in the CamelAwsStepFunctionsExecutionInput header as JSON text: marshal a Map or a POJO first. With pojoRequest=true the request of the AWS SDK for the operation, such as a StartExecutionRequest: another body fails" }, + "producerOut": { "carriers": [ "pojo" ], "description": "The response of the AWS SDK for the operation, such as the StartExecutionResponse of startExecution with the ARN of the execution. startSyncExecution gives a StartSyncExecutionResponse whose output is the JSON that the execution returns, as text: a failed execution does not fail the exchange, so check its status" } + }, "properties": { "label": { "index": 0, "kind": "path", "displayName": "Label", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "Logical name" }, "operation": { "index": 1, "kind": "parameter", "displayName": "Operation", "group": "producer", "label": "", "required": true, "type": "enum", "javaType": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Operations", "enum": [ "createStateMachine", "deleteStateMachine", "updateStateMachine", "describeStateMachine", "listStateMachines", "createActivity", "deleteActivity", "describeActivity", "getActivityTask", "listActivities", "startExecution", "startSyncExecution", "sto [...] diff --git a/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2Endpoint.java b/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2Endpoint.java index 03738f5b78e3..9e0d09d30890 100644 --- a/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2Endpoint.java +++ b/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2Endpoint.java @@ -18,6 +18,9 @@ package org.apache.camel.component.aws2.stepfunctions; import org.apache.camel.*; import org.apache.camel.component.aws2.stepfunctions.client.StepFunctions2ClientFactory; +import org.apache.camel.spi.BodyType; +import org.apache.camel.spi.BodyType.Carrier; +import org.apache.camel.spi.BodyTypes; import org.apache.camel.spi.EndpointServiceLocation; import org.apache.camel.spi.UriEndpoint; import org.apache.camel.spi.UriParam; @@ -32,6 +35,19 @@ import software.amazon.awssdk.services.sfn.SfnClient; syntax = "aws2-step-functions:label", producerOnly = true, category = { Category.CLOUD, Category.SERVERLESS }, headersClass = StepFunctions2Constants.class) +@BodyTypes(producerIn = @BodyType(value = Carrier.ANY, + byOption = @BodyType.When(option = "pojoRequest", value = "true", carriers = Carrier.POJO), + description = "Not used: the operations take their input from headers, such as the input of" + + " startExecution and startSyncExecution in the" + + " CamelAwsStepFunctionsExecutionInput header as JSON text: marshal a Map or a" + + " POJO first. With pojoRequest=true the request of the AWS SDK for the" + + " operation, such as a StartExecutionRequest: another body fails"), + producerOut = @BodyType(value = Carrier.POJO, + description = "The response of the AWS SDK for the operation, such as the" + + " StartExecutionResponse of startExecution with the ARN of the execution." + + " startSyncExecution gives a StartSyncExecutionResponse whose output is the" + + " JSON that the execution returns, as text: a failed execution does not fail" + + " the exchange, so check its status")) public class StepFunctions2Endpoint extends DefaultEndpoint implements EndpointServiceLocation { private SfnClient awsSfnClient; diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/test/java/org/apache/camel/dsl/yaml/validator/TextBodyFlowTest.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/test/java/org/apache/camel/dsl/yaml/validator/TextBodyFlowTest.java index 4fed1d1142d2..4a41b41e1d63 100644 --- a/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/test/java/org/apache/camel/dsl/yaml/validator/TextBodyFlowTest.java +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/test/java/org/apache/camel/dsl/yaml/validator/TextBodyFlowTest.java @@ -2018,6 +2018,68 @@ public class TextBodyFlowTest { .anySatisfy(m -> assertThat(m).contains("route trail: simple reads a field of the body (${body[eventName]})")); } + @Test + public void testTheBodyOfAwsDataAndAdminServices() { + // the SQL of startQueryExecution of aws2-athena is text, so a Map is sent as its toString(), and queryVectors + // of aws2-s3-vectors gives a List of the vectors found, not text. ecs, eks, mq, msk, config, security-hub, + // step-functions and redshift-data take their input from headers, the vector of putVectors can be in a header, + // and athena without an operation is not known, as the component may set it + String yaml = """ + - route: + id: query + from: + uri: timer:tick + steps: + - setBody: + constant: '{"sql": "SELECT 1"}' + - unmarshal: + json: {} + - to: aws2-athena:a?operation=startQueryExecution&outputLocation=s3://bucket/path/ + - route: + id: similar + from: + uri: timer:tick + steps: + - setBody: + constant: '[0.1, 0.2, 0.3]' + - unmarshal: + json: {} + - to: aws2-s3-vectors:v?operation=queryVectors&vectorIndexName=i + - to: aws2-translate:t?sourceLanguage=en&targetLanguage=de + - route: + id: admin + from: + uri: timer:tick + steps: + - setBody: + constant: '{"id": 1}' + - unmarshal: + json: {} + - to: aws2-ecs:e?operation=listClusters + - to: aws2-eks:k?operation=listClusters + - to: aws2-mq:m?operation=listBrokers + - to: aws2-msk:k?operation=listClusters + - to: aws-config:c?operation=describeRuleCompliance + - to: aws-security-hub:s?operation=getFindings + - to: aws2-step-functions:f?operation=startExecution + - to: aws2-redshift-data:r?operation=executeStatement + - route: + id: vectors + from: + uri: timer:tick + steps: + - setBody: + constant: '{"id": 1}' + - unmarshal: + json: {} + - to: aws2-s3-vectors:v?operation=putVectors&vectorIndexName=i + - to: aws2-athena:a?outputLocation=s3://bucket/path/ + """; + assertThat(lines(yaml)).hasSize(2) + .anySatisfy(m -> assertThat(m).contains("route query: to: aws2-athena needs the body as text")) + .anySatisfy(m -> assertThat(m).contains("route similar: to: aws2-translate needs the body as text")); + } + @Test public void testAnOptionValueInAnotherStyleOfTheEnum() { // the catalog and the enum type converter take convert-to-json and convertToJson as CONVERT_TO_JSON, so after
