From ea47364f7d1741ff6a82bb6bac5ed80c8088653c Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Sat, 24 Oct 2026 15:43:35 +0200 Subject: [PATCH] CAMEL-24961: Catalog body types for mina, mina-sftp, mllp, lumberjack, asterisk, grpc, thrift, avro, cometd, cometds, quickfix, jgroups and jgroups-raft Co-Authored-By: Claude Opus 5.5 (1M context) Signed-off-by: Claus Ibsen --- .../camel/catalog/components/asterisk.json | 5 ++ .../apache/camel/catalog/components/avro.json | 6 ++ .../camel/catalog/components/cometd.json | 6 ++ .../camel/catalog/components/cometds.json | 6 ++ .../apache/camel/catalog/components/grpc.json | 6 ++ .../catalog/components/jgroups-raft.json | 5 ++ .../camel/catalog/components/jgroups.json | 5 ++ .../camel/catalog/components/lumberjack.json | 3 + .../camel/catalog/components/mina-sftp.json | 5 ++ .../apache/camel/catalog/components/mina.json | 6 ++ .../apache/camel/catalog/components/mllp.json | 6 ++ .../camel/catalog/components/quickfix.json | 6 ++ .../camel/catalog/components/thrift.json | 6 ++ .../camel/catalog/docs/avro-component.adoc | 6 +- .../camel/catalog/docs/mllp-component.adoc | 5 +- .../catalog/docs/quickfix-component.adoc | 8 ++- .../camel/component/asterisk/asterisk.json | 5 ++ .../component/asterisk/AsteriskEndpoint.java | 16 +++++ .../org/apache/camel/component/avro/avro.json | 6 ++ .../src/main/docs/avro-component.adoc | 6 +- .../camel/component/avro/AvroEndpoint.java | 22 +++++++ .../apache/camel/component/cometd/cometd.json | 6 ++ .../camel/component/cometd/cometds.json | 6 ++ .../component/cometd/CometdEndpoint.java | 18 ++++++ .../org/apache/camel/component/grpc/grpc.json | 6 ++ .../camel/component/grpc/GrpcEndpoint.java | 36 ++++++++++++ .../component/jgroups/raft/jgroups-raft.json | 5 ++ .../jgroups/raft/JGroupsRaftEndpoint.java | 16 +++++ .../camel/component/jgroups/jgroups.json | 5 ++ .../component/jgroups/JGroupsEndpoint.java | 17 ++++++ .../component/lumberjack/lumberjack.json | 3 + .../lumberjack/LumberjackEndpoint.java | 7 +++ .../component/file/remote/mina/mina-sftp.json | 5 ++ .../file/remote/mina/MinaSftpEndpoint.java | 17 ++++++ .../org/apache/camel/component/mina/mina.json | 6 ++ .../camel/component/mina/MinaEndpoint.java | 58 +++++++++++++++++++ .../org/apache/camel/component/mllp/mllp.json | 6 ++ .../src/main/docs/mllp-component.adoc | 5 +- .../camel/component/mllp/MllpEndpoint.java | 21 +++++++ .../camel/component/quickfixj/quickfix.json | 6 ++ .../src/main/docs/quickfix-component.adoc | 8 ++- .../quickfixj/QuickfixjEndpoint.java | 21 +++++++ .../apache/camel/component/thrift/thrift.json | 6 ++ .../component/thrift/ThriftEndpoint.java | 22 +++++++ 44 files changed, 435 insertions(+), 16 deletions(-) diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/asterisk.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/asterisk.json index bbfe2b9355986..473fa1f31d1d4 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/asterisk.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/asterisk.json @@ -34,6 +34,11 @@ "CamelAsteriskContext": { "index": 2, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The name of the context that contains the extension to query in case of an ExtensionStateAction.", "constantName": "org.apache.camel.component.asterisk.AsteriskConstants#CONTEXT" }, "CamelAsteriskAction": { "index": 3, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "org.apache.camel.component.asterisk.AsteriskAction", "enum": [ "QUEUE_STATUS", "SIP_PEERS", "EXTENSION_STATE" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Asterisk action to do.", "constantName": "org.apache.camel.component.asterisk.AsteriskConstants#ACTION" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "pojo" ], "javaType": "org.asteriskjava.manager.event.ManagerEvent", "description": "The AMI event: a subclass of ManagerEvent such as NewChannelEvent or HangupEvent, with its simple class name in the CamelAsteriskEventName header. The ConnectEvent of the login comes first" }, + "producerIn": { "carriers": [ "any" ], "description": "The body is not read: the action comes from the action option or the CamelAsteriskAction header, and the extension and context of EXTENSION_STATE from the CamelAsteriskExtension and CamelAsteriskContext headers" }, + "producerOut": { "carriers": [ "pojo" ], "javaType": "org.asteriskjava.manager.response.ManagerResponse", "description": "The ManagerResponse of the action, such as an ExtensionStateResponse; a ManagerError when Asterisk answers with an error. QUEUE_STATUS and SIP_PEERS give only the first response, not the events of the list" } + }, "properties": { "name": { "index": 0, "kind": "path", "displayName": "Name", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Name of component" }, "hostname": { "index": 1, "kind": "parameter", "displayName": "Hostname", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The hostname of the asterisk server" }, diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/avro.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/avro.json index 0085a4f338e09..abbb70fea8874 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/avro.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/avro.json @@ -39,6 +39,12 @@ "headers": { "CamelAvroMessageName": { "index": 0, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The name of the message to send. In consumer overrides message name from URI (if any)", "constantName": "org.apache.camel.component.avro.AvroConstants#AVRO_MESSAGE_NAME" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "list" ], "javaType": "java.lang.Object[]", "byOption": [ { "option": "singleParameter", "value": "true", "carriers": [ "unknown" ] } ], "description": "An Object array of the parameters of the called message, in the order of the protocol, with the message name in the CamelAvroMessageName header. With singleParameter the one parameter itself, such as a record" }, + "consumerReply": { "carriers": [ "any" ], "description": "The response of the message, of its type in the protocol, such as the record class; it is not converted, so text or a Map fails for a record. Ignored for a message with a null response" }, + "producerIn": { "carriers": [ "list", "pojo", "text", "value" ], "description": "An Object array of the parameters of the message, in the order of the protocol, or the one parameter itself, such as a record. A java.util.List is not unpacked and a Map is not a record: build the parameter types of the protocol. The message name comes from the CamelAvroMessageName header, or else from the endpoint" }, + "producerOut": { "carriers": [ "unknown" ], "description": "The response of the message, of its type in the protocol, such as the record class; no body for a message with a null response" } + }, "properties": { "transport": { "index": 0, "kind": "path", "displayName": "Transport", "group": "common", "label": "", "required": true, "type": "enum", "javaType": "org.apache.camel.component.avro.AvroTransport", "enum": [ "http", "netty" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.avro.AvroConfiguration", "configurationField": "configuration", "description": "Transport to use, can be either http or netty" }, "port": { "index": 1, "kind": "path", "displayName": "Port", "group": "common", "label": "", "required": true, "type": "integer", "javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.avro.AvroConfiguration", "configurationField": "configuration", "description": "Port number to use" }, diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/cometd.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/cometd.json index 03bfd0843d2ea..063e7f61f736c 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/cometd.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/cometd.json @@ -40,6 +40,12 @@ "CometdClientId": { "index": 0, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The clientId of the session", "constantName": "org.apache.camel.component.cometd.CometdBinding#COMETD_CLIENT_ID_HEADER_NAME" }, "subscription": { "index": 1, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The subscription", "constantName": "org.apache.camel.component.cometd.CometdBinding#COMETD_SUBSCRIPTION_HEADER_NAME" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "text", "value", "map", "list", "null" ], "description": "The data of the Bayeux message, parsed from JSON: a String, a number or a boolean, a Map for an object, a List for an array, or null. From a cometd producer in the same JVM the body that producer sent, as is" }, + "consumerReply": { "carriers": [ "text", "value", "map", "list" ], "description": "Only when the exchange is InOut (exchangePattern=InOut, or set in the route): the body the route ends with is sent back to the client that published, as JSON. Bytes become an array of numbers; a stream, a file or another object is sent as the text of its toString" }, + "producerIn": { "carriers": [ "text", "value", "map", "list" ], "description": "The data published to the channel, sent as JSON to the subscribed clients: text, a number or a boolean, a Map or a List. Bytes become an array of numbers; a stream, a file or another object is sent as the text of its toString: convert it first. The headers go in the ext field of the message" }, + "producerOut": { "carriers": [ "unchanged" ] } + }, "properties": { "host": { "index": 0, "kind": "path", "displayName": "Host", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Hostname" }, "port": { "index": 1, "kind": "path", "displayName": "Port", "group": "common", "label": "", "required": true, "type": "integer", "javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Host port number" }, diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/cometds.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/cometds.json index 2f5c6b83fed02..f45c80ef5ad44 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/cometds.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/cometds.json @@ -40,6 +40,12 @@ "CometdClientId": { "index": 0, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The clientId of the session", "constantName": "org.apache.camel.component.cometd.CometdBinding#COMETD_CLIENT_ID_HEADER_NAME" }, "subscription": { "index": 1, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The subscription", "constantName": "org.apache.camel.component.cometd.CometdBinding#COMETD_SUBSCRIPTION_HEADER_NAME" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "text", "value", "map", "list", "null" ], "description": "The data of the Bayeux message, parsed from JSON: a String, a number or a boolean, a Map for an object, a List for an array, or null. From a cometd producer in the same JVM the body that producer sent, as is" }, + "consumerReply": { "carriers": [ "text", "value", "map", "list" ], "description": "Only when the exchange is InOut (exchangePattern=InOut, or set in the route): the body the route ends with is sent back to the client that published, as JSON. Bytes become an array of numbers; a stream, a file or another object is sent as the text of its toString" }, + "producerIn": { "carriers": [ "text", "value", "map", "list" ], "description": "The data published to the channel, sent as JSON to the subscribed clients: text, a number or a boolean, a Map or a List. Bytes become an array of numbers; a stream, a file or another object is sent as the text of its toString: convert it first. The headers go in the ext field of the message" }, + "producerOut": { "carriers": [ "unchanged" ] } + }, "properties": { "host": { "index": 0, "kind": "path", "displayName": "Host", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Hostname" }, "port": { "index": 1, "kind": "path", "displayName": "Port", "group": "common", "label": "", "required": true, "type": "integer", "javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Host port number" }, diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/grpc.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/grpc.json index d237309749cb1..4d235ea686629 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/grpc.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/grpc.json @@ -34,6 +34,12 @@ "CamelGrpcUserAgent": { "index": 1, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "If provided, the given agent will prepend the gRPC library's user agent information", "constantName": "org.apache.camel.component.grpc.GrpcConstants#GRPC_USER_AGENT_HEADER" }, "CamelGrpcEventType": { "index": 2, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Received event type from the sent request. Possible values: onNext onCompleted onError", "constantName": "org.apache.camel.component.grpc.GrpcConstants#GRPC_EVENT_TYPE_HEADER" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "pojo" ], "byOption": [ { "option": "consumerStrategy", "value": "AGGREGATION", "carriers": [ "pojo", "list" ] }, { "option": "forwardOnCompleted", "value": "true", "carriers": [ "pojo", "null" ] } ], "description": "The protobuf request message of the called method, with the method name in the CamelGrpcMethodName header. A streaming request gives one exchange per message, or with the AGGREGATION strategy a List of all its messages. forwardOnCompleted sends no body at the end of the stream, forwardOnError the Throwable" }, + "consumerReply": { "carriers": [ "pojo", "list", "null" ], "dependsOn": [ "routeControlledStreamObserver" ], "description": "The protobuf response message, or a List of them for a streaming response; no body sends an empty message. Text, bytes or a Map fail: build the message of the method. With routeControlledStreamObserver the route replies through a producer with toRouteControlledStreamObserver" }, + "producerIn": { "carriers": [ "pojo", "list" ], "description": "The protobuf request message of the method, or a List of them for a streaming request. Text, bytes or a Map fail with an argument type mismatch: build the message first" }, + "producerOut": { "carriers": [ "list" ], "byOption": [ { "option": "synchronous", "value": "true", "carriers": [ "pojo", "list" ] }, { "option": "producerStrategy", "value": "STREAMING", "carriers": [ "unchanged" ] }, { "option": "toRouteControlledStreamObserver", "value": "true", "carriers": [ "unchanged" ] } ], "description": "A List of the protobuf response messages. With synchronous=true the response message itself, or a List of them for a streaming response. With the STREAMING strategy the body is unchanged and each response goes to the streamRepliesTo endpoint" } + }, "properties": { "host": { "index": 0, "kind": "path", "displayName": "Host", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.grpc.GrpcConfiguration", "configurationField": "configuration", "description": "The gRPC server host name. This is localhost or 0.0.0.0 when being a consumer or remote server host name when using producer." }, "port": { "index": 1, "kind": "path", "displayName": "Port", "group": "common", "label": "", "required": true, "type": "integer", "javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.grpc.GrpcConfiguration", "configurationField": "configuration", "description": "The gRPC local or remote server port" }, diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/jgroups-raft.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/jgroups-raft.json index 9275faf86219c..9ae0d9b25edfe 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/jgroups-raft.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/jgroups-raft.json @@ -46,6 +46,11 @@ "CamelJGroupsRaftSetTimeout": { "index": 10, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Timeout to be used in set() operation.", "constantName": "org.apache.camel.component.jgroups.raft.JGroupsRaftConstants#HEADER_JGROUPSRAFT_SET_TIMEOUT" }, "CamelJGroupsRaftSetTimeUnit": { "index": 11, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "java.util.concurrent.TimeUnit", "enum": [ "NANOSECONDS", "MICROSECONDS", "MILLISECONDS", "SECONDS", "MINUTES", "HOURS", "DAYS" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Timeunit to be used in set() operation.", "constantName": "org.apache.camel.component.jgroups.raft.JGroupsRaftConstants#HEADER_JGROUPSRAFT_SET_TIMEUNIT" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "null" ], "description": "No body: an event for each change of the role of this member (only with enableRoleChangeEvents), with LEADER or FOLLOWER in the CamelJGroupsRaftEventType header and the state of the raft in the other headers" }, + "producerIn": { "carriers": [ "bytes", "text", "stream", "file" ], "description": "The bytes to set() in the replicated log: a byte array, or text, a stream or a file converted to bytes. A null body, a Map, a number or a POJO has no conversion to bytes and is skipped without an error: nothing is set" }, + "producerOut": { "carriers": [ "bytes", "unchanged" ], "description": "The byte array the state machine returns for the set (an empty array with the default NopStateMachine), with the state of the raft in the headers. A body that was skipped is left as it was" } + }, "properties": { "clusterName": { "index": 0, "kind": "path", "displayName": "Cluster Name", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The name of the JGroupsraft cluster the component should connect to." }, "enableRoleChangeEvents": { "index": 1, "kind": "parameter", "displayName": "Enable Role Change Events", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "If set to true, the consumer endpoint will receive roleChange event as well (not just connecting and\/or using the state machine). By default it is set to false." }, diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/jgroups.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/jgroups.json index 5b19bbf465e0f..79a55abbdfa92 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/jgroups.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/jgroups.json @@ -39,6 +39,11 @@ "CamelJGroupsSrc": { "index": 2, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "org.jgroups.Address", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Consumer : The org.jgroups.Address instance extracted by org.jgroups.Message.getSrc() method of the consumed message. Producer: The custom source org.jgroups.Address of the message to be sent.", "constantName": "org.apache.camel.component.jgroups.JGroupsConstants#HEADER_JGROUPS_SRC" }, "CamelJGroupsOriginalMessage": { "index": 3, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "org.jgroups.Message", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The original org.jgroups.Message instance from which the body of the consumed message has been extracted.", "constantName": "org.apache.camel.component.jgroups.JGroupsConstants#HEADER_JGROUPS_ORIGINAL_MESSAGE" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "unknown" ], "dependsOn": [ "enableViewMessages" ], "description": "The object the sender put in the message, Java-deserialized: what a jgroups producer sent, such as a String, a byte array, a Map or a Serializable POJO, if the deserialization filter accepts its class. With enableViewMessages an org.jgroups.View also arrives on each change of the members of the cluster" }, + "producerIn": { "carriers": [ "text", "bytes", "value", "map", "list", "file", "pojo" ], "description": "The body as is, Java-serialized into the message, so it must be Serializable: a stream or another object that is not fails with a NotSerializableException. A null body is not sent. The CamelJGroupsDest header sends it to one member instead of the cluster" }, + "producerOut": { "carriers": [ "unchanged" ] } + }, "properties": { "clusterName": { "index": 0, "kind": "path", "displayName": "Cluster Name", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The name of the JGroups cluster the component should connect to." }, "channelProperties": { "index": 1, "kind": "parameter", "displayName": "Channel Properties", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Specifies configuration properties of the JChannel used by the endpoint." }, diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/lumberjack.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/lumberjack.json index f2637d8720d55..654bbc210b4c4 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/lumberjack.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/lumberjack.json @@ -29,6 +29,9 @@ "sslContextParameters": { "index": 2, "kind": "property", "displayName": "Ssl Context Parameters", "group": "security", "label": "security", "required": false, "type": "object", "javaType": "org.apache.camel.support.jsse.SSLContextParameters", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the default SSL configuration to use for all the endpoints. You can also configure it directly at the endpoint level." }, "useGlobalSslContextParameters": { "index": 3, "kind": "property", "displayName": "Use Global Ssl Context Parameters", "group": "security", "label": "security", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Enable usage of global SSL context parameters." } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "map", "list", "text", "value", "null" ], "description": "The log event: a Map of its fields, such as message, source and host, with the nested objects as Maps and the arrays as Lists. A JSON frame that is not an object gives a List, a String, a number, a boolean or null" } + }, "properties": { "host": { "index": 0, "kind": "path", "displayName": "Host", "group": "consumer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Network interface on which to listen for Lumberjack" }, "port": { "index": 1, "kind": "path", "displayName": "Port", "group": "consumer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 5044, "description": "Network port on which to listen for Lumberjack" }, diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/mina-sftp.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/mina-sftp.json index 6cae8c76d1cb1..813150fd16b4e 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/mina-sftp.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/mina-sftp.json @@ -49,6 +49,11 @@ "CamelFtpReplyCode": { "index": 15, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "important": true, "description": "The FTP client reply code", "constantName": "org.apache.camel.component.file.remote.FtpConstants#FTP_REPLY_CODE" }, "CamelFtpReplyString": { "index": 16, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "important": true, "description": "The FTP client reply string", "constantName": "org.apache.camel.component.file.remote.FtpConstants#FTP_REPLY_STRING" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "file" ], "dependsOn": [ "preMove" ], "byOption": [ { "option": "streamDownload", "value": "true", "carriers": [ "stream" ] }, { "option": "download", "value": "false", "carriers": [ "null" ] } ], "description": "The file as read: a RemoteFile, which converts to text, bytes or a stream; a stream with streamDownload; with preMove its content, a byte array" }, + "producerIn": { "carriers": [ "text", "bytes", "stream", "file" ], "byOption": [ { "option": "allowNullBody", "value": "true", "carriers": [ "null", "text", "bytes", "stream", "file" ] } ], "description": "What converts to an InputStream: text, bytes, a stream or a file. A Map or a List fails: marshal it first" }, + "producerOut": { "carriers": [ "unchanged" ] } + }, "properties": { "host": { "index": 0, "kind": "path", "displayName": "Host", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.file.remote.mina.MinaSftpConfiguration", "configurationField": "configuration", "description": "Hostname of the FTP server" }, "port": { "index": 1, "kind": "path", "displayName": "Port", "group": "common", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.file.remote.mina.MinaSftpConfiguration", "configurationField": "configuration", "description": "Port of the FTP server" }, diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/mina.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/mina.json index 2c014e2d5703c..10b6c4d37ed40 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/mina.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/mina.json @@ -61,6 +61,12 @@ "CamelMinaLocalAddress": { "index": 2, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "java.net.SocketAddress", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The socket address of local machine that received the message.", "constantName": "org.apache.camel.component.mina.MinaConstants#MINA_LOCAL_ADDRESS" }, "CamelMinaRemoteAddress": { "index": 3, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "java.net.SocketAddress", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The socket address of the remote machine that send the message.", "constantName": "org.apache.camel.component.mina.MinaConstants#MINA_REMOTE_ADDRESS" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "text" ], "javaType": "java.lang.String", "dependsOn": [ "codec", "objectCodecPattern", "transferExchange" ], "byOption": [ { "option": "protocol", "value": "udp", "carriers": [ "bytes" ], "javaType": "byte[]" }, { "option": "allowDefaultCodec", "value": "false", "carriers": [ "pojo" ], "javaType": "org.apache.mina.core.buffer.IoBuffer" } ], "description": "The data received as a String: one line with textline=true. The default object codec over TCP accepts only a String unless objectCodecPattern lists the classes to deserialize. Over UDP the datagram as a byte array" }, + "consumerReply": { "carriers": [ "null", "text" ], "dependsOn": [ "codec", "transferExchange" ], "byOption": [ { "option": "protocol", "value": "udp", "carriers": [ "null", "text", "bytes", "stream", "file" ] }, { "option": "allowDefaultCodec", "value": "false", "carriers": [ "null", "pojo" ], "javaType": "org.apache.mina.core.buffer.IoBuffer" } ], "description": "The body the route ends with is written back to the caller, also with sync=false. Send a String: with textline=true other bodies are written with toString(), and the object codec writes any Serializable object, which a Mina client accepts only when its objectCodecPattern lists the class. No body sends nothing and closes the connection" }, + "producerIn": { "carriers": [ "null", "text" ], "dependsOn": [ "codec", "transferExchange" ], "byOption": [ { "option": "textline", "value": "true", "carriers": [ "any" ] }, { "option": "protocol", "value": "udp", "carriers": [ "null", "text", "bytes", "stream", "file" ] }, { "option": "allowDefaultCodec", "value": "false", "carriers": [ "null", "pojo" ], "javaType": "org.apache.mina.core.buffer.IoBuffer" } ], "description": "The data to send: a String. The default object codec over TCP serializes the body, but a Mina server accepts only a String unless its objectCodecPattern lists the class, and a stream fails; textline=true converts any body to a line of text. No body sends nothing" }, + "producerOut": { "carriers": [ "text", "null" ], "javaType": "java.lang.String", "dependsOn": [ "codec", "objectCodecPattern", "transferExchange" ], "byOption": [ { "option": "sync", "value": "false", "carriers": [ "unchanged", "null" ] }, { "option": "protocol", "value": "udp", "carriers": [ "bytes", "null" ], "javaType": "byte[]" }, { "option": "allowDefaultCodec", "value": "false", "carriers": [ "pojo", "null" ], "javaType": "org.apache.mina.core.buffer.IoBuffer" } ], "description": "With sync=true (the default) the reply of the server as a String, or a byte array over UDP. No body is not sent and stays null. With sync=false an InOut exchange ends with an empty message" } + }, "properties": { "protocol": { "index": 0, "kind": "path", "displayName": "Protocol", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.mina.MinaConfiguration", "configurationField": "configuration", "description": "Protocol to use" }, "host": { "index": 1, "kind": "path", "displayName": "Host", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.mina.MinaConfiguration", "configurationField": "configuration", "description": "Hostname to use. Use localhost or 0.0.0.0 for local server as consumer. For producer use the hostname or ip address of the remote server." }, diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/mllp.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/mllp.json index fe54a6d994503..43f0221ec6c19 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/mllp.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/mllp.json @@ -85,6 +85,12 @@ "CamelMllpVersionId": { "index": 21, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "MSH-12 value", "constantName": "org.apache.camel.component.mllp.MllpConstants#MLLP_VERSION_ID" }, "CamelMllpCharset": { "index": 22, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "MSH-18 value", "constantName": "org.apache.camel.component.mllp.MllpConstants#MLLP_CHARSET" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "text" ], "javaType": "java.lang.String", "byOption": [ { "option": "stringPayload", "value": "false", "carriers": [ "bytes" ], "javaType": "byte[]" } ], "description": "The HL7 message without the MLLP envelope, as a String in the charset of MSH-18 or charsetName, or a byte array with stringPayload=false" }, + "consumerReply": { "carriers": [ "any" ], "description": "The body is not sent back: the acknowledgement is the CamelMllpAcknowledgement or CamelMllpAcknowledgementString exchange property, or with autoAck an HL7 ACK (AA, or AE when the exchange failed)" }, + "producerIn": { "carriers": [ "text", "bytes" ], "description": "The HL7 message as a String or a byte array. No body fails; another body, such as a stream, is sent as an empty message: convert it to a String first" }, + "producerOut": { "carriers": [ "unchanged" ], "description": "The body is left as it was: with InOut the acknowledgement is in the CamelMllpAcknowledgement (byte array) and CamelMllpAcknowledgementString headers" } + }, "properties": { "hostname": { "index": 0, "kind": "path", "displayName": "Hostname", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Hostname or IP for connection for the TCP connection. The default value is null, which means any local IP address" }, "port": { "index": 1, "kind": "path", "displayName": "Port", "group": "common", "label": "", "required": true, "type": "integer", "javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Port number for the TCP connection" }, diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/quickfix.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/quickfix.json index eb99136595614..e4a007573f980 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/quickfix.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/quickfix.json @@ -38,6 +38,12 @@ "SessionID": { "index": 1, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "quickfix.SessionID", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The FIX message SessionID.", "constantName": "org.apache.camel.component.quickfixj.QuickfixjEndpoint#SESSION_ID_KEY" }, "MessageType": { "index": 2, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The FIX MsgType tag value.", "constantName": "org.apache.camel.component.quickfixj.QuickfixjEndpoint#MESSAGE_TYPE_KEY" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "pojo", "null" ], "description": "The FIX message: a quickfix.Message, such as a quickfix.fix44.Email, with the kind of event in the EventCategory header and the MsgType in the MessageType header. SessionCreated, SessionLogon and SessionLogoff events have no body" }, + "consumerReply": { "carriers": [ "pojo", "text", "bytes" ], "description": "With exchangePattern=InOut, the reply sent back on the session of the request: a quickfix.Message, or the FIX message as text or bytes. Every event is answered with the body the route ends with: a route that sets no reply sends back the message it received" }, + "producerIn": { "carriers": [ "pojo", "text", "bytes" ], "description": "The FIX message to send: a quickfix.Message, or the FIX message as text or bytes, parsed with the DataDictionary exchange property or the data dictionary of the session. A stream, a Map or no body fails" }, + "producerOut": { "carriers": [ "unchanged", "pojo" ], "description": "The body is left as it was. An InOut exchange waits for the reply that matches the CorrelationCriteria exchange property, and the reply quickfix.Message is the body" } + }, "properties": { "configurationName": { "index": 0, "kind": "path", "displayName": "Configuration Name", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "supportFileReference": true, "description": "Path to the quickfix configuration file. You can prefix with: classpath, file, http, ref, or bean. classpath, file and http loads the configuration file using these protocols (classpath is default). ref will lookup the configuration file in the registry. bean will call a method on a bean to be used as the configuration. For bean you can specify the method name after dot, eg bean:myBean.myMethod" }, "lazyCreateEngine": { "index": 1, "kind": "parameter", "displayName": "Lazy Create Engine", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "This option allows creating QuickFIX\/J engine on demand. Value true means the engine is started when first message is send or there's consumer configured in route definition. When false value is used, the engine is started at the endpoint creation. When this parameter is missing, the value of component's property lazyCreateEngines is being used." }, diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/thrift.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/thrift.json index 0826fcc5dc0a9..c5bcd0520b7d9 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/thrift.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/thrift.json @@ -32,6 +32,12 @@ "headers": { "CamelThriftMethodName": { "index": 0, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Method name handled by the consumer service", "constantName": "org.apache.camel.component.thrift.ThriftConstants#THRIFT_METHOD_NAME_HEADER" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "list", "null" ], "byOption": [ { "option": "synchronous", "value": "true", "carriers": [ "list" ] } ], "description": "A List of the arguments of the called method, in the order of the IDL, with the method name in the CamelThriftMethodName header. A method without arguments gives no body, or an empty List with synchronous=true" }, + "consumerReply": { "carriers": [ "any" ], "description": "The result of the method: the body is converted to its return type, so text works for an i32, and a struct result needs the Thrift struct. Ignored for a void method. A body that does not convert gives the client an error, or a null result from the asynchronous server" }, + "producerIn": { "carriers": [ "list", "pojo", "text", "null" ], "description": "A List of the arguments of the method, in the order of the IDL; a body that is not a List is the one argument, no body calls a method without arguments. A binary argument is a ByteBuffer, not a byte array; a method whose one argument is a list needs it wrapped in a List" }, + "producerOut": { "carriers": [ "unknown" ], "description": "The result of the method, of its return type in the IDL: a number, a boolean, a String, a ByteBuffer, a Thrift struct, or a List, Set or Map; no body for a void or oneway method" } + }, "properties": { "host": { "index": 0, "kind": "path", "displayName": "Host", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.thrift.ThriftConfiguration", "configurationField": "configuration", "description": "The Thrift server host name. This is localhost or 0.0.0.0 (if not defined) when being a consumer or remote server host name when using producer." }, "port": { "index": 1, "kind": "path", "displayName": "Port", "group": "common", "label": "", "required": true, "type": "integer", "javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.thrift.ThriftConfiguration", "configurationField": "configuration", "description": "The Thrift server port" }, diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/avro-component.adoc b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/avro-component.adoc index 3372b143f5c2f..373ff320112ac 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/avro-component.adoc +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/avro-component.adoc @@ -343,9 +343,9 @@ YAML:: ==== In the example above, get takes only one parameter, so `singleParameter` -is used and `getProcessor` will receive Value class directly in body, -while `putProcessor` will receive an array of size 2 with `String` key and -`Value` value filled as array contents. +is used and `getProcessor` will receive the `Key` directly in the body, +while `putProcessor` will receive an array of size 2 with the `Key` and the +`Value` as its contents. === Avro via HTTP SPI diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/mllp-component.adoc b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/mllp-component.adoc index 0321f09b751f5..383a40fc15041 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/mllp-component.adoc +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/mllp-component.adoc @@ -30,8 +30,9 @@ The component supports the following: * A Camel consumer using a TCP Server * A Camel producer using a TCP Client -The MLLP component use `byte[]` payloads, and relies on Camel type -conversion to convert `byte[]` to other types. +The MLLP consumer gives the HL7 payload as a `String` by default +(`stringPayload=true`), or as a `byte[]` with `stringPayload=false`. +The MLLP producer sends a `String` or a `byte[]` body. Maven users will need to add the following dependency to their pom.xml for this component: diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/quickfix-component.adoc b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/quickfix-component.adoc index 241f122c61707..61d92dbca9fa1 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/quickfix-component.adoc +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/quickfix-component.adoc @@ -307,9 +307,11 @@ The correlation criteria is defined with a `MessagePredicate` object. The following example will treat a FIX `ExecutionReport` from the specified session where the transaction type is STATUS and the Order ID -matches our request. The session ID should be for the __requestor__, the -sender and target CompID fields -will be reversed when looking for the reply. +matches our request. The SenderCompID and TargetCompID of the session ID are +matched as given against the header of the reply, so use the session ID as +the __replier__ sees it: for a request sent on `FIX.4.2:TRADER->MARKET`, use +`FIX.4.2:MARKET->TRADER`. The correlation criteria is required for an InOut +exchange. ._Java-only: programmatic correlation criteria setup using QuickFIX/J API_ [source,java] diff --git a/components/camel-asterisk/src/generated/resources/META-INF/org/apache/camel/component/asterisk/asterisk.json b/components/camel-asterisk/src/generated/resources/META-INF/org/apache/camel/component/asterisk/asterisk.json index bbfe2b9355986..473fa1f31d1d4 100644 --- a/components/camel-asterisk/src/generated/resources/META-INF/org/apache/camel/component/asterisk/asterisk.json +++ b/components/camel-asterisk/src/generated/resources/META-INF/org/apache/camel/component/asterisk/asterisk.json @@ -34,6 +34,11 @@ "CamelAsteriskContext": { "index": 2, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The name of the context that contains the extension to query in case of an ExtensionStateAction.", "constantName": "org.apache.camel.component.asterisk.AsteriskConstants#CONTEXT" }, "CamelAsteriskAction": { "index": 3, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "org.apache.camel.component.asterisk.AsteriskAction", "enum": [ "QUEUE_STATUS", "SIP_PEERS", "EXTENSION_STATE" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Asterisk action to do.", "constantName": "org.apache.camel.component.asterisk.AsteriskConstants#ACTION" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "pojo" ], "javaType": "org.asteriskjava.manager.event.ManagerEvent", "description": "The AMI event: a subclass of ManagerEvent such as NewChannelEvent or HangupEvent, with its simple class name in the CamelAsteriskEventName header. The ConnectEvent of the login comes first" }, + "producerIn": { "carriers": [ "any" ], "description": "The body is not read: the action comes from the action option or the CamelAsteriskAction header, and the extension and context of EXTENSION_STATE from the CamelAsteriskExtension and CamelAsteriskContext headers" }, + "producerOut": { "carriers": [ "pojo" ], "javaType": "org.asteriskjava.manager.response.ManagerResponse", "description": "The ManagerResponse of the action, such as an ExtensionStateResponse; a ManagerError when Asterisk answers with an error. QUEUE_STATUS and SIP_PEERS give only the first response, not the events of the list" } + }, "properties": { "name": { "index": 0, "kind": "path", "displayName": "Name", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Name of component" }, "hostname": { "index": 1, "kind": "parameter", "displayName": "Hostname", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The hostname of the asterisk server" }, diff --git a/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskEndpoint.java b/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskEndpoint.java index fa8666cff371c..88d35537b63d8 100644 --- a/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskEndpoint.java +++ b/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskEndpoint.java @@ -22,6 +22,9 @@ import org.apache.camel.Consumer; import org.apache.camel.Processor; import org.apache.camel.Producer; +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; @@ -35,6 +38,19 @@ */ @UriEndpoint(firstVersion = "2.18.0", scheme = "asterisk", title = "Asterisk", syntax = "asterisk:name", category = { Category.MOBILE }, headersClass = AsteriskConstants.class) +@BodyTypes(consumerOut = @BodyType(value = Carrier.POJO, javaType = "org.asteriskjava.manager.event.ManagerEvent", + description = "The AMI event: a subclass of ManagerEvent such as NewChannelEvent or" + + " HangupEvent, with its simple class name in the CamelAsteriskEventName" + + " header. The ConnectEvent of the login comes first"), + producerIn = @BodyType(value = Carrier.ANY, + description = "The body is not read: the action comes from the action option or the" + + " CamelAsteriskAction header, and the extension and context of" + + " EXTENSION_STATE from the CamelAsteriskExtension and" + + " CamelAsteriskContext headers"), + producerOut = @BodyType(value = Carrier.POJO, javaType = "org.asteriskjava.manager.response.ManagerResponse", + description = "The ManagerResponse of the action, such as an ExtensionStateResponse; a" + + " ManagerError when Asterisk answers with an error. QUEUE_STATUS and" + + " SIP_PEERS give only the first response, not the events of the list")) public class AsteriskEndpoint extends DefaultEndpoint implements EndpointServiceLocation { @UriPath(description = "Name of component") @Metadata(required = true) diff --git a/components/camel-avro-rpc/camel-avro-rpc-component/src/generated/resources/META-INF/org/apache/camel/component/avro/avro.json b/components/camel-avro-rpc/camel-avro-rpc-component/src/generated/resources/META-INF/org/apache/camel/component/avro/avro.json index 0085a4f338e09..abbb70fea8874 100644 --- a/components/camel-avro-rpc/camel-avro-rpc-component/src/generated/resources/META-INF/org/apache/camel/component/avro/avro.json +++ b/components/camel-avro-rpc/camel-avro-rpc-component/src/generated/resources/META-INF/org/apache/camel/component/avro/avro.json @@ -39,6 +39,12 @@ "headers": { "CamelAvroMessageName": { "index": 0, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The name of the message to send. In consumer overrides message name from URI (if any)", "constantName": "org.apache.camel.component.avro.AvroConstants#AVRO_MESSAGE_NAME" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "list" ], "javaType": "java.lang.Object[]", "byOption": [ { "option": "singleParameter", "value": "true", "carriers": [ "unknown" ] } ], "description": "An Object array of the parameters of the called message, in the order of the protocol, with the message name in the CamelAvroMessageName header. With singleParameter the one parameter itself, such as a record" }, + "consumerReply": { "carriers": [ "any" ], "description": "The response of the message, of its type in the protocol, such as the record class; it is not converted, so text or a Map fails for a record. Ignored for a message with a null response" }, + "producerIn": { "carriers": [ "list", "pojo", "text", "value" ], "description": "An Object array of the parameters of the message, in the order of the protocol, or the one parameter itself, such as a record. A java.util.List is not unpacked and a Map is not a record: build the parameter types of the protocol. The message name comes from the CamelAvroMessageName header, or else from the endpoint" }, + "producerOut": { "carriers": [ "unknown" ], "description": "The response of the message, of its type in the protocol, such as the record class; no body for a message with a null response" } + }, "properties": { "transport": { "index": 0, "kind": "path", "displayName": "Transport", "group": "common", "label": "", "required": true, "type": "enum", "javaType": "org.apache.camel.component.avro.AvroTransport", "enum": [ "http", "netty" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.avro.AvroConfiguration", "configurationField": "configuration", "description": "Transport to use, can be either http or netty" }, "port": { "index": 1, "kind": "path", "displayName": "Port", "group": "common", "label": "", "required": true, "type": "integer", "javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.avro.AvroConfiguration", "configurationField": "configuration", "description": "Port number to use" }, diff --git a/components/camel-avro-rpc/camel-avro-rpc-component/src/main/docs/avro-component.adoc b/components/camel-avro-rpc/camel-avro-rpc-component/src/main/docs/avro-component.adoc index 3372b143f5c2f..373ff320112ac 100644 --- a/components/camel-avro-rpc/camel-avro-rpc-component/src/main/docs/avro-component.adoc +++ b/components/camel-avro-rpc/camel-avro-rpc-component/src/main/docs/avro-component.adoc @@ -343,9 +343,9 @@ YAML:: ==== In the example above, get takes only one parameter, so `singleParameter` -is used and `getProcessor` will receive Value class directly in body, -while `putProcessor` will receive an array of size 2 with `String` key and -`Value` value filled as array contents. +is used and `getProcessor` will receive the `Key` directly in the body, +while `putProcessor` will receive an array of size 2 with the `Key` and the +`Value` as its contents. === Avro via HTTP SPI diff --git a/components/camel-avro-rpc/camel-avro-rpc-component/src/main/java/org/apache/camel/component/avro/AvroEndpoint.java b/components/camel-avro-rpc/camel-avro-rpc-component/src/main/java/org/apache/camel/component/avro/AvroEndpoint.java index d5fde4529303c..2dd1c4aefe54c 100644 --- a/components/camel-avro-rpc/camel-avro-rpc-component/src/main/java/org/apache/camel/component/avro/AvroEndpoint.java +++ b/components/camel-avro-rpc/camel-avro-rpc-component/src/main/java/org/apache/camel/component/avro/AvroEndpoint.java @@ -28,6 +28,9 @@ import org.apache.camel.Consumer; import org.apache.camel.Processor; import org.apache.camel.avro.support.AvroClassSecuritySupport; +import org.apache.camel.spi.BodyType; +import org.apache.camel.spi.BodyType.Carrier; +import org.apache.camel.spi.BodyTypes; import org.apache.camel.spi.UriEndpoint; import org.apache.camel.spi.UriParam; import org.apache.camel.support.DefaultEndpoint; @@ -37,6 +40,25 @@ */ @UriEndpoint(firstVersion = "2.10.0", scheme = "avro", title = "Avro RPC", syntax = "avro:transport:host:port/messageName", category = { Category.RPC }, headersClass = AvroConstants.class) +@BodyTypes(consumerOut = @BodyType(value = Carrier.LIST, javaType = "java.lang.Object[]", + byOption = @BodyType.When(option = "singleParameter", value = "true", + carriers = Carrier.UNKNOWN), + description = "An Object array of the parameters of the called message, in the order of" + + " the protocol, with the message name in the CamelAvroMessageName header." + + " With singleParameter the one parameter itself, such as a record"), + consumerReply = @BodyType(value = Carrier.ANY, + description = "The response of the message, of its type in the protocol, such as the" + + " record class; it is not converted, so text or a Map fails for a record." + + " Ignored for a message with a null response"), + producerIn = @BodyType(value = { Carrier.LIST, Carrier.POJO, Carrier.TEXT, Carrier.VALUE }, + description = "An Object array of the parameters of the message, in the order of the" + + " protocol, or the one parameter itself, such as a record. A java.util.List" + + " is not unpacked and a Map is not a record: build the parameter types of" + + " the protocol. The message name comes from the CamelAvroMessageName header," + + " or else from the endpoint"), + producerOut = @BodyType(value = Carrier.UNKNOWN, + description = "The response of the message, of its type in the protocol, such as the" + + " record class; no body for a message with a null response")) public abstract class AvroEndpoint extends DefaultEndpoint implements AsyncEndpoint { @UriParam diff --git a/components/camel-cometd/src/generated/resources/META-INF/org/apache/camel/component/cometd/cometd.json b/components/camel-cometd/src/generated/resources/META-INF/org/apache/camel/component/cometd/cometd.json index 03bfd0843d2ea..063e7f61f736c 100644 --- a/components/camel-cometd/src/generated/resources/META-INF/org/apache/camel/component/cometd/cometd.json +++ b/components/camel-cometd/src/generated/resources/META-INF/org/apache/camel/component/cometd/cometd.json @@ -40,6 +40,12 @@ "CometdClientId": { "index": 0, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The clientId of the session", "constantName": "org.apache.camel.component.cometd.CometdBinding#COMETD_CLIENT_ID_HEADER_NAME" }, "subscription": { "index": 1, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The subscription", "constantName": "org.apache.camel.component.cometd.CometdBinding#COMETD_SUBSCRIPTION_HEADER_NAME" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "text", "value", "map", "list", "null" ], "description": "The data of the Bayeux message, parsed from JSON: a String, a number or a boolean, a Map for an object, a List for an array, or null. From a cometd producer in the same JVM the body that producer sent, as is" }, + "consumerReply": { "carriers": [ "text", "value", "map", "list" ], "description": "Only when the exchange is InOut (exchangePattern=InOut, or set in the route): the body the route ends with is sent back to the client that published, as JSON. Bytes become an array of numbers; a stream, a file or another object is sent as the text of its toString" }, + "producerIn": { "carriers": [ "text", "value", "map", "list" ], "description": "The data published to the channel, sent as JSON to the subscribed clients: text, a number or a boolean, a Map or a List. Bytes become an array of numbers; a stream, a file or another object is sent as the text of its toString: convert it first. The headers go in the ext field of the message" }, + "producerOut": { "carriers": [ "unchanged" ] } + }, "properties": { "host": { "index": 0, "kind": "path", "displayName": "Host", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Hostname" }, "port": { "index": 1, "kind": "path", "displayName": "Port", "group": "common", "label": "", "required": true, "type": "integer", "javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Host port number" }, diff --git a/components/camel-cometd/src/generated/resources/META-INF/org/apache/camel/component/cometd/cometds.json b/components/camel-cometd/src/generated/resources/META-INF/org/apache/camel/component/cometd/cometds.json index 2f5c6b83fed02..f45c80ef5ad44 100644 --- a/components/camel-cometd/src/generated/resources/META-INF/org/apache/camel/component/cometd/cometds.json +++ b/components/camel-cometd/src/generated/resources/META-INF/org/apache/camel/component/cometd/cometds.json @@ -40,6 +40,12 @@ "CometdClientId": { "index": 0, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The clientId of the session", "constantName": "org.apache.camel.component.cometd.CometdBinding#COMETD_CLIENT_ID_HEADER_NAME" }, "subscription": { "index": 1, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The subscription", "constantName": "org.apache.camel.component.cometd.CometdBinding#COMETD_SUBSCRIPTION_HEADER_NAME" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "text", "value", "map", "list", "null" ], "description": "The data of the Bayeux message, parsed from JSON: a String, a number or a boolean, a Map for an object, a List for an array, or null. From a cometd producer in the same JVM the body that producer sent, as is" }, + "consumerReply": { "carriers": [ "text", "value", "map", "list" ], "description": "Only when the exchange is InOut (exchangePattern=InOut, or set in the route): the body the route ends with is sent back to the client that published, as JSON. Bytes become an array of numbers; a stream, a file or another object is sent as the text of its toString" }, + "producerIn": { "carriers": [ "text", "value", "map", "list" ], "description": "The data published to the channel, sent as JSON to the subscribed clients: text, a number or a boolean, a Map or a List. Bytes become an array of numbers; a stream, a file or another object is sent as the text of its toString: convert it first. The headers go in the ext field of the message" }, + "producerOut": { "carriers": [ "unchanged" ] } + }, "properties": { "host": { "index": 0, "kind": "path", "displayName": "Host", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Hostname" }, "port": { "index": 1, "kind": "path", "displayName": "Port", "group": "common", "label": "", "required": true, "type": "integer", "javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Host port number" }, diff --git a/components/camel-cometd/src/main/java/org/apache/camel/component/cometd/CometdEndpoint.java b/components/camel-cometd/src/main/java/org/apache/camel/component/cometd/CometdEndpoint.java index 59c9d709cd63e..8cbf8c62edb4d 100644 --- a/components/camel-cometd/src/main/java/org/apache/camel/component/cometd/CometdEndpoint.java +++ b/components/camel-cometd/src/main/java/org/apache/camel/component/cometd/CometdEndpoint.java @@ -23,6 +23,9 @@ import org.apache.camel.Consumer; import org.apache.camel.Processor; import org.apache.camel.Producer; +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.HeaderFilterStrategy; import org.apache.camel.spi.Metadata; @@ -40,6 +43,21 @@ */ @UriEndpoint(firstVersion = "2.0.0", scheme = "cometd,cometds", title = "CometD", syntax = "cometd:host:port/channelName", category = { Category.NETWORKING, Category.MESSAGING }, headersClass = CometdBinding.class) +@BodyTypes(consumerOut = @BodyType(value = { Carrier.TEXT, Carrier.VALUE, Carrier.MAP, Carrier.LIST, Carrier.NULL }, + description = "The data of the Bayeux message, parsed from JSON: a String, a number or a" + + " boolean, a Map for an object, a List for an array, or null. From a cometd" + + " producer in the same JVM the body that producer sent, as is"), + consumerReply = @BodyType(value = { Carrier.TEXT, Carrier.VALUE, Carrier.MAP, Carrier.LIST }, + description = "Only when the exchange is InOut (exchangePattern=InOut, or set in the" + + " route): the body the route ends with is sent back to the client that" + + " published, as JSON. Bytes become an array of numbers; a stream, a file" + + " or another object is sent as the text of its toString"), + producerIn = @BodyType(value = { Carrier.TEXT, Carrier.VALUE, Carrier.MAP, Carrier.LIST }, + description = "The data published to the channel, sent as JSON to the subscribed clients:" + + " text, a number or a boolean, a Map or a List. Bytes become an array of" + + " numbers; a stream, a file or another object is sent as the text of its" + + " toString: convert it first. The headers go in the ext field of the message"), + producerOut = @BodyType(Carrier.UNCHANGED)) public class CometdEndpoint extends DefaultEndpoint implements EndpointServiceLocation { private CometdComponent component; diff --git a/components/camel-grpc/src/generated/resources/META-INF/org/apache/camel/component/grpc/grpc.json b/components/camel-grpc/src/generated/resources/META-INF/org/apache/camel/component/grpc/grpc.json index d237309749cb1..4d235ea686629 100644 --- a/components/camel-grpc/src/generated/resources/META-INF/org/apache/camel/component/grpc/grpc.json +++ b/components/camel-grpc/src/generated/resources/META-INF/org/apache/camel/component/grpc/grpc.json @@ -34,6 +34,12 @@ "CamelGrpcUserAgent": { "index": 1, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "If provided, the given agent will prepend the gRPC library's user agent information", "constantName": "org.apache.camel.component.grpc.GrpcConstants#GRPC_USER_AGENT_HEADER" }, "CamelGrpcEventType": { "index": 2, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Received event type from the sent request. Possible values: onNext onCompleted onError", "constantName": "org.apache.camel.component.grpc.GrpcConstants#GRPC_EVENT_TYPE_HEADER" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "pojo" ], "byOption": [ { "option": "consumerStrategy", "value": "AGGREGATION", "carriers": [ "pojo", "list" ] }, { "option": "forwardOnCompleted", "value": "true", "carriers": [ "pojo", "null" ] } ], "description": "The protobuf request message of the called method, with the method name in the CamelGrpcMethodName header. A streaming request gives one exchange per message, or with the AGGREGATION strategy a List of all its messages. forwardOnCompleted sends no body at the end of the stream, forwardOnError the Throwable" }, + "consumerReply": { "carriers": [ "pojo", "list", "null" ], "dependsOn": [ "routeControlledStreamObserver" ], "description": "The protobuf response message, or a List of them for a streaming response; no body sends an empty message. Text, bytes or a Map fail: build the message of the method. With routeControlledStreamObserver the route replies through a producer with toRouteControlledStreamObserver" }, + "producerIn": { "carriers": [ "pojo", "list" ], "description": "The protobuf request message of the method, or a List of them for a streaming request. Text, bytes or a Map fail with an argument type mismatch: build the message first" }, + "producerOut": { "carriers": [ "list" ], "byOption": [ { "option": "synchronous", "value": "true", "carriers": [ "pojo", "list" ] }, { "option": "producerStrategy", "value": "STREAMING", "carriers": [ "unchanged" ] }, { "option": "toRouteControlledStreamObserver", "value": "true", "carriers": [ "unchanged" ] } ], "description": "A List of the protobuf response messages. With synchronous=true the response message itself, or a List of them for a streaming response. With the STREAMING strategy the body is unchanged and each response goes to the streamRepliesTo endpoint" } + }, "properties": { "host": { "index": 0, "kind": "path", "displayName": "Host", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.grpc.GrpcConfiguration", "configurationField": "configuration", "description": "The gRPC server host name. This is localhost or 0.0.0.0 when being a consumer or remote server host name when using producer." }, "port": { "index": 1, "kind": "path", "displayName": "Port", "group": "common", "label": "", "required": true, "type": "integer", "javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.grpc.GrpcConfiguration", "configurationField": "configuration", "description": "The gRPC local or remote server port" }, diff --git a/components/camel-grpc/src/main/java/org/apache/camel/component/grpc/GrpcEndpoint.java b/components/camel-grpc/src/main/java/org/apache/camel/component/grpc/GrpcEndpoint.java index cc262e8289317..ec7ace7f6be5f 100644 --- a/components/camel-grpc/src/main/java/org/apache/camel/component/grpc/GrpcEndpoint.java +++ b/components/camel-grpc/src/main/java/org/apache/camel/component/grpc/GrpcEndpoint.java @@ -20,6 +20,9 @@ import org.apache.camel.Consumer; import org.apache.camel.Processor; import org.apache.camel.Producer; +import org.apache.camel.spi.BodyType; +import org.apache.camel.spi.BodyType.Carrier; +import org.apache.camel.spi.BodyTypes; import org.apache.camel.spi.Metadata; import org.apache.camel.spi.UriEndpoint; import org.apache.camel.spi.UriParam; @@ -35,6 +38,39 @@ @Metadata(annotations = { "protocol=http", }) +@BodyTypes(consumerOut = @BodyType(value = Carrier.POJO, + byOption = { + @BodyType.When(option = "consumerStrategy", value = "AGGREGATION", + carriers = { Carrier.POJO, Carrier.LIST }), + @BodyType.When(option = "forwardOnCompleted", value = "true", + carriers = { Carrier.POJO, Carrier.NULL }) }, + description = "The protobuf request message of the called method, with the method name in" + + " the CamelGrpcMethodName header. A streaming request gives one exchange per" + + " message, or with the AGGREGATION strategy a List of all its messages." + + " forwardOnCompleted sends no body at the end of the stream, forwardOnError" + + " the Throwable"), + consumerReply = @BodyType(value = { Carrier.POJO, Carrier.LIST, Carrier.NULL }, + dependsOn = "routeControlledStreamObserver", + description = "The protobuf response message, or a List of them for a streaming response;" + + " no body sends an empty message. Text, bytes or a Map fail: build the" + + " message of the method. With routeControlledStreamObserver the route" + + " replies through a producer with toRouteControlledStreamObserver"), + producerIn = @BodyType(value = { Carrier.POJO, Carrier.LIST }, + description = "The protobuf request message of the method, or a List of them for a" + + " streaming request. Text, bytes or a Map fail with an argument type" + + " mismatch: build the message first"), + producerOut = @BodyType(value = Carrier.LIST, + byOption = { + @BodyType.When(option = "synchronous", value = "true", + carriers = { Carrier.POJO, Carrier.LIST }), + @BodyType.When(option = "producerStrategy", value = "STREAMING", + carriers = Carrier.UNCHANGED), + @BodyType.When(option = "toRouteControlledStreamObserver", value = "true", + carriers = Carrier.UNCHANGED) }, + description = "A List of the protobuf response messages. With synchronous=true the" + + " response message itself, or a List of them for a streaming response." + + " With the STREAMING strategy the body is unchanged and each response goes" + + " to the streamRepliesTo endpoint")) public class GrpcEndpoint extends DefaultEndpoint { @UriParam protected final GrpcConfiguration configuration; diff --git a/components/camel-jgroups-raft/src/generated/resources/META-INF/org/apache/camel/component/jgroups/raft/jgroups-raft.json b/components/camel-jgroups-raft/src/generated/resources/META-INF/org/apache/camel/component/jgroups/raft/jgroups-raft.json index 9275faf86219c..9ae0d9b25edfe 100644 --- a/components/camel-jgroups-raft/src/generated/resources/META-INF/org/apache/camel/component/jgroups/raft/jgroups-raft.json +++ b/components/camel-jgroups-raft/src/generated/resources/META-INF/org/apache/camel/component/jgroups/raft/jgroups-raft.json @@ -46,6 +46,11 @@ "CamelJGroupsRaftSetTimeout": { "index": 10, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Timeout to be used in set() operation.", "constantName": "org.apache.camel.component.jgroups.raft.JGroupsRaftConstants#HEADER_JGROUPSRAFT_SET_TIMEOUT" }, "CamelJGroupsRaftSetTimeUnit": { "index": 11, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "java.util.concurrent.TimeUnit", "enum": [ "NANOSECONDS", "MICROSECONDS", "MILLISECONDS", "SECONDS", "MINUTES", "HOURS", "DAYS" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Timeunit to be used in set() operation.", "constantName": "org.apache.camel.component.jgroups.raft.JGroupsRaftConstants#HEADER_JGROUPSRAFT_SET_TIMEUNIT" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "null" ], "description": "No body: an event for each change of the role of this member (only with enableRoleChangeEvents), with LEADER or FOLLOWER in the CamelJGroupsRaftEventType header and the state of the raft in the other headers" }, + "producerIn": { "carriers": [ "bytes", "text", "stream", "file" ], "description": "The bytes to set() in the replicated log: a byte array, or text, a stream or a file converted to bytes. A null body, a Map, a number or a POJO has no conversion to bytes and is skipped without an error: nothing is set" }, + "producerOut": { "carriers": [ "bytes", "unchanged" ], "description": "The byte array the state machine returns for the set (an empty array with the default NopStateMachine), with the state of the raft in the headers. A body that was skipped is left as it was" } + }, "properties": { "clusterName": { "index": 0, "kind": "path", "displayName": "Cluster Name", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The name of the JGroupsraft cluster the component should connect to." }, "enableRoleChangeEvents": { "index": 1, "kind": "parameter", "displayName": "Enable Role Change Events", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "If set to true, the consumer endpoint will receive roleChange event as well (not just connecting and\/or using the state machine). By default it is set to false." }, diff --git a/components/camel-jgroups-raft/src/main/java/org/apache/camel/component/jgroups/raft/JGroupsRaftEndpoint.java b/components/camel-jgroups-raft/src/main/java/org/apache/camel/component/jgroups/raft/JGroupsRaftEndpoint.java index 4f0b69038410d..b0d16e839aae1 100644 --- a/components/camel-jgroups-raft/src/main/java/org/apache/camel/component/jgroups/raft/JGroupsRaftEndpoint.java +++ b/components/camel-jgroups-raft/src/main/java/org/apache/camel/component/jgroups/raft/JGroupsRaftEndpoint.java @@ -24,6 +24,9 @@ import org.apache.camel.Exchange; import org.apache.camel.Processor; import org.apache.camel.Producer; +import org.apache.camel.spi.BodyType; +import org.apache.camel.spi.BodyType.Carrier; +import org.apache.camel.spi.BodyTypes; import org.apache.camel.spi.Metadata; import org.apache.camel.spi.UriEndpoint; import org.apache.camel.spi.UriParam; @@ -40,6 +43,19 @@ */ @UriEndpoint(firstVersion = "2.24.0", scheme = "jgroups-raft", title = "JGroups raft", syntax = "jgroup-raft:clusterName", category = { Category.CLUSTERING, Category.MESSAGING }, headersClass = JGroupsRaftConstants.class) +@BodyTypes(consumerOut = @BodyType(value = Carrier.NULL, + description = "No body: an event for each change of the role of this member (only with" + + " enableRoleChangeEvents), with LEADER or FOLLOWER in the" + + " CamelJGroupsRaftEventType header and the state of the raft in the other" + + " headers"), + producerIn = @BodyType(value = { Carrier.BYTES, Carrier.TEXT, Carrier.STREAM, Carrier.FILE }, + description = "The bytes to set() in the replicated log: a byte array, or text, a stream or" + + " a file converted to bytes. A null body, a Map, a number or a POJO has no" + + " conversion to bytes and is skipped without an error: nothing is set"), + producerOut = @BodyType(value = { Carrier.BYTES, Carrier.UNCHANGED }, + description = "The byte array the state machine returns for the set (an empty array with" + + " the default NopStateMachine), with the state of the raft in the headers. A" + + " body that was skipped is left as it was")) public class JGroupsRaftEndpoint extends DefaultEndpoint { private static final Logger LOG = LoggerFactory.getLogger(JGroupsRaftEndpoint.class); diff --git a/components/camel-jgroups/src/generated/resources/META-INF/org/apache/camel/component/jgroups/jgroups.json b/components/camel-jgroups/src/generated/resources/META-INF/org/apache/camel/component/jgroups/jgroups.json index 5b19bbf465e0f..79a55abbdfa92 100644 --- a/components/camel-jgroups/src/generated/resources/META-INF/org/apache/camel/component/jgroups/jgroups.json +++ b/components/camel-jgroups/src/generated/resources/META-INF/org/apache/camel/component/jgroups/jgroups.json @@ -39,6 +39,11 @@ "CamelJGroupsSrc": { "index": 2, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "org.jgroups.Address", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Consumer : The org.jgroups.Address instance extracted by org.jgroups.Message.getSrc() method of the consumed message. Producer: The custom source org.jgroups.Address of the message to be sent.", "constantName": "org.apache.camel.component.jgroups.JGroupsConstants#HEADER_JGROUPS_SRC" }, "CamelJGroupsOriginalMessage": { "index": 3, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "org.jgroups.Message", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The original org.jgroups.Message instance from which the body of the consumed message has been extracted.", "constantName": "org.apache.camel.component.jgroups.JGroupsConstants#HEADER_JGROUPS_ORIGINAL_MESSAGE" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "unknown" ], "dependsOn": [ "enableViewMessages" ], "description": "The object the sender put in the message, Java-deserialized: what a jgroups producer sent, such as a String, a byte array, a Map or a Serializable POJO, if the deserialization filter accepts its class. With enableViewMessages an org.jgroups.View also arrives on each change of the members of the cluster" }, + "producerIn": { "carriers": [ "text", "bytes", "value", "map", "list", "file", "pojo" ], "description": "The body as is, Java-serialized into the message, so it must be Serializable: a stream or another object that is not fails with a NotSerializableException. A null body is not sent. The CamelJGroupsDest header sends it to one member instead of the cluster" }, + "producerOut": { "carriers": [ "unchanged" ] } + }, "properties": { "clusterName": { "index": 0, "kind": "path", "displayName": "Cluster Name", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The name of the JGroups cluster the component should connect to." }, "channelProperties": { "index": 1, "kind": "parameter", "displayName": "Channel Properties", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Specifies configuration properties of the JChannel used by the endpoint." }, diff --git a/components/camel-jgroups/src/main/java/org/apache/camel/component/jgroups/JGroupsEndpoint.java b/components/camel-jgroups/src/main/java/org/apache/camel/component/jgroups/JGroupsEndpoint.java index 9a88d432c277a..eb5b1e42d3f15 100644 --- a/components/camel-jgroups/src/main/java/org/apache/camel/component/jgroups/JGroupsEndpoint.java +++ b/components/camel-jgroups/src/main/java/org/apache/camel/component/jgroups/JGroupsEndpoint.java @@ -26,6 +26,9 @@ import org.apache.camel.Exchange; import org.apache.camel.Processor; import org.apache.camel.Producer; +import org.apache.camel.spi.BodyType; +import org.apache.camel.spi.BodyType.Carrier; +import org.apache.camel.spi.BodyTypes; import org.apache.camel.spi.Metadata; import org.apache.camel.spi.UriEndpoint; import org.apache.camel.spi.UriParam; @@ -47,6 +50,20 @@ */ @UriEndpoint(firstVersion = "2.13.0", scheme = "jgroups", title = "JGroups", syntax = "jgroups:clusterName", category = { Category.CLUSTERING, Category.MESSAGING }, headersClass = JGroupsConstants.class) +@BodyTypes(consumerOut = @BodyType(value = Carrier.UNKNOWN, dependsOn = "enableViewMessages", + description = "The object the sender put in the message, Java-deserialized: what a jgroups" + + " producer sent, such as a String, a byte array, a Map or a Serializable" + + " POJO, if the deserialization filter accepts its class. With" + + " enableViewMessages an org.jgroups.View also arrives on each change of the" + + " members of the cluster"), + producerIn = @BodyType(value = { + Carrier.TEXT, Carrier.BYTES, Carrier.VALUE, Carrier.MAP, Carrier.LIST, + Carrier.FILE, Carrier.POJO }, + description = "The body as is, Java-serialized into the message, so it must be" + + " Serializable: a stream or another object that is not fails with a" + + " NotSerializableException. A null body is not sent. The CamelJGroupsDest header" + + " sends it to one member instead of the cluster"), + producerOut = @BodyType(Carrier.UNCHANGED)) public class JGroupsEndpoint extends DefaultEndpoint { private static final Logger LOG = LoggerFactory.getLogger(JGroupsEndpoint.class); diff --git a/components/camel-lumberjack/src/generated/resources/META-INF/org/apache/camel/component/lumberjack/lumberjack.json b/components/camel-lumberjack/src/generated/resources/META-INF/org/apache/camel/component/lumberjack/lumberjack.json index f2637d8720d55..654bbc210b4c4 100644 --- a/components/camel-lumberjack/src/generated/resources/META-INF/org/apache/camel/component/lumberjack/lumberjack.json +++ b/components/camel-lumberjack/src/generated/resources/META-INF/org/apache/camel/component/lumberjack/lumberjack.json @@ -29,6 +29,9 @@ "sslContextParameters": { "index": 2, "kind": "property", "displayName": "Ssl Context Parameters", "group": "security", "label": "security", "required": false, "type": "object", "javaType": "org.apache.camel.support.jsse.SSLContextParameters", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the default SSL configuration to use for all the endpoints. You can also configure it directly at the endpoint level." }, "useGlobalSslContextParameters": { "index": 3, "kind": "property", "displayName": "Use Global Ssl Context Parameters", "group": "security", "label": "security", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Enable usage of global SSL context parameters." } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "map", "list", "text", "value", "null" ], "description": "The log event: a Map of its fields, such as message, source and host, with the nested objects as Maps and the arrays as Lists. A JSON frame that is not an object gives a List, a String, a number, a boolean or null" } + }, "properties": { "host": { "index": 0, "kind": "path", "displayName": "Host", "group": "consumer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Network interface on which to listen for Lumberjack" }, "port": { "index": 1, "kind": "path", "displayName": "Port", "group": "consumer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 5044, "description": "Network port on which to listen for Lumberjack" }, diff --git a/components/camel-lumberjack/src/main/java/org/apache/camel/component/lumberjack/LumberjackEndpoint.java b/components/camel-lumberjack/src/main/java/org/apache/camel/component/lumberjack/LumberjackEndpoint.java index 98d0c0645e69d..33c5b3a23ea65 100644 --- a/components/camel-lumberjack/src/main/java/org/apache/camel/component/lumberjack/LumberjackEndpoint.java +++ b/components/camel-lumberjack/src/main/java/org/apache/camel/component/lumberjack/LumberjackEndpoint.java @@ -24,6 +24,9 @@ import org.apache.camel.Category; import org.apache.camel.Processor; import org.apache.camel.Producer; +import org.apache.camel.spi.BodyType; +import org.apache.camel.spi.BodyType.Carrier; +import org.apache.camel.spi.BodyTypes; import org.apache.camel.spi.Metadata; import org.apache.camel.spi.UriEndpoint; import org.apache.camel.spi.UriParam; @@ -36,6 +39,10 @@ */ @UriEndpoint(firstVersion = "2.18.0", scheme = "lumberjack", title = "Lumberjack", syntax = "lumberjack:host:port", consumerOnly = true, category = { Category.MONITORING }) +@BodyTypes(consumerOut = @BodyType(value = { Carrier.MAP, Carrier.LIST, Carrier.TEXT, Carrier.VALUE, Carrier.NULL }, + description = "The log event: a Map of its fields, such as message, source and host, with" + + " the nested objects as Maps and the arrays as Lists. A JSON frame that is" + + " not an object gives a List, a String, a number, a boolean or null")) public class LumberjackEndpoint extends DefaultEndpoint { @UriPath(description = "Network interface on which to listen for Lumberjack") @Metadata(required = true) diff --git a/components/camel-mina-sftp/src/generated/resources/META-INF/org/apache/camel/component/file/remote/mina/mina-sftp.json b/components/camel-mina-sftp/src/generated/resources/META-INF/org/apache/camel/component/file/remote/mina/mina-sftp.json index 6cae8c76d1cb1..813150fd16b4e 100644 --- a/components/camel-mina-sftp/src/generated/resources/META-INF/org/apache/camel/component/file/remote/mina/mina-sftp.json +++ b/components/camel-mina-sftp/src/generated/resources/META-INF/org/apache/camel/component/file/remote/mina/mina-sftp.json @@ -49,6 +49,11 @@ "CamelFtpReplyCode": { "index": 15, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "important": true, "description": "The FTP client reply code", "constantName": "org.apache.camel.component.file.remote.FtpConstants#FTP_REPLY_CODE" }, "CamelFtpReplyString": { "index": 16, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "important": true, "description": "The FTP client reply string", "constantName": "org.apache.camel.component.file.remote.FtpConstants#FTP_REPLY_STRING" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "file" ], "dependsOn": [ "preMove" ], "byOption": [ { "option": "streamDownload", "value": "true", "carriers": [ "stream" ] }, { "option": "download", "value": "false", "carriers": [ "null" ] } ], "description": "The file as read: a RemoteFile, which converts to text, bytes or a stream; a stream with streamDownload; with preMove its content, a byte array" }, + "producerIn": { "carriers": [ "text", "bytes", "stream", "file" ], "byOption": [ { "option": "allowNullBody", "value": "true", "carriers": [ "null", "text", "bytes", "stream", "file" ] } ], "description": "What converts to an InputStream: text, bytes, a stream or a file. A Map or a List fails: marshal it first" }, + "producerOut": { "carriers": [ "unchanged" ] } + }, "properties": { "host": { "index": 0, "kind": "path", "displayName": "Host", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.file.remote.mina.MinaSftpConfiguration", "configurationField": "configuration", "description": "Hostname of the FTP server" }, "port": { "index": 1, "kind": "path", "displayName": "Port", "group": "common", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.file.remote.mina.MinaSftpConfiguration", "configurationField": "configuration", "description": "Port of the FTP server" }, diff --git a/components/camel-mina-sftp/src/main/java/org/apache/camel/component/file/remote/mina/MinaSftpEndpoint.java b/components/camel-mina-sftp/src/main/java/org/apache/camel/component/file/remote/mina/MinaSftpEndpoint.java index cee38caa334a7..656757c1171f9 100644 --- a/components/camel-mina-sftp/src/main/java/org/apache/camel/component/file/remote/mina/MinaSftpEndpoint.java +++ b/components/camel-mina-sftp/src/main/java/org/apache/camel/component/file/remote/mina/MinaSftpEndpoint.java @@ -29,6 +29,9 @@ import org.apache.camel.component.file.remote.SftpRemoteFile; import org.apache.camel.component.file.remote.mina.strategy.MinaSftpProcessStrategyFactory; import org.apache.camel.component.file.strategy.FileMoveExistingStrategy; +import org.apache.camel.spi.BodyType; +import org.apache.camel.spi.BodyType.Carrier; +import org.apache.camel.spi.BodyTypes; import org.apache.camel.spi.Metadata; import org.apache.camel.spi.UriEndpoint; import org.apache.camel.spi.UriParam; @@ -43,6 +46,20 @@ + "directoryMustExist,extendedAttributes,probeContentType,startingDirectoryMustExist," + "startingDirectoryMustHaveAccess,forceWrites,copyAndDeleteOnRenameFail," + "renameUsingCopy,synchronous") +@BodyTypes(consumerOut = @BodyType(value = Carrier.FILE, dependsOn = "preMove", + byOption = { + @BodyType.When(option = "streamDownload", value = "true", carriers = Carrier.STREAM), + @BodyType.When(option = "download", value = "false", carriers = Carrier.NULL) }, + description = "The file as read: a RemoteFile, which converts to text, bytes or a stream; a" + + " stream with streamDownload; with preMove its content, a byte array"), + producerIn = @BodyType(value = { Carrier.TEXT, Carrier.BYTES, Carrier.STREAM, Carrier.FILE }, + byOption = @BodyType.When(option = "allowNullBody", value = "true", + carriers = { + Carrier.NULL, Carrier.TEXT, Carrier.BYTES, + Carrier.STREAM, Carrier.FILE }), + description = "What converts to an InputStream: text, bytes, a stream or a file. A Map or" + + " a List fails: marshal it first"), + producerOut = @BodyType(Carrier.UNCHANGED)) public class MinaSftpEndpoint extends RemoteFileEndpoint { @UriParam diff --git a/components/camel-mina/src/generated/resources/META-INF/org/apache/camel/component/mina/mina.json b/components/camel-mina/src/generated/resources/META-INF/org/apache/camel/component/mina/mina.json index 2c014e2d5703c..10b6c4d37ed40 100644 --- a/components/camel-mina/src/generated/resources/META-INF/org/apache/camel/component/mina/mina.json +++ b/components/camel-mina/src/generated/resources/META-INF/org/apache/camel/component/mina/mina.json @@ -61,6 +61,12 @@ "CamelMinaLocalAddress": { "index": 2, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "java.net.SocketAddress", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The socket address of local machine that received the message.", "constantName": "org.apache.camel.component.mina.MinaConstants#MINA_LOCAL_ADDRESS" }, "CamelMinaRemoteAddress": { "index": 3, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "java.net.SocketAddress", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The socket address of the remote machine that send the message.", "constantName": "org.apache.camel.component.mina.MinaConstants#MINA_REMOTE_ADDRESS" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "text" ], "javaType": "java.lang.String", "dependsOn": [ "codec", "objectCodecPattern", "transferExchange" ], "byOption": [ { "option": "protocol", "value": "udp", "carriers": [ "bytes" ], "javaType": "byte[]" }, { "option": "allowDefaultCodec", "value": "false", "carriers": [ "pojo" ], "javaType": "org.apache.mina.core.buffer.IoBuffer" } ], "description": "The data received as a String: one line with textline=true. The default object codec over TCP accepts only a String unless objectCodecPattern lists the classes to deserialize. Over UDP the datagram as a byte array" }, + "consumerReply": { "carriers": [ "null", "text" ], "dependsOn": [ "codec", "transferExchange" ], "byOption": [ { "option": "protocol", "value": "udp", "carriers": [ "null", "text", "bytes", "stream", "file" ] }, { "option": "allowDefaultCodec", "value": "false", "carriers": [ "null", "pojo" ], "javaType": "org.apache.mina.core.buffer.IoBuffer" } ], "description": "The body the route ends with is written back to the caller, also with sync=false. Send a String: with textline=true other bodies are written with toString(), and the object codec writes any Serializable object, which a Mina client accepts only when its objectCodecPattern lists the class. No body sends nothing and closes the connection" }, + "producerIn": { "carriers": [ "null", "text" ], "dependsOn": [ "codec", "transferExchange" ], "byOption": [ { "option": "textline", "value": "true", "carriers": [ "any" ] }, { "option": "protocol", "value": "udp", "carriers": [ "null", "text", "bytes", "stream", "file" ] }, { "option": "allowDefaultCodec", "value": "false", "carriers": [ "null", "pojo" ], "javaType": "org.apache.mina.core.buffer.IoBuffer" } ], "description": "The data to send: a String. The default object codec over TCP serializes the body, but a Mina server accepts only a String unless its objectCodecPattern lists the class, and a stream fails; textline=true converts any body to a line of text. No body sends nothing" }, + "producerOut": { "carriers": [ "text", "null" ], "javaType": "java.lang.String", "dependsOn": [ "codec", "objectCodecPattern", "transferExchange" ], "byOption": [ { "option": "sync", "value": "false", "carriers": [ "unchanged", "null" ] }, { "option": "protocol", "value": "udp", "carriers": [ "bytes", "null" ], "javaType": "byte[]" }, { "option": "allowDefaultCodec", "value": "false", "carriers": [ "pojo", "null" ], "javaType": "org.apache.mina.core.buffer.IoBuffer" } ], "description": "With sync=true (the default) the reply of the server as a String, or a byte array over UDP. No body is not sent and stays null. With sync=false an InOut exchange ends with an empty message" } + }, "properties": { "protocol": { "index": 0, "kind": "path", "displayName": "Protocol", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.mina.MinaConfiguration", "configurationField": "configuration", "description": "Protocol to use" }, "host": { "index": 1, "kind": "path", "displayName": "Host", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.mina.MinaConfiguration", "configurationField": "configuration", "description": "Hostname to use. Use localhost or 0.0.0.0 for local server as consumer. For producer use the hostname or ip address of the remote server." }, diff --git a/components/camel-mina/src/main/java/org/apache/camel/component/mina/MinaEndpoint.java b/components/camel-mina/src/main/java/org/apache/camel/component/mina/MinaEndpoint.java index 8290fd59380e4..0ce86273caf5e 100644 --- a/components/camel-mina/src/main/java/org/apache/camel/component/mina/MinaEndpoint.java +++ b/components/camel-mina/src/main/java/org/apache/camel/component/mina/MinaEndpoint.java @@ -22,6 +22,9 @@ import org.apache.camel.MultipleConsumersSupport; import org.apache.camel.Processor; import org.apache.camel.Producer; +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; @@ -33,6 +36,61 @@ */ @UriEndpoint(firstVersion = "2.10.0", scheme = "mina", title = "Mina", syntax = "mina:protocol:host:port", category = { Category.NETWORKING }, headersClass = MinaConstants.class) +@BodyTypes(consumerOut = @BodyType(value = Carrier.TEXT, javaType = "java.lang.String", + dependsOn = { "codec", "objectCodecPattern", "transferExchange" }, + byOption = { + @BodyType.When(option = "protocol", value = "udp", carriers = Carrier.BYTES, + javaType = "byte[]"), + @BodyType.When(option = "allowDefaultCodec", value = "false", + carriers = Carrier.POJO, + javaType = "org.apache.mina.core.buffer.IoBuffer") }, + description = "The data received as a String: one line with textline=true. The default" + + " object codec over TCP accepts only a String unless objectCodecPattern" + + " lists the classes to deserialize. Over UDP the datagram as a byte array"), + consumerReply = @BodyType(value = { Carrier.NULL, Carrier.TEXT }, + dependsOn = { "codec", "transferExchange" }, + byOption = { + @BodyType.When(option = "protocol", value = "udp", + carriers = { + Carrier.NULL, Carrier.TEXT, Carrier.BYTES, + Carrier.STREAM, Carrier.FILE }), + @BodyType.When(option = "allowDefaultCodec", value = "false", + carriers = { Carrier.NULL, Carrier.POJO }, + javaType = "org.apache.mina.core.buffer.IoBuffer") }, + description = "The body the route ends with is written back to the caller, also with" + + " sync=false. Send a String: with textline=true other bodies are" + + " written with toString(), and the object codec writes any" + + " Serializable object, which a Mina client accepts only when its" + + " objectCodecPattern lists the class. No body sends nothing and closes" + + " the connection"), + producerIn = @BodyType(value = { Carrier.NULL, Carrier.TEXT }, + dependsOn = { "codec", "transferExchange" }, + byOption = { + @BodyType.When(option = "textline", value = "true", carriers = Carrier.ANY), + @BodyType.When(option = "protocol", value = "udp", + carriers = { + Carrier.NULL, Carrier.TEXT, Carrier.BYTES, + Carrier.STREAM, Carrier.FILE }), + @BodyType.When(option = "allowDefaultCodec", value = "false", + carriers = { Carrier.NULL, Carrier.POJO }, + javaType = "org.apache.mina.core.buffer.IoBuffer") }, + description = "The data to send: a String. The default object codec over TCP serializes" + + " the body, but a Mina server accepts only a String unless its" + + " objectCodecPattern lists the class, and a stream fails; textline=true" + + " converts any body to a line of text. No body sends nothing"), + producerOut = @BodyType(value = { Carrier.TEXT, Carrier.NULL }, javaType = "java.lang.String", + dependsOn = { "codec", "objectCodecPattern", "transferExchange" }, + byOption = { + @BodyType.When(option = "sync", value = "false", + carriers = { Carrier.UNCHANGED, Carrier.NULL }), + @BodyType.When(option = "protocol", value = "udp", + carriers = { Carrier.BYTES, Carrier.NULL }, javaType = "byte[]"), + @BodyType.When(option = "allowDefaultCodec", value = "false", + carriers = { Carrier.POJO, Carrier.NULL }, + javaType = "org.apache.mina.core.buffer.IoBuffer") }, + description = "With sync=true (the default) the reply of the server as a String, or a" + + " byte array over UDP. No body is not sent and stays null. With" + + " sync=false an InOut exchange ends with an empty message")) public class MinaEndpoint extends DefaultEndpoint implements MultipleConsumersSupport, EndpointServiceLocation { @UriParam diff --git a/components/camel-mllp/src/generated/resources/META-INF/org/apache/camel/component/mllp/mllp.json b/components/camel-mllp/src/generated/resources/META-INF/org/apache/camel/component/mllp/mllp.json index fe54a6d994503..43f0221ec6c19 100644 --- a/components/camel-mllp/src/generated/resources/META-INF/org/apache/camel/component/mllp/mllp.json +++ b/components/camel-mllp/src/generated/resources/META-INF/org/apache/camel/component/mllp/mllp.json @@ -85,6 +85,12 @@ "CamelMllpVersionId": { "index": 21, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "MSH-12 value", "constantName": "org.apache.camel.component.mllp.MllpConstants#MLLP_VERSION_ID" }, "CamelMllpCharset": { "index": 22, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "MSH-18 value", "constantName": "org.apache.camel.component.mllp.MllpConstants#MLLP_CHARSET" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "text" ], "javaType": "java.lang.String", "byOption": [ { "option": "stringPayload", "value": "false", "carriers": [ "bytes" ], "javaType": "byte[]" } ], "description": "The HL7 message without the MLLP envelope, as a String in the charset of MSH-18 or charsetName, or a byte array with stringPayload=false" }, + "consumerReply": { "carriers": [ "any" ], "description": "The body is not sent back: the acknowledgement is the CamelMllpAcknowledgement or CamelMllpAcknowledgementString exchange property, or with autoAck an HL7 ACK (AA, or AE when the exchange failed)" }, + "producerIn": { "carriers": [ "text", "bytes" ], "description": "The HL7 message as a String or a byte array. No body fails; another body, such as a stream, is sent as an empty message: convert it to a String first" }, + "producerOut": { "carriers": [ "unchanged" ], "description": "The body is left as it was: with InOut the acknowledgement is in the CamelMllpAcknowledgement (byte array) and CamelMllpAcknowledgementString headers" } + }, "properties": { "hostname": { "index": 0, "kind": "path", "displayName": "Hostname", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Hostname or IP for connection for the TCP connection. The default value is null, which means any local IP address" }, "port": { "index": 1, "kind": "path", "displayName": "Port", "group": "common", "label": "", "required": true, "type": "integer", "javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Port number for the TCP connection" }, diff --git a/components/camel-mllp/src/main/docs/mllp-component.adoc b/components/camel-mllp/src/main/docs/mllp-component.adoc index 0321f09b751f5..383a40fc15041 100644 --- a/components/camel-mllp/src/main/docs/mllp-component.adoc +++ b/components/camel-mllp/src/main/docs/mllp-component.adoc @@ -30,8 +30,9 @@ The component supports the following: * A Camel consumer using a TCP Server * A Camel producer using a TCP Client -The MLLP component use `byte[]` payloads, and relies on Camel type -conversion to convert `byte[]` to other types. +The MLLP consumer gives the HL7 payload as a `String` by default +(`stringPayload=true`), or as a `byte[]` with `stringPayload=false`. +The MLLP producer sends a `String` or a `byte[]` body. Maven users will need to add the following dependency to their pom.xml for this component: diff --git a/components/camel-mllp/src/main/java/org/apache/camel/component/mllp/MllpEndpoint.java b/components/camel-mllp/src/main/java/org/apache/camel/component/mllp/MllpEndpoint.java index 736baea8551b2..6b4ed87a1f590 100644 --- a/components/camel-mllp/src/main/java/org/apache/camel/component/mllp/MllpEndpoint.java +++ b/components/camel-mllp/src/main/java/org/apache/camel/component/mllp/MllpEndpoint.java @@ -30,6 +30,9 @@ import org.apache.camel.Producer; import org.apache.camel.api.management.ManagedAttribute; import org.apache.camel.api.management.ManagedResource; +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; @@ -52,6 +55,24 @@ @UriEndpoint(scheme = "mllp", firstVersion = "2.17.0", title = "MLLP", syntax = "mllp:hostname:port", category = { Category.HEALTH }, generateConfigurer = true, headersClass = MllpConstants.class) +@BodyTypes(consumerOut = @BodyType(value = Carrier.TEXT, javaType = "java.lang.String", + byOption = @BodyType.When(option = "stringPayload", value = "false", + carriers = Carrier.BYTES, javaType = "byte[]"), + description = "The HL7 message without the MLLP envelope, as a String in the charset of" + + " MSH-18 or charsetName, or a byte array with stringPayload=false"), + consumerReply = @BodyType(value = Carrier.ANY, + description = "The body is not sent back: the acknowledgement is the" + + " CamelMllpAcknowledgement or CamelMllpAcknowledgementString exchange" + + " property, or with autoAck an HL7 ACK (AA, or AE when the exchange" + + " failed)"), + producerIn = @BodyType(value = { Carrier.TEXT, Carrier.BYTES }, + description = "The HL7 message as a String or a byte array. No body fails; another body," + + " such as a stream, is sent as an empty message: convert it to a String" + + " first"), + producerOut = @BodyType(value = Carrier.UNCHANGED, + description = "The body is left as it was: with InOut the acknowledgement is in the" + + " CamelMllpAcknowledgement (byte array) and" + + " CamelMllpAcknowledgementString headers")) public class MllpEndpoint extends DefaultEndpoint implements EndpointServiceLocation { @UriPath diff --git a/components/camel-quickfix/src/generated/resources/META-INF/org/apache/camel/component/quickfixj/quickfix.json b/components/camel-quickfix/src/generated/resources/META-INF/org/apache/camel/component/quickfixj/quickfix.json index eb99136595614..e4a007573f980 100644 --- a/components/camel-quickfix/src/generated/resources/META-INF/org/apache/camel/component/quickfixj/quickfix.json +++ b/components/camel-quickfix/src/generated/resources/META-INF/org/apache/camel/component/quickfixj/quickfix.json @@ -38,6 +38,12 @@ "SessionID": { "index": 1, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "quickfix.SessionID", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The FIX message SessionID.", "constantName": "org.apache.camel.component.quickfixj.QuickfixjEndpoint#SESSION_ID_KEY" }, "MessageType": { "index": 2, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The FIX MsgType tag value.", "constantName": "org.apache.camel.component.quickfixj.QuickfixjEndpoint#MESSAGE_TYPE_KEY" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "pojo", "null" ], "description": "The FIX message: a quickfix.Message, such as a quickfix.fix44.Email, with the kind of event in the EventCategory header and the MsgType in the MessageType header. SessionCreated, SessionLogon and SessionLogoff events have no body" }, + "consumerReply": { "carriers": [ "pojo", "text", "bytes" ], "description": "With exchangePattern=InOut, the reply sent back on the session of the request: a quickfix.Message, or the FIX message as text or bytes. Every event is answered with the body the route ends with: a route that sets no reply sends back the message it received" }, + "producerIn": { "carriers": [ "pojo", "text", "bytes" ], "description": "The FIX message to send: a quickfix.Message, or the FIX message as text or bytes, parsed with the DataDictionary exchange property or the data dictionary of the session. A stream, a Map or no body fails" }, + "producerOut": { "carriers": [ "unchanged", "pojo" ], "description": "The body is left as it was. An InOut exchange waits for the reply that matches the CorrelationCriteria exchange property, and the reply quickfix.Message is the body" } + }, "properties": { "configurationName": { "index": 0, "kind": "path", "displayName": "Configuration Name", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "supportFileReference": true, "description": "Path to the quickfix configuration file. You can prefix with: classpath, file, http, ref, or bean. classpath, file and http loads the configuration file using these protocols (classpath is default). ref will lookup the configuration file in the registry. bean will call a method on a bean to be used as the configuration. For bean you can specify the method name after dot, eg bean:myBean.myMethod" }, "lazyCreateEngine": { "index": 1, "kind": "parameter", "displayName": "Lazy Create Engine", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "This option allows creating QuickFIX\/J engine on demand. Value true means the engine is started when first message is send or there's consumer configured in route definition. When false value is used, the engine is started at the endpoint creation. When this parameter is missing, the value of component's property lazyCreateEngines is being used." }, diff --git a/components/camel-quickfix/src/main/docs/quickfix-component.adoc b/components/camel-quickfix/src/main/docs/quickfix-component.adoc index 241f122c61707..61d92dbca9fa1 100644 --- a/components/camel-quickfix/src/main/docs/quickfix-component.adoc +++ b/components/camel-quickfix/src/main/docs/quickfix-component.adoc @@ -307,9 +307,11 @@ The correlation criteria is defined with a `MessagePredicate` object. The following example will treat a FIX `ExecutionReport` from the specified session where the transaction type is STATUS and the Order ID -matches our request. The session ID should be for the __requestor__, the -sender and target CompID fields -will be reversed when looking for the reply. +matches our request. The SenderCompID and TargetCompID of the session ID are +matched as given against the header of the reply, so use the session ID as +the __replier__ sees it: for a request sent on `FIX.4.2:TRADER->MARKET`, use +`FIX.4.2:MARKET->TRADER`. The correlation criteria is required for an InOut +exchange. ._Java-only: programmatic correlation criteria setup using QuickFIX/J API_ [source,java] diff --git a/components/camel-quickfix/src/main/java/org/apache/camel/component/quickfixj/QuickfixjEndpoint.java b/components/camel-quickfix/src/main/java/org/apache/camel/component/quickfixj/QuickfixjEndpoint.java index e9913b16ca162..0049fad2e67ba 100644 --- a/components/camel-quickfix/src/main/java/org/apache/camel/component/quickfixj/QuickfixjEndpoint.java +++ b/components/camel-quickfix/src/main/java/org/apache/camel/component/quickfixj/QuickfixjEndpoint.java @@ -30,6 +30,9 @@ import org.apache.camel.Producer; import org.apache.camel.ResolveEndpointFailedException; import org.apache.camel.component.quickfixj.converter.QuickfixjConverters; +import org.apache.camel.spi.BodyType; +import org.apache.camel.spi.BodyType.Carrier; +import org.apache.camel.spi.BodyTypes; import org.apache.camel.spi.Metadata; import org.apache.camel.spi.UriEndpoint; import org.apache.camel.spi.UriParam; @@ -46,6 +49,24 @@ */ @UriEndpoint(firstVersion = "2.1.0", scheme = "quickfix", title = "QuickFix", syntax = "quickfix:configurationName", category = { Category.MESSAGING }, headersClass = QuickfixjEndpoint.class) +@BodyTypes(consumerOut = @BodyType(value = { Carrier.POJO, Carrier.NULL }, + description = "The FIX message: a quickfix.Message, such as a quickfix.fix44.Email, with" + + " the kind of event in the EventCategory header and the MsgType in the" + + " MessageType header. SessionCreated, SessionLogon and SessionLogoff" + + " events have no body"), + consumerReply = @BodyType(value = { Carrier.POJO, Carrier.TEXT, Carrier.BYTES }, + description = "With exchangePattern=InOut, the reply sent back on the session of the" + + " request: a quickfix.Message, or the FIX message as text or bytes." + + " Every event is answered with the body the route ends with: a route" + + " that sets no reply sends back the message it received"), + producerIn = @BodyType(value = { Carrier.POJO, Carrier.TEXT, Carrier.BYTES }, + description = "The FIX message to send: a quickfix.Message, or the FIX message as text or" + + " bytes, parsed with the DataDictionary exchange property or the data" + + " dictionary of the session. A stream, a Map or no body fails"), + producerOut = @BodyType(value = { Carrier.UNCHANGED, Carrier.POJO }, + description = "The body is left as it was. An InOut exchange waits for the reply that" + + " matches the CorrelationCriteria exchange property, and the reply" + + " quickfix.Message is the body")) public class QuickfixjEndpoint extends DefaultEndpoint implements QuickfixjEventListener, MultipleConsumersSupport { @Metadata(description = "The event category.", javaType = "org.apache.camel.component.quickfixj.QuickfixjEventCategory") public static final String EVENT_CATEGORY_KEY = "EventCategory"; diff --git a/components/camel-thrift/src/generated/resources/META-INF/org/apache/camel/component/thrift/thrift.json b/components/camel-thrift/src/generated/resources/META-INF/org/apache/camel/component/thrift/thrift.json index 0826fcc5dc0a9..c5bcd0520b7d9 100644 --- a/components/camel-thrift/src/generated/resources/META-INF/org/apache/camel/component/thrift/thrift.json +++ b/components/camel-thrift/src/generated/resources/META-INF/org/apache/camel/component/thrift/thrift.json @@ -32,6 +32,12 @@ "headers": { "CamelThriftMethodName": { "index": 0, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Method name handled by the consumer service", "constantName": "org.apache.camel.component.thrift.ThriftConstants#THRIFT_METHOD_NAME_HEADER" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "list", "null" ], "byOption": [ { "option": "synchronous", "value": "true", "carriers": [ "list" ] } ], "description": "A List of the arguments of the called method, in the order of the IDL, with the method name in the CamelThriftMethodName header. A method without arguments gives no body, or an empty List with synchronous=true" }, + "consumerReply": { "carriers": [ "any" ], "description": "The result of the method: the body is converted to its return type, so text works for an i32, and a struct result needs the Thrift struct. Ignored for a void method. A body that does not convert gives the client an error, or a null result from the asynchronous server" }, + "producerIn": { "carriers": [ "list", "pojo", "text", "null" ], "description": "A List of the arguments of the method, in the order of the IDL; a body that is not a List is the one argument, no body calls a method without arguments. A binary argument is a ByteBuffer, not a byte array; a method whose one argument is a list needs it wrapped in a List" }, + "producerOut": { "carriers": [ "unknown" ], "description": "The result of the method, of its return type in the IDL: a number, a boolean, a String, a ByteBuffer, a Thrift struct, or a List, Set or Map; no body for a void or oneway method" } + }, "properties": { "host": { "index": 0, "kind": "path", "displayName": "Host", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.thrift.ThriftConfiguration", "configurationField": "configuration", "description": "The Thrift server host name. This is localhost or 0.0.0.0 (if not defined) when being a consumer or remote server host name when using producer." }, "port": { "index": 1, "kind": "path", "displayName": "Port", "group": "common", "label": "", "required": true, "type": "integer", "javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.thrift.ThriftConfiguration", "configurationField": "configuration", "description": "The Thrift server port" }, diff --git a/components/camel-thrift/src/main/java/org/apache/camel/component/thrift/ThriftEndpoint.java b/components/camel-thrift/src/main/java/org/apache/camel/component/thrift/ThriftEndpoint.java index 0d8afaf8f0a38..ccce13c1a798e 100644 --- a/components/camel-thrift/src/main/java/org/apache/camel/component/thrift/ThriftEndpoint.java +++ b/components/camel-thrift/src/main/java/org/apache/camel/component/thrift/ThriftEndpoint.java @@ -20,6 +20,9 @@ import org.apache.camel.Consumer; import org.apache.camel.Processor; import org.apache.camel.Producer; +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; @@ -31,6 +34,25 @@ */ @UriEndpoint(firstVersion = "2.20.0", scheme = "thrift", title = "Thrift", syntax = "thrift:host:port/service", category = { Category.RPC, Category.TRANSFORMATION }, headersClass = ThriftConstants.class) +@BodyTypes(consumerOut = @BodyType(value = { Carrier.LIST, Carrier.NULL }, + byOption = @BodyType.When(option = "synchronous", value = "true", carriers = Carrier.LIST), + description = "A List of the arguments of the called method, in the order of the IDL, with" + + " the method name in the CamelThriftMethodName header. A method without" + + " arguments gives no body, or an empty List with synchronous=true"), + consumerReply = @BodyType(value = Carrier.ANY, + description = "The result of the method: the body is converted to its return type, so" + + " text works for an i32, and a struct result needs the Thrift struct." + + " Ignored for a void method. A body that does not convert gives the client an" + + " error, or a null result from the asynchronous server"), + producerIn = @BodyType(value = { Carrier.LIST, Carrier.POJO, Carrier.TEXT, Carrier.NULL }, + description = "A List of the arguments of the method, in the order of the IDL; a body that" + + " is not a List is the one argument, no body calls a method without" + + " arguments. A binary argument is a ByteBuffer, not a byte array; a method" + + " whose one argument is a list needs it wrapped in a List"), + producerOut = @BodyType(value = Carrier.UNKNOWN, + description = "The result of the method, of its return type in the IDL: a number, a" + + " boolean, a String, a ByteBuffer, a Thrift struct, or a List, Set or Map;" + + " no body for a void or oneway method")) public class ThriftEndpoint extends DefaultEndpoint implements EndpointServiceLocation { @UriParam private ThriftConfiguration configuration;