diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/imap.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/imap.json index 9b89885303570..0546a307010a8 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/imap.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/imap.json @@ -95,6 +95,11 @@ "CamelMailDelete": { "index": 9, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Deletes the messages after they have been processed.", "constantName": "org.apache.camel.component.mail.MailConstants#MAIL_DELETE" }, "CamelMailMessageId": { "index": 10, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The message ID.", "constantName": "org.apache.camel.component.mail.MailConstants#MAIL_MESSAGE_ID" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "text", "stream", "pojo" ], "dependsOn": [ "binding" ], "byOption": [ { "option": "mapMailMessage", "value": "false", "carriers": [ "pojo" ], "javaType": "jakarta.mail.Message" } ], "description": "The content of the mail an imap or pop3 consumer reads: a String for text\/plain, text\/html and text\/xml, a stream for another content type, and a jakarta.mail Multipart for a multipart mail, which converts to the text of its first text part, with the files in the attachments. The jakarta.mail.Message itself with mapMailMessage=false" }, + "producerIn": { "carriers": [ "null", "text", "bytes", "stream", "file" ], "dependsOn": [ "binding" ], "description": "The text of the mail smtp sends, in the contentType: bytes, a stream or a file are read as text, so send binary content as an attachment, and no body sends an empty text. A jakarta.mail MimeMessage is sent as it is, and a Map or a POJO as its toString(): marshal it first" }, + "producerOut": { "carriers": [ "unchanged" ], "description": "Unchanged, with the Message-ID of the mail in the CamelMailMessageId header" } + }, "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.mail.MailConfiguration", "configurationField": "configuration", "description": "The mail server host name" }, "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.mail.MailConfiguration", "configurationField": "configuration", "description": "The port number of the mail server" }, diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/imaps.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/imaps.json index f56002e989373..db9fc6854edaa 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/imaps.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/imaps.json @@ -95,6 +95,11 @@ "CamelMailDelete": { "index": 9, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Deletes the messages after they have been processed.", "constantName": "org.apache.camel.component.mail.MailConstants#MAIL_DELETE" }, "CamelMailMessageId": { "index": 10, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The message ID.", "constantName": "org.apache.camel.component.mail.MailConstants#MAIL_MESSAGE_ID" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "text", "stream", "pojo" ], "dependsOn": [ "binding" ], "byOption": [ { "option": "mapMailMessage", "value": "false", "carriers": [ "pojo" ], "javaType": "jakarta.mail.Message" } ], "description": "The content of the mail an imap or pop3 consumer reads: a String for text\/plain, text\/html and text\/xml, a stream for another content type, and a jakarta.mail Multipart for a multipart mail, which converts to the text of its first text part, with the files in the attachments. The jakarta.mail.Message itself with mapMailMessage=false" }, + "producerIn": { "carriers": [ "null", "text", "bytes", "stream", "file" ], "dependsOn": [ "binding" ], "description": "The text of the mail smtp sends, in the contentType: bytes, a stream or a file are read as text, so send binary content as an attachment, and no body sends an empty text. A jakarta.mail MimeMessage is sent as it is, and a Map or a POJO as its toString(): marshal it first" }, + "producerOut": { "carriers": [ "unchanged" ], "description": "Unchanged, with the Message-ID of the mail in the CamelMailMessageId header" } + }, "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.mail.MailConfiguration", "configurationField": "configuration", "description": "The mail server host name" }, "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.mail.MailConfiguration", "configurationField": "configuration", "description": "The port number of the mail server" }, diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/nats.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/nats.json index eca34ceb7d3c8..50696e1342789 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/nats.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/nats.json @@ -80,6 +80,12 @@ "CamelNatsDeliveryCounter": { "index": 7, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "important": true, "description": "Number of times this message has been delivered (1 = first, 1 then message has been redelivered)", "constantName": "org.apache.camel.component.nats.NatsConstants#NATS_DELIVERY_COUNTER" }, "CamelNatsManualAck": { "index": 8, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "org.apache.camel.component.nats.NatsManualAck", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The manual acknowledgment handle for JetStream messages (only set when manualAck=true).", "constantName": "org.apache.camel.component.nats.NatsConstants#NATS_MANUAL_ACK" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "bytes" ], "javaType": "byte[]", "description": "The payload of the NATS message as a byte array, empty for a message without one: convert or unmarshal it" }, + "consumerReply": { "carriers": [ "any" ], "byOption": [ { "option": "exchangePattern", "value": "InOut", "carriers": [ "text", "bytes", "stream", "file" ] } ], "description": "Only with exchangePattern=InOut is a message with a reply subject answered, with the body the route ends with: text, bytes, a stream or a file. A Map, a POJO or no body sends no reply, and the requester times out" }, + "producerIn": { "carriers": [ "text", "bytes", "stream", "file" ], "description": "What converts to a byte array: text, bytes, a stream or a file. A Map or a POJO is sent as its toString(), and a List or no body fails: marshal it first" }, + "producerOut": { "carriers": [ "unknown" ], "byOption": [ { "option": "exchangePattern", "value": "InOnly", "carriers": [ "unchanged" ] }, { "option": "exchangePattern", "value": "InOut", "carriers": [ "bytes" ], "javaType": "byte[]" } ], "description": "Unchanged for a message that expects no reply (InOnly). A message that expects one (InOut) waits for the reply, up to requestTimeout, and gets its payload as a byte array" } + }, "properties": { "topic": { "index": 0, "kind": "path", "displayName": "Topic", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.nats.NatsConfiguration", "configurationField": "configuration", "description": "The name of topic we want to use" }, "connectionTimeout": { "index": 1, "kind": "parameter", "displayName": "Connection Timeout", "group": "common", "label": "common", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 2000, "configurationClass": "org.apache.camel.component.nats.NatsConfiguration", "configurationField": "configuration", "description": "Timeout for connection attempts. (in milliseconds)" }, diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/paho.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/paho.json index 1ee428f6b2ebc..de99e56c6983c 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/paho.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/paho.json @@ -64,6 +64,11 @@ "CamelPahoRetained": { "index": 3, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Retain option.", "constantName": "org.apache.camel.component.paho.PahoConstants#CAMEL_PAHO_MSG_RETAINED" }, "CamelPahoOverrideTopic": { "index": 4, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The name of topic to override and send to instead of topic specified on endpoint.", "constantName": "org.apache.camel.component.paho.PahoConstants#CAMEL_PAHO_OVERRIDE_TOPIC" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "bytes" ], "javaType": "byte[]", "description": "The payload of the MQTT message" }, + "producerIn": { "carriers": [ "text", "bytes", "stream", "file" ], "description": "What converts to a byte array: text, bytes, a stream or a file, sent as the payload. A Map, a POJO or no body fails: marshal it first" }, + "producerOut": { "carriers": [ "unchanged" ] } + }, "properties": { "topic": { "index": 0, "kind": "path", "displayName": "Topic", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Name of the topic" }, "automaticReconnect": { "index": 1, "kind": "parameter", "displayName": "Automatic Reconnect", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "configurationClass": "org.apache.camel.component.paho.PahoConfiguration", "configurationField": "configuration", "description": "Sets whether the client will automatically attempt to reconnect to the server if the connection is lost. If set to false, the client will not attempt to automatically reconnect to the server in the event that the connection is lost. If set to true, in the event that the connection is lost, the client will attempt to reconnect to the server. It will initially wait 1 second before it attempts to reconnect, for every failed reconnect attempt, the delay will double until it is at 2 minutes at which point the delay will stay at 2 minutes." }, diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/pop3.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/pop3.json index 9fb6eff1c729c..ddc2eb7c76b91 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/pop3.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/pop3.json @@ -95,6 +95,11 @@ "CamelMailDelete": { "index": 9, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Deletes the messages after they have been processed.", "constantName": "org.apache.camel.component.mail.MailConstants#MAIL_DELETE" }, "CamelMailMessageId": { "index": 10, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The message ID.", "constantName": "org.apache.camel.component.mail.MailConstants#MAIL_MESSAGE_ID" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "text", "stream", "pojo" ], "dependsOn": [ "binding" ], "byOption": [ { "option": "mapMailMessage", "value": "false", "carriers": [ "pojo" ], "javaType": "jakarta.mail.Message" } ], "description": "The content of the mail an imap or pop3 consumer reads: a String for text\/plain, text\/html and text\/xml, a stream for another content type, and a jakarta.mail Multipart for a multipart mail, which converts to the text of its first text part, with the files in the attachments. The jakarta.mail.Message itself with mapMailMessage=false" }, + "producerIn": { "carriers": [ "null", "text", "bytes", "stream", "file" ], "dependsOn": [ "binding" ], "description": "The text of the mail smtp sends, in the contentType: bytes, a stream or a file are read as text, so send binary content as an attachment, and no body sends an empty text. A jakarta.mail MimeMessage is sent as it is, and a Map or a POJO as its toString(): marshal it first" }, + "producerOut": { "carriers": [ "unchanged" ], "description": "Unchanged, with the Message-ID of the mail in the CamelMailMessageId header" } + }, "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.mail.MailConfiguration", "configurationField": "configuration", "description": "The mail server host name" }, "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.mail.MailConfiguration", "configurationField": "configuration", "description": "The port number of the mail server" }, diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/pop3s.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/pop3s.json index c11bad9b02d48..291fa8bd7221c 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/pop3s.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/pop3s.json @@ -95,6 +95,11 @@ "CamelMailDelete": { "index": 9, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Deletes the messages after they have been processed.", "constantName": "org.apache.camel.component.mail.MailConstants#MAIL_DELETE" }, "CamelMailMessageId": { "index": 10, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The message ID.", "constantName": "org.apache.camel.component.mail.MailConstants#MAIL_MESSAGE_ID" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "text", "stream", "pojo" ], "dependsOn": [ "binding" ], "byOption": [ { "option": "mapMailMessage", "value": "false", "carriers": [ "pojo" ], "javaType": "jakarta.mail.Message" } ], "description": "The content of the mail an imap or pop3 consumer reads: a String for text\/plain, text\/html and text\/xml, a stream for another content type, and a jakarta.mail Multipart for a multipart mail, which converts to the text of its first text part, with the files in the attachments. The jakarta.mail.Message itself with mapMailMessage=false" }, + "producerIn": { "carriers": [ "null", "text", "bytes", "stream", "file" ], "dependsOn": [ "binding" ], "description": "The text of the mail smtp sends, in the contentType: bytes, a stream or a file are read as text, so send binary content as an attachment, and no body sends an empty text. A jakarta.mail MimeMessage is sent as it is, and a Map or a POJO as its toString(): marshal it first" }, + "producerOut": { "carriers": [ "unchanged" ], "description": "Unchanged, with the Message-ID of the mail in the CamelMailMessageId header" } + }, "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.mail.MailConfiguration", "configurationField": "configuration", "description": "The mail server host name" }, "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.mail.MailConfiguration", "configurationField": "configuration", "description": "The port number of the mail server" }, diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/pulsar.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/pulsar.json index 14015d1ae1fa6..f0c6b696f7f64 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/pulsar.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/pulsar.json @@ -94,6 +94,11 @@ "CamelPulsarProducerMessageDeliverAfter": { "index": 15, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Deliver the message after a given delayed time (millis).", "constantName": "org.apache.camel.component.pulsar.utils.message.PulsarMessageHeaders#DELIVER_AFTER" }, "CamelPulsarProducerMessageId": { "index": 16, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "org.apache.pulsar.client.api.MessageId", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The message id the broker assigned to the published message.", "constantName": "org.apache.camel.component.pulsar.utils.message.PulsarMessageHeaders#PRODUCER_MESSAGE_ID" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "bytes", "null" ], "javaType": "byte[]", "description": "The payload of the Pulsar message as a byte array, null for a message with a null value (a tombstone), with the key and the properties in headers: convert or unmarshal it" }, + "producerIn": { "carriers": [ "text", "bytes", "stream", "file" ], "description": "What converts to a byte array: text, bytes, a stream or a file, sent as the payload. Any other body is sent with Java serialization, a Map, a List, a number and no body too, and an object that is not Serializable fails: marshal it first" }, + "producerOut": { "carriers": [ "unchanged" ], "description": "Unchanged, also when the exchange expects a reply, with the id of the published message in a header" } + }, "properties": { "persistence": { "index": 0, "kind": "path", "displayName": "Persistence", "group": "common", "label": "", "required": true, "type": "enum", "javaType": "java.lang.String", "enum": [ "persistent", "non-persistent" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Whether the topic is persistent or non-persistent" }, "tenant": { "index": 1, "kind": "path", "displayName": "Tenant", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The tenant" }, diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/smpp.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/smpp.json index dc937fb26f6af..51702b25e413f 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/smpp.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/smpp.json @@ -82,7 +82,7 @@ "CamelSmppDestAddrNpi": { "index": 8, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "Byte", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Producer: only for SubmitSm, SubmitMulti, CancelSm and DataSm Defines the numeric plan indicator (NPI) to be used in the SME destination address parameters. Use the URI option sourceAddrNpi values defined above. Consumer: only for DataSm Defines the numeric plan indicator (NPI) in the destination address parameters. Use the URI option sourceAddrNpi values defined above.", "constantName": "org.apache.camel.component.smpp.SmppConstants#DEST_ADDR_NPI" }, "CamelSmppDestAddrTon": { "index": 9, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "Byte", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Producer: only for SubmitSm, SubmitMulti, CancelSm and DataSm Defines the type of number (TON) to be used in the SME destination address parameters. Use the sourceAddrTon URI option values defined above. Consumer: only for DataSm Defines the type of number (TON) in the destination address parameters. Use the sourceAddrTon URI option values defined above.", "constantName": "org.apache.camel.component.smpp.SmppConstants#DEST_ADDR_TON" }, "CamelSmppDoneDate": { "index": 10, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "Date", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "only for smsc DeliveryReceipt The time and date at which the short message reached it's final state. The format is as follows: YYMMDDhhmm.", "constantName": "org.apache.camel.component.smpp.SmppConstants#DONE_DATE" }, - "CamelSmppEncoding": { "index": 11, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "only for SubmitSm, SubmitMulti and DataSm. Specifies the encoding (character set name) of the bytes in the message body. If the message body is a string then this is not relevant because Java Strings are always Unicode. If the body is a byte array then this header can be used to indicate that it is ISO-8859-1 or some other value. Default value is specified by the endpoint configuration parameter _encoding_", "constantName": "org.apache.camel.component.smpp.SmppConstants#ENCODING" }, + "CamelSmppEncoding": { "index": 11, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "only for SubmitSm, SubmitMulti and ReplaceSm. Specifies the encoding (character set name) the text of the message body is encoded in, as the short message. A byte array body is first read as text, in the charset of the exchange, unless an 8-bit data coding or alphabet header sends it as it is. Default value is specified by the endpoint configuration parameter _encoding_", "constantName": "org.apache.camel.component.smpp.SmppConstants#ENCODING" }, "CamelSmppError": { "index": 12, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String or Map>>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Producer: only for SubmitMultiSm The errors which occurred by sending the short message(s) the form Map (messageID : (destAddr : address, error : errorCode)). Consumer: only for smsc DeliveryReceipt Where appropriate this may hold a Network specific error code or an SMSC error code for the attempted delivery of the message. These errors are Network or SMSC specific and are not included here.", "constantName": "org.apache.camel.component.smpp.SmppConstants#ERROR" }, "CamelSmppClass": { "index": 13, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "org.jsmpp.bean.ESMClass", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "the ASM class", "constantName": "org.apache.camel.component.smpp.SmppConstants#ESM_CLASS" }, "CamelSmppEsmeAddr": { "index": 14, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "only for AlertNotification Defines the destination ESME address. For mobile terminated messages, this is the directory number of the recipient MS.", "constantName": "org.apache.camel.component.smpp.SmppConstants#ESME_ADDR" }, @@ -114,6 +114,11 @@ "CamelSmppOptionalParameter": { "index": 40, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "Map", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Producer: only for SubmitSm, SubmitMulti and DataSm The optional parameter which are send to the SMSC. The value is converted in the following way: String - org.jsmpp.bean.OptionalParameter.COctetString, byte - org.jsmpp.bean.OptionalParameter.OctetString, Byte - org.jsmpp.bean.OptionalParameter.Byte, Integer - org.jsmpp.bean.OptionalParameter.Int, Short - org.jsmpp.bean.OptionalParameter.Short, null - org.jsmpp.bean.OptionalParameter.Null Consumer: only for DeliverSm The optional parameters send back by the SMSC. The key is the Short code for the optional parameter. The value is converted in the following way: org.jsmpp.bean.OptionalParameter.COctetString - String, org.jsmpp.bean.OptionalParameter.OctetString - byte, org.jsmpp.bean.OptionalParameter.Byte - Byte, org.jsmpp.bean.OptionalParameter.Int - Integer, org.jsmpp.bean.OptionalParameter.Short - Short, org.jsmpp.bean.OptionalParameter.Null - null", "constantName": "org.apache.camel.component.smpp.SmppConstants#OPTIONAL_PARAMETER" }, "CamelSmppSplittingPolicy": { "index": 41, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "only for SubmitSm, SubmitMulti and DataSm. Specifies the policy for message splitting for this exchange. Possible values are described in the endpoint configuration parameter _splittingPolicy_", "constantName": "org.apache.camel.component.smpp.SmppConstants#SPLITTING_POLICY" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "text", "bytes", "null" ], "description": "A short message as text decoded by its data coding, or as bytes for an 8-bit data coding; the text of a delivery receipt, with its fields in headers. A data_sm or an alert notification has no body" }, + "producerIn": { "carriers": [ "text", "bytes", "file" ], "description": "The text of the short message: bytes or a file are read as text, unless an 8-bit CamelSmppDataCoding or CamelSmppAlphabet header sends bytes as they are. A stream is sent empty and no body fails: convert it to text first; a Map or a POJO is sent as its toString(). DataSm, QuerySm and CancelSm do not read the body" }, + "producerOut": { "carriers": [ "unknown" ], "byOption": [ { "option": "exchangePattern", "value": "InOnly", "carriers": [ "unchanged" ] }, { "option": "exchangePattern", "value": "InOut", "carriers": [ "null" ] } ], "description": "Unchanged, with the message ids in the CamelSmppId header. When the exchange expects a reply (InOut), a new message with no body and only the result headers" } + }, "properties": { "host": { "index": 0, "kind": "path", "displayName": "Host", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "localhost", "configurationClass": "org.apache.camel.component.smpp.SmppConfiguration", "configurationField": "configuration", "description": "Hostname for the SMSC server to use." }, "port": { "index": 1, "kind": "path", "displayName": "Port", "group": "common", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 2775, "configurationClass": "org.apache.camel.component.smpp.SmppConfiguration", "configurationField": "configuration", "description": "Port number for the SMSC server to use." }, diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/smpps.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/smpps.json index 1adce03c7ebbb..39a2de9049af4 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/smpps.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/smpps.json @@ -82,7 +82,7 @@ "CamelSmppDestAddrNpi": { "index": 8, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "Byte", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Producer: only for SubmitSm, SubmitMulti, CancelSm and DataSm Defines the numeric plan indicator (NPI) to be used in the SME destination address parameters. Use the URI option sourceAddrNpi values defined above. Consumer: only for DataSm Defines the numeric plan indicator (NPI) in the destination address parameters. Use the URI option sourceAddrNpi values defined above.", "constantName": "org.apache.camel.component.smpp.SmppConstants#DEST_ADDR_NPI" }, "CamelSmppDestAddrTon": { "index": 9, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "Byte", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Producer: only for SubmitSm, SubmitMulti, CancelSm and DataSm Defines the type of number (TON) to be used in the SME destination address parameters. Use the sourceAddrTon URI option values defined above. Consumer: only for DataSm Defines the type of number (TON) in the destination address parameters. Use the sourceAddrTon URI option values defined above.", "constantName": "org.apache.camel.component.smpp.SmppConstants#DEST_ADDR_TON" }, "CamelSmppDoneDate": { "index": 10, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "Date", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "only for smsc DeliveryReceipt The time and date at which the short message reached it's final state. The format is as follows: YYMMDDhhmm.", "constantName": "org.apache.camel.component.smpp.SmppConstants#DONE_DATE" }, - "CamelSmppEncoding": { "index": 11, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "only for SubmitSm, SubmitMulti and DataSm. Specifies the encoding (character set name) of the bytes in the message body. If the message body is a string then this is not relevant because Java Strings are always Unicode. If the body is a byte array then this header can be used to indicate that it is ISO-8859-1 or some other value. Default value is specified by the endpoint configuration parameter _encoding_", "constantName": "org.apache.camel.component.smpp.SmppConstants#ENCODING" }, + "CamelSmppEncoding": { "index": 11, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "only for SubmitSm, SubmitMulti and ReplaceSm. Specifies the encoding (character set name) the text of the message body is encoded in, as the short message. A byte array body is first read as text, in the charset of the exchange, unless an 8-bit data coding or alphabet header sends it as it is. Default value is specified by the endpoint configuration parameter _encoding_", "constantName": "org.apache.camel.component.smpp.SmppConstants#ENCODING" }, "CamelSmppError": { "index": 12, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String or Map>>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Producer: only for SubmitMultiSm The errors which occurred by sending the short message(s) the form Map (messageID : (destAddr : address, error : errorCode)). Consumer: only for smsc DeliveryReceipt Where appropriate this may hold a Network specific error code or an SMSC error code for the attempted delivery of the message. These errors are Network or SMSC specific and are not included here.", "constantName": "org.apache.camel.component.smpp.SmppConstants#ERROR" }, "CamelSmppClass": { "index": 13, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "org.jsmpp.bean.ESMClass", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "the ASM class", "constantName": "org.apache.camel.component.smpp.SmppConstants#ESM_CLASS" }, "CamelSmppEsmeAddr": { "index": 14, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "only for AlertNotification Defines the destination ESME address. For mobile terminated messages, this is the directory number of the recipient MS.", "constantName": "org.apache.camel.component.smpp.SmppConstants#ESME_ADDR" }, @@ -114,6 +114,11 @@ "CamelSmppOptionalParameter": { "index": 40, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "Map", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Producer: only for SubmitSm, SubmitMulti and DataSm The optional parameter which are send to the SMSC. The value is converted in the following way: String - org.jsmpp.bean.OptionalParameter.COctetString, byte - org.jsmpp.bean.OptionalParameter.OctetString, Byte - org.jsmpp.bean.OptionalParameter.Byte, Integer - org.jsmpp.bean.OptionalParameter.Int, Short - org.jsmpp.bean.OptionalParameter.Short, null - org.jsmpp.bean.OptionalParameter.Null Consumer: only for DeliverSm The optional parameters send back by the SMSC. The key is the Short code for the optional parameter. The value is converted in the following way: org.jsmpp.bean.OptionalParameter.COctetString - String, org.jsmpp.bean.OptionalParameter.OctetString - byte, org.jsmpp.bean.OptionalParameter.Byte - Byte, org.jsmpp.bean.OptionalParameter.Int - Integer, org.jsmpp.bean.OptionalParameter.Short - Short, org.jsmpp.bean.OptionalParameter.Null - null", "constantName": "org.apache.camel.component.smpp.SmppConstants#OPTIONAL_PARAMETER" }, "CamelSmppSplittingPolicy": { "index": 41, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "only for SubmitSm, SubmitMulti and DataSm. Specifies the policy for message splitting for this exchange. Possible values are described in the endpoint configuration parameter _splittingPolicy_", "constantName": "org.apache.camel.component.smpp.SmppConstants#SPLITTING_POLICY" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "text", "bytes", "null" ], "description": "A short message as text decoded by its data coding, or as bytes for an 8-bit data coding; the text of a delivery receipt, with its fields in headers. A data_sm or an alert notification has no body" }, + "producerIn": { "carriers": [ "text", "bytes", "file" ], "description": "The text of the short message: bytes or a file are read as text, unless an 8-bit CamelSmppDataCoding or CamelSmppAlphabet header sends bytes as they are. A stream is sent empty and no body fails: convert it to text first; a Map or a POJO is sent as its toString(). DataSm, QuerySm and CancelSm do not read the body" }, + "producerOut": { "carriers": [ "unknown" ], "byOption": [ { "option": "exchangePattern", "value": "InOnly", "carriers": [ "unchanged" ] }, { "option": "exchangePattern", "value": "InOut", "carriers": [ "null" ] } ], "description": "Unchanged, with the message ids in the CamelSmppId header. When the exchange expects a reply (InOut), a new message with no body and only the result headers" } + }, "properties": { "host": { "index": 0, "kind": "path", "displayName": "Host", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "localhost", "configurationClass": "org.apache.camel.component.smpp.SmppConfiguration", "configurationField": "configuration", "description": "Hostname for the SMSC server to use." }, "port": { "index": 1, "kind": "path", "displayName": "Port", "group": "common", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 2775, "configurationClass": "org.apache.camel.component.smpp.SmppConfiguration", "configurationField": "configuration", "description": "Port number for the SMSC server to use." }, diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/smtp.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/smtp.json index d3f38498fd41f..830d658df0b5d 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/smtp.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/smtp.json @@ -95,6 +95,11 @@ "CamelMailDelete": { "index": 9, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Deletes the messages after they have been processed.", "constantName": "org.apache.camel.component.mail.MailConstants#MAIL_DELETE" }, "CamelMailMessageId": { "index": 10, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The message ID.", "constantName": "org.apache.camel.component.mail.MailConstants#MAIL_MESSAGE_ID" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "text", "stream", "pojo" ], "dependsOn": [ "binding" ], "byOption": [ { "option": "mapMailMessage", "value": "false", "carriers": [ "pojo" ], "javaType": "jakarta.mail.Message" } ], "description": "The content of the mail an imap or pop3 consumer reads: a String for text\/plain, text\/html and text\/xml, a stream for another content type, and a jakarta.mail Multipart for a multipart mail, which converts to the text of its first text part, with the files in the attachments. The jakarta.mail.Message itself with mapMailMessage=false" }, + "producerIn": { "carriers": [ "null", "text", "bytes", "stream", "file" ], "dependsOn": [ "binding" ], "description": "The text of the mail smtp sends, in the contentType: bytes, a stream or a file are read as text, so send binary content as an attachment, and no body sends an empty text. A jakarta.mail MimeMessage is sent as it is, and a Map or a POJO as its toString(): marshal it first" }, + "producerOut": { "carriers": [ "unchanged" ], "description": "Unchanged, with the Message-ID of the mail in the CamelMailMessageId header" } + }, "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.mail.MailConfiguration", "configurationField": "configuration", "description": "The mail server host name" }, "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.mail.MailConfiguration", "configurationField": "configuration", "description": "The port number of the mail server" }, diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/smtps.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/smtps.json index b69d5f39ba6c4..c40792891107f 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/smtps.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/smtps.json @@ -95,6 +95,11 @@ "CamelMailDelete": { "index": 9, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Deletes the messages after they have been processed.", "constantName": "org.apache.camel.component.mail.MailConstants#MAIL_DELETE" }, "CamelMailMessageId": { "index": 10, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The message ID.", "constantName": "org.apache.camel.component.mail.MailConstants#MAIL_MESSAGE_ID" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "text", "stream", "pojo" ], "dependsOn": [ "binding" ], "byOption": [ { "option": "mapMailMessage", "value": "false", "carriers": [ "pojo" ], "javaType": "jakarta.mail.Message" } ], "description": "The content of the mail an imap or pop3 consumer reads: a String for text\/plain, text\/html and text\/xml, a stream for another content type, and a jakarta.mail Multipart for a multipart mail, which converts to the text of its first text part, with the files in the attachments. The jakarta.mail.Message itself with mapMailMessage=false" }, + "producerIn": { "carriers": [ "null", "text", "bytes", "stream", "file" ], "dependsOn": [ "binding" ], "description": "The text of the mail smtp sends, in the contentType: bytes, a stream or a file are read as text, so send binary content as an attachment, and no body sends an empty text. A jakarta.mail MimeMessage is sent as it is, and a Map or a POJO as its toString(): marshal it first" }, + "producerOut": { "carriers": [ "unchanged" ], "description": "Unchanged, with the Message-ID of the mail in the CamelMailMessageId header" } + }, "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.mail.MailConfiguration", "configurationField": "configuration", "description": "The mail server host name" }, "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.mail.MailConfiguration", "configurationField": "configuration", "description": "The port number of the mail server" }, diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/spring-rabbitmq.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/spring-rabbitmq.json index a2afee539d79a..e2ae70cd9c83b 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/spring-rabbitmq.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/spring-rabbitmq.json @@ -78,6 +78,12 @@ "CamelSpringRabbitmqPriority": { "index": 18, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The message priority.", "constantName": "org.apache.camel.component.springrabbit.SpringRabbitMQConstants#PRIORITY" }, "CamelSpringRabbitmqClusterId": { "index": 19, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The cluster id.", "constantName": "org.apache.camel.component.springrabbit.SpringRabbitMQConstants#CLUSTER_ID" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "text", "bytes" ], "dependsOn": [ "messageConverter" ], "description": "A String when the content type starts with text, as for text this component sends; a byte array otherwise, JSON and Java serialized objects too, which are not deserialized" }, + "consumerReply": { "carriers": [ "text", "bytes", "stream", "file" ], "dependsOn": [ "messageConverter" ], "byOption": [ { "option": "allowNullBody", "value": "true", "carriers": [ "null", "text", "bytes", "stream", "file" ] } ], "description": "The reply to a message with a reply-to, converted as the producer converts a body: a Map or a POJO fails" }, + "producerIn": { "carriers": [ "text", "bytes", "stream", "file" ], "dependsOn": [ "messageConverter" ], "byOption": [ { "option": "allowNullBody", "value": "true", "carriers": [ "null", "text", "bytes", "stream", "file" ] } ], "description": "Text, bytes, a stream or a file, sent as a byte array, text as text\/plain unless the CamelSpringRabbitmqContentType header says another type. A Map or a POJO fails, as it is not serialized: marshal it first" }, + "producerOut": { "carriers": [ "unknown" ], "byOption": [ { "option": "exchangePattern", "value": "InOnly", "carriers": [ "unchanged" ] }, { "option": "disableReplyTo", "value": "true", "carriers": [ "unchanged" ] } ], "description": "Unchanged for a message that expects no reply (InOnly). A message that expects one (InOut) gets the body of the reply as the consumer gives it: a String for a text content type, a byte array otherwise" } + }, "properties": { "exchangeName": { "index": 0, "kind": "path", "displayName": "Exchange Name", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The exchange name determines the exchange to which the produced messages will be sent to. In the case of consumers, the exchange name determines the exchange the queue will be bound to. Note: to use default exchange then do not use empty name, but use default instead." }, "connectionFactory": { "index": 1, "kind": "parameter", "displayName": "Connection Factory", "group": "common", "label": "common", "required": false, "type": "object", "javaType": "org.springframework.amqp.rabbit.connection.ConnectionFactory", "deprecated": false, "autowired": false, "secret": false, "description": "The connection factory to be use. A connection factory must be configured either on the component or endpoint." }, diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/mail-component.adoc b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/mail-component.adoc index c5f952ce7317d..48d3f181e17b3 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/mail-component.adoc +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/mail-component.adoc @@ -189,7 +189,9 @@ trust/key store files (see `SSLNOTES.txt` in JavaMail for details). Camel uses the message exchange's IN body as the http://java.sun.com/javaee/5/docs/api/javax/mail/internet/MimeMessage.html[MimeMessage] -text content. The body is converted to `String.class`. +text content. The body is converted to `String.class`: bytes, a stream or a file are read as text, so send binary +content as an attachment, and a Map or a POJO is sent as its `toString()`. A body that is a `jakarta.mail.internet.MimeMessage` +is sent as it is, with its own recipients and subject. Camel copies all of the exchange's IN headers to the http://java.sun.com/javaee/5/docs/api/javax/mail/internet/MimeMessage.html[MimeMessage] @@ -691,17 +693,8 @@ the Splitter as shown below ---- -You can also split the attachments as byte[] to -be stored as the message body. This is done by creating the expression -with boolean true - -._Java-only: programmatic `SplitAttachmentsExpression` configuration_ -[source,java] ----- -SplitAttachmentsExpression split = SplitAttachmentsExpression(true); ----- - -And then use the expression with the splitter EIP. +Each split message has the content of one attachment as its body: a byte array, or a String for a text +attachment, with the name of the attachment in the `CamelSplitAttachmentId` header. === Using custom SearchTerm diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/nats-component.adoc b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/nats-component.adoc index b83225d25e829..7c21564d0f306 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/nats-component.adoc +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/nats-component.adoc @@ -116,9 +116,12 @@ camel.component.nats.servers=scott:tiger@someserver:4222,superman:123@someothers ---- === Request/Reply support -The producer supports request/reply where it can wait for an expected reply message. +The producer supports request/reply: when the exchange pattern is InOut, it waits for the reply message, up to +`requestTimeout`, and the payload of the reply becomes the message body, as a byte array. -The consumer will, when routing the message is complete, send back the message as reply-message if required. +The consumer sends back the message body as the reply message, when routing the message is complete, if the message has a +reply subject and the consumer has `exchangePattern=InOut`. The body must convert to a byte array: text, bytes, a stream or a +file. A body that does not, such as a Map, sends no reply. == Examples diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/smpp-component.adoc b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/smpp-component.adoc index 02358413bb5a9..8c5525d86d6e2 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/smpp-component.adoc +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/smpp-component.adoc @@ -114,6 +114,9 @@ corresponding alphabet. When deciding which alphabet to use in the byte array, the Camel SMPP component does not consider the data coding value (header or configuration), it only considers the specified alphabet (from either the header or endpoint parameter). +The exception is an 8-bit data coding or alphabet in a header: the body is +then sent as the bytes it converts to, as they are. The same values in the +endpoint parameters do not do this, so a byte array body is read as text first. If some characters in the String cannot be represented in the chosen alphabet, they may be replaced by the question mark (`?`) symbol. @@ -121,8 +124,10 @@ Users of the API may want to consider checking if their message body can be converted to ISO-8859-1 before passing it to the component and if not, setting the alphabet header to request UCS-2 encoding. If the alphabet -and data coding options are not specified at all, then the component may -try to detect the required encoding and set the data coding for you. +and data coding options are not specified at all, the component does not +detect the required encoding or set the data coding for you: the text is +encoded for the SMSC default alphabet (`0`), in the `encoding` of the endpoint, +ISO-8859-1 by default. The list of alphabet codes is specified in the SMPP specification v3.4, section 5.2.19. One notable limitation of the SMPP specification is @@ -145,8 +150,10 @@ is completed automatically. If the GSM 3.38 alphabet is used, the component will pack up to 160 characters into the 140-byte message body. -If an 8-bit character set is used (e.g., ISO-8859-1 for Western Europe), then 140 characters will be -allowed within the 140-byte message body. +If the 8-bit alphabet (`4`) is used, then 140 bytes will be +allowed within the 140-byte message body. Text in an 8-bit character set +(e.g., ISO-8859-1 for Western Europe) is split by 140 bytes only with that +alphabet; with the default alphabet, it is split by 160 characters. If 16 bit UCS-2 encoding is used, then just 70 characters fit into each 140-byte message. diff --git a/components/camel-mail/src/generated/resources/META-INF/org/apache/camel/component/mail/imap.json b/components/camel-mail/src/generated/resources/META-INF/org/apache/camel/component/mail/imap.json index 9b89885303570..0546a307010a8 100644 --- a/components/camel-mail/src/generated/resources/META-INF/org/apache/camel/component/mail/imap.json +++ b/components/camel-mail/src/generated/resources/META-INF/org/apache/camel/component/mail/imap.json @@ -95,6 +95,11 @@ "CamelMailDelete": { "index": 9, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Deletes the messages after they have been processed.", "constantName": "org.apache.camel.component.mail.MailConstants#MAIL_DELETE" }, "CamelMailMessageId": { "index": 10, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The message ID.", "constantName": "org.apache.camel.component.mail.MailConstants#MAIL_MESSAGE_ID" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "text", "stream", "pojo" ], "dependsOn": [ "binding" ], "byOption": [ { "option": "mapMailMessage", "value": "false", "carriers": [ "pojo" ], "javaType": "jakarta.mail.Message" } ], "description": "The content of the mail an imap or pop3 consumer reads: a String for text\/plain, text\/html and text\/xml, a stream for another content type, and a jakarta.mail Multipart for a multipart mail, which converts to the text of its first text part, with the files in the attachments. The jakarta.mail.Message itself with mapMailMessage=false" }, + "producerIn": { "carriers": [ "null", "text", "bytes", "stream", "file" ], "dependsOn": [ "binding" ], "description": "The text of the mail smtp sends, in the contentType: bytes, a stream or a file are read as text, so send binary content as an attachment, and no body sends an empty text. A jakarta.mail MimeMessage is sent as it is, and a Map or a POJO as its toString(): marshal it first" }, + "producerOut": { "carriers": [ "unchanged" ], "description": "Unchanged, with the Message-ID of the mail in the CamelMailMessageId header" } + }, "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.mail.MailConfiguration", "configurationField": "configuration", "description": "The mail server host name" }, "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.mail.MailConfiguration", "configurationField": "configuration", "description": "The port number of the mail server" }, diff --git a/components/camel-mail/src/generated/resources/META-INF/org/apache/camel/component/mail/imaps.json b/components/camel-mail/src/generated/resources/META-INF/org/apache/camel/component/mail/imaps.json index f56002e989373..db9fc6854edaa 100644 --- a/components/camel-mail/src/generated/resources/META-INF/org/apache/camel/component/mail/imaps.json +++ b/components/camel-mail/src/generated/resources/META-INF/org/apache/camel/component/mail/imaps.json @@ -95,6 +95,11 @@ "CamelMailDelete": { "index": 9, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Deletes the messages after they have been processed.", "constantName": "org.apache.camel.component.mail.MailConstants#MAIL_DELETE" }, "CamelMailMessageId": { "index": 10, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The message ID.", "constantName": "org.apache.camel.component.mail.MailConstants#MAIL_MESSAGE_ID" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "text", "stream", "pojo" ], "dependsOn": [ "binding" ], "byOption": [ { "option": "mapMailMessage", "value": "false", "carriers": [ "pojo" ], "javaType": "jakarta.mail.Message" } ], "description": "The content of the mail an imap or pop3 consumer reads: a String for text\/plain, text\/html and text\/xml, a stream for another content type, and a jakarta.mail Multipart for a multipart mail, which converts to the text of its first text part, with the files in the attachments. The jakarta.mail.Message itself with mapMailMessage=false" }, + "producerIn": { "carriers": [ "null", "text", "bytes", "stream", "file" ], "dependsOn": [ "binding" ], "description": "The text of the mail smtp sends, in the contentType: bytes, a stream or a file are read as text, so send binary content as an attachment, and no body sends an empty text. A jakarta.mail MimeMessage is sent as it is, and a Map or a POJO as its toString(): marshal it first" }, + "producerOut": { "carriers": [ "unchanged" ], "description": "Unchanged, with the Message-ID of the mail in the CamelMailMessageId header" } + }, "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.mail.MailConfiguration", "configurationField": "configuration", "description": "The mail server host name" }, "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.mail.MailConfiguration", "configurationField": "configuration", "description": "The port number of the mail server" }, diff --git a/components/camel-mail/src/generated/resources/META-INF/org/apache/camel/component/mail/pop3.json b/components/camel-mail/src/generated/resources/META-INF/org/apache/camel/component/mail/pop3.json index 9fb6eff1c729c..ddc2eb7c76b91 100644 --- a/components/camel-mail/src/generated/resources/META-INF/org/apache/camel/component/mail/pop3.json +++ b/components/camel-mail/src/generated/resources/META-INF/org/apache/camel/component/mail/pop3.json @@ -95,6 +95,11 @@ "CamelMailDelete": { "index": 9, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Deletes the messages after they have been processed.", "constantName": "org.apache.camel.component.mail.MailConstants#MAIL_DELETE" }, "CamelMailMessageId": { "index": 10, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The message ID.", "constantName": "org.apache.camel.component.mail.MailConstants#MAIL_MESSAGE_ID" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "text", "stream", "pojo" ], "dependsOn": [ "binding" ], "byOption": [ { "option": "mapMailMessage", "value": "false", "carriers": [ "pojo" ], "javaType": "jakarta.mail.Message" } ], "description": "The content of the mail an imap or pop3 consumer reads: a String for text\/plain, text\/html and text\/xml, a stream for another content type, and a jakarta.mail Multipart for a multipart mail, which converts to the text of its first text part, with the files in the attachments. The jakarta.mail.Message itself with mapMailMessage=false" }, + "producerIn": { "carriers": [ "null", "text", "bytes", "stream", "file" ], "dependsOn": [ "binding" ], "description": "The text of the mail smtp sends, in the contentType: bytes, a stream or a file are read as text, so send binary content as an attachment, and no body sends an empty text. A jakarta.mail MimeMessage is sent as it is, and a Map or a POJO as its toString(): marshal it first" }, + "producerOut": { "carriers": [ "unchanged" ], "description": "Unchanged, with the Message-ID of the mail in the CamelMailMessageId header" } + }, "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.mail.MailConfiguration", "configurationField": "configuration", "description": "The mail server host name" }, "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.mail.MailConfiguration", "configurationField": "configuration", "description": "The port number of the mail server" }, diff --git a/components/camel-mail/src/generated/resources/META-INF/org/apache/camel/component/mail/pop3s.json b/components/camel-mail/src/generated/resources/META-INF/org/apache/camel/component/mail/pop3s.json index c11bad9b02d48..291fa8bd7221c 100644 --- a/components/camel-mail/src/generated/resources/META-INF/org/apache/camel/component/mail/pop3s.json +++ b/components/camel-mail/src/generated/resources/META-INF/org/apache/camel/component/mail/pop3s.json @@ -95,6 +95,11 @@ "CamelMailDelete": { "index": 9, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Deletes the messages after they have been processed.", "constantName": "org.apache.camel.component.mail.MailConstants#MAIL_DELETE" }, "CamelMailMessageId": { "index": 10, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The message ID.", "constantName": "org.apache.camel.component.mail.MailConstants#MAIL_MESSAGE_ID" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "text", "stream", "pojo" ], "dependsOn": [ "binding" ], "byOption": [ { "option": "mapMailMessage", "value": "false", "carriers": [ "pojo" ], "javaType": "jakarta.mail.Message" } ], "description": "The content of the mail an imap or pop3 consumer reads: a String for text\/plain, text\/html and text\/xml, a stream for another content type, and a jakarta.mail Multipart for a multipart mail, which converts to the text of its first text part, with the files in the attachments. The jakarta.mail.Message itself with mapMailMessage=false" }, + "producerIn": { "carriers": [ "null", "text", "bytes", "stream", "file" ], "dependsOn": [ "binding" ], "description": "The text of the mail smtp sends, in the contentType: bytes, a stream or a file are read as text, so send binary content as an attachment, and no body sends an empty text. A jakarta.mail MimeMessage is sent as it is, and a Map or a POJO as its toString(): marshal it first" }, + "producerOut": { "carriers": [ "unchanged" ], "description": "Unchanged, with the Message-ID of the mail in the CamelMailMessageId header" } + }, "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.mail.MailConfiguration", "configurationField": "configuration", "description": "The mail server host name" }, "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.mail.MailConfiguration", "configurationField": "configuration", "description": "The port number of the mail server" }, diff --git a/components/camel-mail/src/generated/resources/META-INF/org/apache/camel/component/mail/smtp.json b/components/camel-mail/src/generated/resources/META-INF/org/apache/camel/component/mail/smtp.json index d3f38498fd41f..830d658df0b5d 100644 --- a/components/camel-mail/src/generated/resources/META-INF/org/apache/camel/component/mail/smtp.json +++ b/components/camel-mail/src/generated/resources/META-INF/org/apache/camel/component/mail/smtp.json @@ -95,6 +95,11 @@ "CamelMailDelete": { "index": 9, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Deletes the messages after they have been processed.", "constantName": "org.apache.camel.component.mail.MailConstants#MAIL_DELETE" }, "CamelMailMessageId": { "index": 10, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The message ID.", "constantName": "org.apache.camel.component.mail.MailConstants#MAIL_MESSAGE_ID" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "text", "stream", "pojo" ], "dependsOn": [ "binding" ], "byOption": [ { "option": "mapMailMessage", "value": "false", "carriers": [ "pojo" ], "javaType": "jakarta.mail.Message" } ], "description": "The content of the mail an imap or pop3 consumer reads: a String for text\/plain, text\/html and text\/xml, a stream for another content type, and a jakarta.mail Multipart for a multipart mail, which converts to the text of its first text part, with the files in the attachments. The jakarta.mail.Message itself with mapMailMessage=false" }, + "producerIn": { "carriers": [ "null", "text", "bytes", "stream", "file" ], "dependsOn": [ "binding" ], "description": "The text of the mail smtp sends, in the contentType: bytes, a stream or a file are read as text, so send binary content as an attachment, and no body sends an empty text. A jakarta.mail MimeMessage is sent as it is, and a Map or a POJO as its toString(): marshal it first" }, + "producerOut": { "carriers": [ "unchanged" ], "description": "Unchanged, with the Message-ID of the mail in the CamelMailMessageId header" } + }, "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.mail.MailConfiguration", "configurationField": "configuration", "description": "The mail server host name" }, "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.mail.MailConfiguration", "configurationField": "configuration", "description": "The port number of the mail server" }, diff --git a/components/camel-mail/src/generated/resources/META-INF/org/apache/camel/component/mail/smtps.json b/components/camel-mail/src/generated/resources/META-INF/org/apache/camel/component/mail/smtps.json index b69d5f39ba6c4..c40792891107f 100644 --- a/components/camel-mail/src/generated/resources/META-INF/org/apache/camel/component/mail/smtps.json +++ b/components/camel-mail/src/generated/resources/META-INF/org/apache/camel/component/mail/smtps.json @@ -95,6 +95,11 @@ "CamelMailDelete": { "index": 9, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Deletes the messages after they have been processed.", "constantName": "org.apache.camel.component.mail.MailConstants#MAIL_DELETE" }, "CamelMailMessageId": { "index": 10, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The message ID.", "constantName": "org.apache.camel.component.mail.MailConstants#MAIL_MESSAGE_ID" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "text", "stream", "pojo" ], "dependsOn": [ "binding" ], "byOption": [ { "option": "mapMailMessage", "value": "false", "carriers": [ "pojo" ], "javaType": "jakarta.mail.Message" } ], "description": "The content of the mail an imap or pop3 consumer reads: a String for text\/plain, text\/html and text\/xml, a stream for another content type, and a jakarta.mail Multipart for a multipart mail, which converts to the text of its first text part, with the files in the attachments. The jakarta.mail.Message itself with mapMailMessage=false" }, + "producerIn": { "carriers": [ "null", "text", "bytes", "stream", "file" ], "dependsOn": [ "binding" ], "description": "The text of the mail smtp sends, in the contentType: bytes, a stream or a file are read as text, so send binary content as an attachment, and no body sends an empty text. A jakarta.mail MimeMessage is sent as it is, and a Map or a POJO as its toString(): marshal it first" }, + "producerOut": { "carriers": [ "unchanged" ], "description": "Unchanged, with the Message-ID of the mail in the CamelMailMessageId header" } + }, "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.mail.MailConfiguration", "configurationField": "configuration", "description": "The mail server host name" }, "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.mail.MailConfiguration", "configurationField": "configuration", "description": "The port number of the mail server" }, diff --git a/components/camel-mail/src/main/docs/mail-component.adoc b/components/camel-mail/src/main/docs/mail-component.adoc index c5f952ce7317d..48d3f181e17b3 100644 --- a/components/camel-mail/src/main/docs/mail-component.adoc +++ b/components/camel-mail/src/main/docs/mail-component.adoc @@ -189,7 +189,9 @@ trust/key store files (see `SSLNOTES.txt` in JavaMail for details). Camel uses the message exchange's IN body as the http://java.sun.com/javaee/5/docs/api/javax/mail/internet/MimeMessage.html[MimeMessage] -text content. The body is converted to `String.class`. +text content. The body is converted to `String.class`: bytes, a stream or a file are read as text, so send binary +content as an attachment, and a Map or a POJO is sent as its `toString()`. A body that is a `jakarta.mail.internet.MimeMessage` +is sent as it is, with its own recipients and subject. Camel copies all of the exchange's IN headers to the http://java.sun.com/javaee/5/docs/api/javax/mail/internet/MimeMessage.html[MimeMessage] @@ -691,17 +693,8 @@ the Splitter as shown below ---- -You can also split the attachments as byte[] to -be stored as the message body. This is done by creating the expression -with boolean true - -._Java-only: programmatic `SplitAttachmentsExpression` configuration_ -[source,java] ----- -SplitAttachmentsExpression split = SplitAttachmentsExpression(true); ----- - -And then use the expression with the splitter EIP. +Each split message has the content of one attachment as its body: a byte array, or a String for a text +attachment, with the name of the attachment in the `CamelSplitAttachmentId` header. === Using custom SearchTerm diff --git a/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailEndpoint.java b/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailEndpoint.java index 1c52a0a92ae59..45b3fb1dcb486 100644 --- a/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailEndpoint.java +++ b/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailEndpoint.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.EndpointServiceLocation; import org.apache.camel.spi.HeaderFilterStrategy; import org.apache.camel.spi.HeaderFilterStrategyAware; @@ -47,6 +50,23 @@ @UriEndpoint(firstVersion = "1.0.0", scheme = "imap,imaps,pop3,pop3s,smtp,smtps", title = "IMAP,IMAPS,POP3,POP3S,SMTP,SMTPS", syntax = "imap:host:port", alternativeSyntax = "imap:username:password@host:port", category = { Category.MAIL }, headersClass = MailConstants.class) +@BodyTypes(consumerOut = @BodyType(value = { Carrier.TEXT, Carrier.STREAM, Carrier.POJO }, dependsOn = "binding", + byOption = @BodyType.When(option = "mapMailMessage", value = "false", + carriers = Carrier.POJO, javaType = "jakarta.mail.Message"), + description = "The content of the mail an imap or pop3 consumer reads: a String for" + + " text/plain, text/html and text/xml, a stream for another content type," + + " and a jakarta.mail Multipart for a multipart mail, which converts to the" + + " text of its first text part, with the files in the attachments. The" + + " jakarta.mail.Message itself with mapMailMessage=false"), + producerIn = @BodyType(value = { Carrier.NULL, Carrier.TEXT, Carrier.BYTES, Carrier.STREAM, Carrier.FILE }, + dependsOn = "binding", + description = "The text of the mail smtp sends, in the contentType: bytes, a stream or a" + + " file are read as text, so send binary content as an attachment, and no" + + " body sends an empty text. A jakarta.mail MimeMessage is sent as it is," + + " and a Map or a POJO as its toString(): marshal it first"), + producerOut = @BodyType(value = Carrier.UNCHANGED, + description = "Unchanged, with the Message-ID of the mail in the CamelMailMessageId" + + " header")) public class MailEndpoint extends ScheduledPollEndpoint implements HeaderFilterStrategyAware, EndpointServiceLocation { @UriParam(defaultValue = "" + MailConsumer.DEFAULT_CONSUMER_DELAY, javaType = "java.time.Duration", diff --git a/components/camel-nats/src/generated/resources/META-INF/org/apache/camel/component/nats/nats.json b/components/camel-nats/src/generated/resources/META-INF/org/apache/camel/component/nats/nats.json index eca34ceb7d3c8..50696e1342789 100644 --- a/components/camel-nats/src/generated/resources/META-INF/org/apache/camel/component/nats/nats.json +++ b/components/camel-nats/src/generated/resources/META-INF/org/apache/camel/component/nats/nats.json @@ -80,6 +80,12 @@ "CamelNatsDeliveryCounter": { "index": 7, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "important": true, "description": "Number of times this message has been delivered (1 = first, 1 then message has been redelivered)", "constantName": "org.apache.camel.component.nats.NatsConstants#NATS_DELIVERY_COUNTER" }, "CamelNatsManualAck": { "index": 8, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "org.apache.camel.component.nats.NatsManualAck", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The manual acknowledgment handle for JetStream messages (only set when manualAck=true).", "constantName": "org.apache.camel.component.nats.NatsConstants#NATS_MANUAL_ACK" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "bytes" ], "javaType": "byte[]", "description": "The payload of the NATS message as a byte array, empty for a message without one: convert or unmarshal it" }, + "consumerReply": { "carriers": [ "any" ], "byOption": [ { "option": "exchangePattern", "value": "InOut", "carriers": [ "text", "bytes", "stream", "file" ] } ], "description": "Only with exchangePattern=InOut is a message with a reply subject answered, with the body the route ends with: text, bytes, a stream or a file. A Map, a POJO or no body sends no reply, and the requester times out" }, + "producerIn": { "carriers": [ "text", "bytes", "stream", "file" ], "description": "What converts to a byte array: text, bytes, a stream or a file. A Map or a POJO is sent as its toString(), and a List or no body fails: marshal it first" }, + "producerOut": { "carriers": [ "unknown" ], "byOption": [ { "option": "exchangePattern", "value": "InOnly", "carriers": [ "unchanged" ] }, { "option": "exchangePattern", "value": "InOut", "carriers": [ "bytes" ], "javaType": "byte[]" } ], "description": "Unchanged for a message that expects no reply (InOnly). A message that expects one (InOut) waits for the reply, up to requestTimeout, and gets its payload as a byte array" } + }, "properties": { "topic": { "index": 0, "kind": "path", "displayName": "Topic", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.nats.NatsConfiguration", "configurationField": "configuration", "description": "The name of topic we want to use" }, "connectionTimeout": { "index": 1, "kind": "parameter", "displayName": "Connection Timeout", "group": "common", "label": "common", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 2000, "configurationClass": "org.apache.camel.component.nats.NatsConfiguration", "configurationField": "configuration", "description": "Timeout for connection attempts. (in milliseconds)" }, diff --git a/components/camel-nats/src/main/docs/nats-component.adoc b/components/camel-nats/src/main/docs/nats-component.adoc index b83225d25e829..7c21564d0f306 100644 --- a/components/camel-nats/src/main/docs/nats-component.adoc +++ b/components/camel-nats/src/main/docs/nats-component.adoc @@ -116,9 +116,12 @@ camel.component.nats.servers=scott:tiger@someserver:4222,superman:123@someothers ---- === Request/Reply support -The producer supports request/reply where it can wait for an expected reply message. +The producer supports request/reply: when the exchange pattern is InOut, it waits for the reply message, up to +`requestTimeout`, and the payload of the reply becomes the message body, as a byte array. -The consumer will, when routing the message is complete, send back the message as reply-message if required. +The consumer sends back the message body as the reply message, when routing the message is complete, if the message has a +reply subject and the consumer has `exchangePattern=InOut`. The body must convert to a byte array: text, bytes, a stream or a +file. A body that does not, such as a Map, sends no reply. == Examples diff --git a/components/camel-nats/src/main/java/org/apache/camel/component/nats/NatsEndpoint.java b/components/camel-nats/src/main/java/org/apache/camel/component/nats/NatsEndpoint.java index ed1aaa74511ef..2d95d008a104d 100644 --- a/components/camel-nats/src/main/java/org/apache/camel/component/nats/NatsEndpoint.java +++ b/components/camel-nats/src/main/java/org/apache/camel/component/nats/NatsEndpoint.java @@ -31,6 +31,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.HeaderFilterStrategy; import org.apache.camel.spi.HeaderFilterStrategyAware; @@ -45,6 +48,31 @@ */ @UriEndpoint(firstVersion = "2.17.0", scheme = "nats", title = "Nats", syntax = "nats:topic", category = { Category.MESSAGING }, headersClass = NatsConstants.class) +@BodyTypes(consumerOut = @BodyType(value = Carrier.BYTES, javaType = "byte[]", + description = "The payload of the NATS message as a byte array, empty for a message" + + " without one: convert or unmarshal it"), + consumerReply = @BodyType(value = Carrier.ANY, + byOption = @BodyType.When(option = "exchangePattern", value = "InOut", + carriers = { + Carrier.TEXT, Carrier.BYTES, Carrier.STREAM, + Carrier.FILE }), + description = "Only with exchangePattern=InOut is a message with a reply subject" + + " answered, with the body the route ends with: text, bytes, a stream or a" + + " file. A Map, a POJO or no body sends no reply, and the requester" + + " times out"), + producerIn = @BodyType(value = { Carrier.TEXT, Carrier.BYTES, Carrier.STREAM, Carrier.FILE }, + description = "What converts to a byte array: text, bytes, a stream or a file. A Map or a" + + " POJO is sent as its toString(), and a List or no body fails: marshal it" + + " first"), + producerOut = @BodyType(value = Carrier.UNKNOWN, + byOption = { + @BodyType.When(option = "exchangePattern", value = "InOnly", + carriers = Carrier.UNCHANGED), + @BodyType.When(option = "exchangePattern", value = "InOut", + carriers = Carrier.BYTES, javaType = "byte[]") }, + description = "Unchanged for a message that expects no reply (InOnly). A message that" + + " expects one (InOut) waits for the reply, up to requestTimeout, and gets" + + " its payload as a byte array")) public class NatsEndpoint extends DefaultEndpoint implements MultipleConsumersSupport, HeaderFilterStrategyAware, EndpointServiceLocation { diff --git a/components/camel-paho/src/generated/resources/META-INF/org/apache/camel/component/paho/paho.json b/components/camel-paho/src/generated/resources/META-INF/org/apache/camel/component/paho/paho.json index 1ee428f6b2ebc..de99e56c6983c 100644 --- a/components/camel-paho/src/generated/resources/META-INF/org/apache/camel/component/paho/paho.json +++ b/components/camel-paho/src/generated/resources/META-INF/org/apache/camel/component/paho/paho.json @@ -64,6 +64,11 @@ "CamelPahoRetained": { "index": 3, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Retain option.", "constantName": "org.apache.camel.component.paho.PahoConstants#CAMEL_PAHO_MSG_RETAINED" }, "CamelPahoOverrideTopic": { "index": 4, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The name of topic to override and send to instead of topic specified on endpoint.", "constantName": "org.apache.camel.component.paho.PahoConstants#CAMEL_PAHO_OVERRIDE_TOPIC" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "bytes" ], "javaType": "byte[]", "description": "The payload of the MQTT message" }, + "producerIn": { "carriers": [ "text", "bytes", "stream", "file" ], "description": "What converts to a byte array: text, bytes, a stream or a file, sent as the payload. A Map, a POJO or no body fails: marshal it first" }, + "producerOut": { "carriers": [ "unchanged" ] } + }, "properties": { "topic": { "index": 0, "kind": "path", "displayName": "Topic", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Name of the topic" }, "automaticReconnect": { "index": 1, "kind": "parameter", "displayName": "Automatic Reconnect", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "configurationClass": "org.apache.camel.component.paho.PahoConfiguration", "configurationField": "configuration", "description": "Sets whether the client will automatically attempt to reconnect to the server if the connection is lost. If set to false, the client will not attempt to automatically reconnect to the server in the event that the connection is lost. If set to true, in the event that the connection is lost, the client will attempt to reconnect to the server. It will initially wait 1 second before it attempts to reconnect, for every failed reconnect attempt, the delay will double until it is at 2 minutes at which point the delay will stay at 2 minutes." }, diff --git a/components/camel-paho/src/main/java/org/apache/camel/component/paho/PahoEndpoint.java b/components/camel-paho/src/main/java/org/apache/camel/component/paho/PahoEndpoint.java index 48773c9848a26..619689ce1fccb 100644 --- a/components/camel-paho/src/main/java/org/apache/camel/component/paho/PahoEndpoint.java +++ b/components/camel-paho/src/main/java/org/apache/camel/component/paho/PahoEndpoint.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.Metadata; import org.apache.camel.spi.UriEndpoint; @@ -42,6 +45,11 @@ @UriEndpoint(firstVersion = "2.16.0", scheme = "paho", title = "Paho", category = { Category.MESSAGING, Category.IOT }, syntax = "paho:topic", headersClass = PahoConstants.class) @Deprecated(since = "4.21") +@BodyTypes(consumerOut = @BodyType(value = Carrier.BYTES, javaType = "byte[]", description = "The payload of the MQTT message"), + producerIn = @BodyType(value = { Carrier.TEXT, Carrier.BYTES, Carrier.STREAM, Carrier.FILE }, + description = "What converts to a byte array: text, bytes, a stream or a file, sent as" + + " the payload. A Map, a POJO or no body fails: marshal it first"), + producerOut = @BodyType(Carrier.UNCHANGED)) public class PahoEndpoint extends DefaultEndpoint implements EndpointServiceLocation { // Configuration members diff --git a/components/camel-pulsar/src/generated/resources/META-INF/org/apache/camel/component/pulsar/pulsar.json b/components/camel-pulsar/src/generated/resources/META-INF/org/apache/camel/component/pulsar/pulsar.json index 14015d1ae1fa6..f0c6b696f7f64 100644 --- a/components/camel-pulsar/src/generated/resources/META-INF/org/apache/camel/component/pulsar/pulsar.json +++ b/components/camel-pulsar/src/generated/resources/META-INF/org/apache/camel/component/pulsar/pulsar.json @@ -94,6 +94,11 @@ "CamelPulsarProducerMessageDeliverAfter": { "index": 15, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Deliver the message after a given delayed time (millis).", "constantName": "org.apache.camel.component.pulsar.utils.message.PulsarMessageHeaders#DELIVER_AFTER" }, "CamelPulsarProducerMessageId": { "index": 16, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "org.apache.pulsar.client.api.MessageId", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The message id the broker assigned to the published message.", "constantName": "org.apache.camel.component.pulsar.utils.message.PulsarMessageHeaders#PRODUCER_MESSAGE_ID" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "bytes", "null" ], "javaType": "byte[]", "description": "The payload of the Pulsar message as a byte array, null for a message with a null value (a tombstone), with the key and the properties in headers: convert or unmarshal it" }, + "producerIn": { "carriers": [ "text", "bytes", "stream", "file" ], "description": "What converts to a byte array: text, bytes, a stream or a file, sent as the payload. Any other body is sent with Java serialization, a Map, a List, a number and no body too, and an object that is not Serializable fails: marshal it first" }, + "producerOut": { "carriers": [ "unchanged" ], "description": "Unchanged, also when the exchange expects a reply, with the id of the published message in a header" } + }, "properties": { "persistence": { "index": 0, "kind": "path", "displayName": "Persistence", "group": "common", "label": "", "required": true, "type": "enum", "javaType": "java.lang.String", "enum": [ "persistent", "non-persistent" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Whether the topic is persistent or non-persistent" }, "tenant": { "index": 1, "kind": "path", "displayName": "Tenant", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The tenant" }, diff --git a/components/camel-pulsar/src/main/java/org/apache/camel/component/pulsar/PulsarEndpoint.java b/components/camel-pulsar/src/main/java/org/apache/camel/component/pulsar/PulsarEndpoint.java index fd6de025b5ba4..fd5fdb1ee8c08 100644 --- a/components/camel-pulsar/src/main/java/org/apache/camel/component/pulsar/PulsarEndpoint.java +++ b/components/camel-pulsar/src/main/java/org/apache/camel/component/pulsar/PulsarEndpoint.java @@ -21,6 +21,9 @@ import org.apache.camel.Processor; import org.apache.camel.Producer; import org.apache.camel.component.pulsar.utils.message.PulsarMessageHeaders; +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; @@ -37,6 +40,18 @@ @UriEndpoint(scheme = "pulsar", firstVersion = "2.24.0", title = "Pulsar", syntax = "pulsar:persistence://tenant/namespace/topic", category = { Category.MESSAGING }, headersClass = PulsarMessageHeaders.class) +@BodyTypes(consumerOut = @BodyType(value = { Carrier.BYTES, Carrier.NULL }, javaType = "byte[]", + description = "The payload of the Pulsar message as a byte array, null for a message with" + + " a null value (a tombstone), with the key and the properties in headers:" + + " convert or unmarshal it"), + producerIn = @BodyType(value = { Carrier.TEXT, Carrier.BYTES, Carrier.STREAM, Carrier.FILE }, + description = "What converts to a byte array: text, bytes, a stream or a file, sent as the" + + " payload. Any other body is sent with Java serialization, a Map, a List, a" + + " number and no body too, and an object that is not Serializable fails:" + + " marshal it first"), + producerOut = @BodyType(value = Carrier.UNCHANGED, + description = "Unchanged, also when the exchange expects a reply, with the id of the" + + " published message in a header")) public class PulsarEndpoint extends DefaultEndpoint implements EndpointServiceLocation { private PulsarClient pulsarClient; diff --git a/components/camel-smpp/src/generated/resources/META-INF/org/apache/camel/component/smpp/smpp.json b/components/camel-smpp/src/generated/resources/META-INF/org/apache/camel/component/smpp/smpp.json index dc937fb26f6af..51702b25e413f 100644 --- a/components/camel-smpp/src/generated/resources/META-INF/org/apache/camel/component/smpp/smpp.json +++ b/components/camel-smpp/src/generated/resources/META-INF/org/apache/camel/component/smpp/smpp.json @@ -82,7 +82,7 @@ "CamelSmppDestAddrNpi": { "index": 8, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "Byte", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Producer: only for SubmitSm, SubmitMulti, CancelSm and DataSm Defines the numeric plan indicator (NPI) to be used in the SME destination address parameters. Use the URI option sourceAddrNpi values defined above. Consumer: only for DataSm Defines the numeric plan indicator (NPI) in the destination address parameters. Use the URI option sourceAddrNpi values defined above.", "constantName": "org.apache.camel.component.smpp.SmppConstants#DEST_ADDR_NPI" }, "CamelSmppDestAddrTon": { "index": 9, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "Byte", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Producer: only for SubmitSm, SubmitMulti, CancelSm and DataSm Defines the type of number (TON) to be used in the SME destination address parameters. Use the sourceAddrTon URI option values defined above. Consumer: only for DataSm Defines the type of number (TON) in the destination address parameters. Use the sourceAddrTon URI option values defined above.", "constantName": "org.apache.camel.component.smpp.SmppConstants#DEST_ADDR_TON" }, "CamelSmppDoneDate": { "index": 10, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "Date", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "only for smsc DeliveryReceipt The time and date at which the short message reached it's final state. The format is as follows: YYMMDDhhmm.", "constantName": "org.apache.camel.component.smpp.SmppConstants#DONE_DATE" }, - "CamelSmppEncoding": { "index": 11, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "only for SubmitSm, SubmitMulti and DataSm. Specifies the encoding (character set name) of the bytes in the message body. If the message body is a string then this is not relevant because Java Strings are always Unicode. If the body is a byte array then this header can be used to indicate that it is ISO-8859-1 or some other value. Default value is specified by the endpoint configuration parameter _encoding_", "constantName": "org.apache.camel.component.smpp.SmppConstants#ENCODING" }, + "CamelSmppEncoding": { "index": 11, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "only for SubmitSm, SubmitMulti and ReplaceSm. Specifies the encoding (character set name) the text of the message body is encoded in, as the short message. A byte array body is first read as text, in the charset of the exchange, unless an 8-bit data coding or alphabet header sends it as it is. Default value is specified by the endpoint configuration parameter _encoding_", "constantName": "org.apache.camel.component.smpp.SmppConstants#ENCODING" }, "CamelSmppError": { "index": 12, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String or Map>>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Producer: only for SubmitMultiSm The errors which occurred by sending the short message(s) the form Map (messageID : (destAddr : address, error : errorCode)). Consumer: only for smsc DeliveryReceipt Where appropriate this may hold a Network specific error code or an SMSC error code for the attempted delivery of the message. These errors are Network or SMSC specific and are not included here.", "constantName": "org.apache.camel.component.smpp.SmppConstants#ERROR" }, "CamelSmppClass": { "index": 13, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "org.jsmpp.bean.ESMClass", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "the ASM class", "constantName": "org.apache.camel.component.smpp.SmppConstants#ESM_CLASS" }, "CamelSmppEsmeAddr": { "index": 14, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "only for AlertNotification Defines the destination ESME address. For mobile terminated messages, this is the directory number of the recipient MS.", "constantName": "org.apache.camel.component.smpp.SmppConstants#ESME_ADDR" }, @@ -114,6 +114,11 @@ "CamelSmppOptionalParameter": { "index": 40, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "Map", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Producer: only for SubmitSm, SubmitMulti and DataSm The optional parameter which are send to the SMSC. The value is converted in the following way: String - org.jsmpp.bean.OptionalParameter.COctetString, byte - org.jsmpp.bean.OptionalParameter.OctetString, Byte - org.jsmpp.bean.OptionalParameter.Byte, Integer - org.jsmpp.bean.OptionalParameter.Int, Short - org.jsmpp.bean.OptionalParameter.Short, null - org.jsmpp.bean.OptionalParameter.Null Consumer: only for DeliverSm The optional parameters send back by the SMSC. The key is the Short code for the optional parameter. The value is converted in the following way: org.jsmpp.bean.OptionalParameter.COctetString - String, org.jsmpp.bean.OptionalParameter.OctetString - byte, org.jsmpp.bean.OptionalParameter.Byte - Byte, org.jsmpp.bean.OptionalParameter.Int - Integer, org.jsmpp.bean.OptionalParameter.Short - Short, org.jsmpp.bean.OptionalParameter.Null - null", "constantName": "org.apache.camel.component.smpp.SmppConstants#OPTIONAL_PARAMETER" }, "CamelSmppSplittingPolicy": { "index": 41, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "only for SubmitSm, SubmitMulti and DataSm. Specifies the policy for message splitting for this exchange. Possible values are described in the endpoint configuration parameter _splittingPolicy_", "constantName": "org.apache.camel.component.smpp.SmppConstants#SPLITTING_POLICY" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "text", "bytes", "null" ], "description": "A short message as text decoded by its data coding, or as bytes for an 8-bit data coding; the text of a delivery receipt, with its fields in headers. A data_sm or an alert notification has no body" }, + "producerIn": { "carriers": [ "text", "bytes", "file" ], "description": "The text of the short message: bytes or a file are read as text, unless an 8-bit CamelSmppDataCoding or CamelSmppAlphabet header sends bytes as they are. A stream is sent empty and no body fails: convert it to text first; a Map or a POJO is sent as its toString(). DataSm, QuerySm and CancelSm do not read the body" }, + "producerOut": { "carriers": [ "unknown" ], "byOption": [ { "option": "exchangePattern", "value": "InOnly", "carriers": [ "unchanged" ] }, { "option": "exchangePattern", "value": "InOut", "carriers": [ "null" ] } ], "description": "Unchanged, with the message ids in the CamelSmppId header. When the exchange expects a reply (InOut), a new message with no body and only the result headers" } + }, "properties": { "host": { "index": 0, "kind": "path", "displayName": "Host", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "localhost", "configurationClass": "org.apache.camel.component.smpp.SmppConfiguration", "configurationField": "configuration", "description": "Hostname for the SMSC server to use." }, "port": { "index": 1, "kind": "path", "displayName": "Port", "group": "common", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 2775, "configurationClass": "org.apache.camel.component.smpp.SmppConfiguration", "configurationField": "configuration", "description": "Port number for the SMSC server to use." }, diff --git a/components/camel-smpp/src/generated/resources/META-INF/org/apache/camel/component/smpp/smpps.json b/components/camel-smpp/src/generated/resources/META-INF/org/apache/camel/component/smpp/smpps.json index 1adce03c7ebbb..39a2de9049af4 100644 --- a/components/camel-smpp/src/generated/resources/META-INF/org/apache/camel/component/smpp/smpps.json +++ b/components/camel-smpp/src/generated/resources/META-INF/org/apache/camel/component/smpp/smpps.json @@ -82,7 +82,7 @@ "CamelSmppDestAddrNpi": { "index": 8, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "Byte", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Producer: only for SubmitSm, SubmitMulti, CancelSm and DataSm Defines the numeric plan indicator (NPI) to be used in the SME destination address parameters. Use the URI option sourceAddrNpi values defined above. Consumer: only for DataSm Defines the numeric plan indicator (NPI) in the destination address parameters. Use the URI option sourceAddrNpi values defined above.", "constantName": "org.apache.camel.component.smpp.SmppConstants#DEST_ADDR_NPI" }, "CamelSmppDestAddrTon": { "index": 9, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "Byte", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Producer: only for SubmitSm, SubmitMulti, CancelSm and DataSm Defines the type of number (TON) to be used in the SME destination address parameters. Use the sourceAddrTon URI option values defined above. Consumer: only for DataSm Defines the type of number (TON) in the destination address parameters. Use the sourceAddrTon URI option values defined above.", "constantName": "org.apache.camel.component.smpp.SmppConstants#DEST_ADDR_TON" }, "CamelSmppDoneDate": { "index": 10, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "Date", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "only for smsc DeliveryReceipt The time and date at which the short message reached it's final state. The format is as follows: YYMMDDhhmm.", "constantName": "org.apache.camel.component.smpp.SmppConstants#DONE_DATE" }, - "CamelSmppEncoding": { "index": 11, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "only for SubmitSm, SubmitMulti and DataSm. Specifies the encoding (character set name) of the bytes in the message body. If the message body is a string then this is not relevant because Java Strings are always Unicode. If the body is a byte array then this header can be used to indicate that it is ISO-8859-1 or some other value. Default value is specified by the endpoint configuration parameter _encoding_", "constantName": "org.apache.camel.component.smpp.SmppConstants#ENCODING" }, + "CamelSmppEncoding": { "index": 11, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "only for SubmitSm, SubmitMulti and ReplaceSm. Specifies the encoding (character set name) the text of the message body is encoded in, as the short message. A byte array body is first read as text, in the charset of the exchange, unless an 8-bit data coding or alphabet header sends it as it is. Default value is specified by the endpoint configuration parameter _encoding_", "constantName": "org.apache.camel.component.smpp.SmppConstants#ENCODING" }, "CamelSmppError": { "index": 12, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String or Map>>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Producer: only for SubmitMultiSm The errors which occurred by sending the short message(s) the form Map (messageID : (destAddr : address, error : errorCode)). Consumer: only for smsc DeliveryReceipt Where appropriate this may hold a Network specific error code or an SMSC error code for the attempted delivery of the message. These errors are Network or SMSC specific and are not included here.", "constantName": "org.apache.camel.component.smpp.SmppConstants#ERROR" }, "CamelSmppClass": { "index": 13, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "org.jsmpp.bean.ESMClass", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "the ASM class", "constantName": "org.apache.camel.component.smpp.SmppConstants#ESM_CLASS" }, "CamelSmppEsmeAddr": { "index": 14, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "only for AlertNotification Defines the destination ESME address. For mobile terminated messages, this is the directory number of the recipient MS.", "constantName": "org.apache.camel.component.smpp.SmppConstants#ESME_ADDR" }, @@ -114,6 +114,11 @@ "CamelSmppOptionalParameter": { "index": 40, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "Map", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Producer: only for SubmitSm, SubmitMulti and DataSm The optional parameter which are send to the SMSC. The value is converted in the following way: String - org.jsmpp.bean.OptionalParameter.COctetString, byte - org.jsmpp.bean.OptionalParameter.OctetString, Byte - org.jsmpp.bean.OptionalParameter.Byte, Integer - org.jsmpp.bean.OptionalParameter.Int, Short - org.jsmpp.bean.OptionalParameter.Short, null - org.jsmpp.bean.OptionalParameter.Null Consumer: only for DeliverSm The optional parameters send back by the SMSC. The key is the Short code for the optional parameter. The value is converted in the following way: org.jsmpp.bean.OptionalParameter.COctetString - String, org.jsmpp.bean.OptionalParameter.OctetString - byte, org.jsmpp.bean.OptionalParameter.Byte - Byte, org.jsmpp.bean.OptionalParameter.Int - Integer, org.jsmpp.bean.OptionalParameter.Short - Short, org.jsmpp.bean.OptionalParameter.Null - null", "constantName": "org.apache.camel.component.smpp.SmppConstants#OPTIONAL_PARAMETER" }, "CamelSmppSplittingPolicy": { "index": 41, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "only for SubmitSm, SubmitMulti and DataSm. Specifies the policy for message splitting for this exchange. Possible values are described in the endpoint configuration parameter _splittingPolicy_", "constantName": "org.apache.camel.component.smpp.SmppConstants#SPLITTING_POLICY" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "text", "bytes", "null" ], "description": "A short message as text decoded by its data coding, or as bytes for an 8-bit data coding; the text of a delivery receipt, with its fields in headers. A data_sm or an alert notification has no body" }, + "producerIn": { "carriers": [ "text", "bytes", "file" ], "description": "The text of the short message: bytes or a file are read as text, unless an 8-bit CamelSmppDataCoding or CamelSmppAlphabet header sends bytes as they are. A stream is sent empty and no body fails: convert it to text first; a Map or a POJO is sent as its toString(). DataSm, QuerySm and CancelSm do not read the body" }, + "producerOut": { "carriers": [ "unknown" ], "byOption": [ { "option": "exchangePattern", "value": "InOnly", "carriers": [ "unchanged" ] }, { "option": "exchangePattern", "value": "InOut", "carriers": [ "null" ] } ], "description": "Unchanged, with the message ids in the CamelSmppId header. When the exchange expects a reply (InOut), a new message with no body and only the result headers" } + }, "properties": { "host": { "index": 0, "kind": "path", "displayName": "Host", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "localhost", "configurationClass": "org.apache.camel.component.smpp.SmppConfiguration", "configurationField": "configuration", "description": "Hostname for the SMSC server to use." }, "port": { "index": 1, "kind": "path", "displayName": "Port", "group": "common", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 2775, "configurationClass": "org.apache.camel.component.smpp.SmppConfiguration", "configurationField": "configuration", "description": "Port number for the SMSC server to use." }, diff --git a/components/camel-smpp/src/main/docs/smpp-component.adoc b/components/camel-smpp/src/main/docs/smpp-component.adoc index 02358413bb5a9..8c5525d86d6e2 100644 --- a/components/camel-smpp/src/main/docs/smpp-component.adoc +++ b/components/camel-smpp/src/main/docs/smpp-component.adoc @@ -114,6 +114,9 @@ corresponding alphabet. When deciding which alphabet to use in the byte array, the Camel SMPP component does not consider the data coding value (header or configuration), it only considers the specified alphabet (from either the header or endpoint parameter). +The exception is an 8-bit data coding or alphabet in a header: the body is +then sent as the bytes it converts to, as they are. The same values in the +endpoint parameters do not do this, so a byte array body is read as text first. If some characters in the String cannot be represented in the chosen alphabet, they may be replaced by the question mark (`?`) symbol. @@ -121,8 +124,10 @@ Users of the API may want to consider checking if their message body can be converted to ISO-8859-1 before passing it to the component and if not, setting the alphabet header to request UCS-2 encoding. If the alphabet -and data coding options are not specified at all, then the component may -try to detect the required encoding and set the data coding for you. +and data coding options are not specified at all, the component does not +detect the required encoding or set the data coding for you: the text is +encoded for the SMSC default alphabet (`0`), in the `encoding` of the endpoint, +ISO-8859-1 by default. The list of alphabet codes is specified in the SMPP specification v3.4, section 5.2.19. One notable limitation of the SMPP specification is @@ -145,8 +150,10 @@ is completed automatically. If the GSM 3.38 alphabet is used, the component will pack up to 160 characters into the 140-byte message body. -If an 8-bit character set is used (e.g., ISO-8859-1 for Western Europe), then 140 characters will be -allowed within the 140-byte message body. +If the 8-bit alphabet (`4`) is used, then 140 bytes will be +allowed within the 140-byte message body. Text in an 8-bit character set +(e.g., ISO-8859-1 for Western Europe) is split by 140 bytes only with that +alphabet; with the default alphabet, it is split by 160 characters. If 16 bit UCS-2 encoding is used, then just 70 characters fit into each 140-byte message. diff --git a/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppConstants.java b/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppConstants.java index 56736b1bb880a..ddb349a4a0d59 100644 --- a/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppConstants.java +++ b/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppConstants.java @@ -80,12 +80,12 @@ public interface SmppConstants { javaType = "Date") String DONE_DATE = "CamelSmppDoneDate"; @Metadata(label = "producer", description = "*only for SubmitSm,\n" + - "SubmitMulti and DataSm*. Specifies the encoding (character set name) of\n" + - "the bytes in the message body. If the message body is a string then\n" + - "this is not relevant because Java Strings are always Unicode. If the\n" + - "body is a byte array then this header can be used to indicate that it is\n" + - "ISO-8859-1 or some other value. Default value is specified by the\n" + - "endpoint configuration parameter _encoding_", + "SubmitMulti and ReplaceSm*. Specifies the encoding (character set name)\n" + + "the text of the message body is encoded in, as the short message. A\n" + + "byte array body is first read as text, in the charset of the exchange,\n" + + "unless an 8-bit data coding or alphabet header sends it as it is.\n" + + "Default value is specified by the endpoint configuration parameter\n" + + "_encoding_", javaType = "String") String ENCODING = "CamelSmppEncoding"; @Metadata(description = "*Producer:* *only for SubmitMultiSm* The errors which\n" + diff --git a/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppEndpoint.java b/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppEndpoint.java index 84771fb69c4a9..584ea1f40275b 100644 --- a/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppEndpoint.java +++ b/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppEndpoint.java @@ -23,6 +23,9 @@ import org.apache.camel.ExchangePattern; 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; @@ -35,6 +38,25 @@ */ @UriEndpoint(firstVersion = "2.2.0", scheme = "smpp,smpps", title = "SMPP", syntax = "smpp:host:port", category = { Category.MOBILE }, lenientProperties = true, headersClass = SmppConstants.class) +@BodyTypes(consumerOut = @BodyType(value = { Carrier.TEXT, Carrier.BYTES, Carrier.NULL }, + description = "A short message as text decoded by its data coding, or as bytes for an" + + " 8-bit data coding; the text of a delivery receipt, with its fields in" + + " headers. A data_sm or an alert notification has no body"), + producerIn = @BodyType(value = { Carrier.TEXT, Carrier.BYTES, Carrier.FILE }, + description = "The text of the short message: bytes or a file are read as text, unless an" + + " 8-bit CamelSmppDataCoding or CamelSmppAlphabet header sends bytes as they" + + " are. A stream is sent empty and no body fails: convert it to text first;" + + " a Map or a POJO is sent as its toString(). DataSm, QuerySm and CancelSm do" + + " not read the body"), + producerOut = @BodyType(value = Carrier.UNKNOWN, + byOption = { + @BodyType.When(option = "exchangePattern", value = "InOnly", + carriers = Carrier.UNCHANGED), + @BodyType.When(option = "exchangePattern", value = "InOut", + carriers = Carrier.NULL) }, + description = "Unchanged, with the message ids in the CamelSmppId header. When the" + + " exchange expects a reply (InOut), a new message with no body and only the" + + " result headers")) public class SmppEndpoint extends DefaultEndpoint implements EndpointServiceLocation { private SmppBinding binding; diff --git a/components/camel-spring-parent/camel-spring-rabbitmq/src/generated/resources/META-INF/org/apache/camel/component/springrabbit/spring-rabbitmq.json b/components/camel-spring-parent/camel-spring-rabbitmq/src/generated/resources/META-INF/org/apache/camel/component/springrabbit/spring-rabbitmq.json index a2afee539d79a..e2ae70cd9c83b 100644 --- a/components/camel-spring-parent/camel-spring-rabbitmq/src/generated/resources/META-INF/org/apache/camel/component/springrabbit/spring-rabbitmq.json +++ b/components/camel-spring-parent/camel-spring-rabbitmq/src/generated/resources/META-INF/org/apache/camel/component/springrabbit/spring-rabbitmq.json @@ -78,6 +78,12 @@ "CamelSpringRabbitmqPriority": { "index": 18, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The message priority.", "constantName": "org.apache.camel.component.springrabbit.SpringRabbitMQConstants#PRIORITY" }, "CamelSpringRabbitmqClusterId": { "index": 19, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The cluster id.", "constantName": "org.apache.camel.component.springrabbit.SpringRabbitMQConstants#CLUSTER_ID" } }, + "bodyTypes": { + "consumerOut": { "carriers": [ "text", "bytes" ], "dependsOn": [ "messageConverter" ], "description": "A String when the content type starts with text, as for text this component sends; a byte array otherwise, JSON and Java serialized objects too, which are not deserialized" }, + "consumerReply": { "carriers": [ "text", "bytes", "stream", "file" ], "dependsOn": [ "messageConverter" ], "byOption": [ { "option": "allowNullBody", "value": "true", "carriers": [ "null", "text", "bytes", "stream", "file" ] } ], "description": "The reply to a message with a reply-to, converted as the producer converts a body: a Map or a POJO fails" }, + "producerIn": { "carriers": [ "text", "bytes", "stream", "file" ], "dependsOn": [ "messageConverter" ], "byOption": [ { "option": "allowNullBody", "value": "true", "carriers": [ "null", "text", "bytes", "stream", "file" ] } ], "description": "Text, bytes, a stream or a file, sent as a byte array, text as text\/plain unless the CamelSpringRabbitmqContentType header says another type. A Map or a POJO fails, as it is not serialized: marshal it first" }, + "producerOut": { "carriers": [ "unknown" ], "byOption": [ { "option": "exchangePattern", "value": "InOnly", "carriers": [ "unchanged" ] }, { "option": "disableReplyTo", "value": "true", "carriers": [ "unchanged" ] } ], "description": "Unchanged for a message that expects no reply (InOnly). A message that expects one (InOut) gets the body of the reply as the consumer gives it: a String for a text content type, a byte array otherwise" } + }, "properties": { "exchangeName": { "index": 0, "kind": "path", "displayName": "Exchange Name", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The exchange name determines the exchange to which the produced messages will be sent to. In the case of consumers, the exchange name determines the exchange the queue will be bound to. Note: to use default exchange then do not use empty name, but use default instead." }, "connectionFactory": { "index": 1, "kind": "parameter", "displayName": "Connection Factory", "group": "common", "label": "common", "required": false, "type": "object", "javaType": "org.springframework.amqp.rabbit.connection.ConnectionFactory", "deprecated": false, "autowired": false, "secret": false, "description": "The connection factory to be use. A connection factory must be configured either on the component or endpoint." }, diff --git a/components/camel-spring-parent/camel-spring-rabbitmq/src/main/java/org/apache/camel/component/springrabbit/SpringRabbitMQEndpoint.java b/components/camel-spring-parent/camel-spring-rabbitmq/src/main/java/org/apache/camel/component/springrabbit/SpringRabbitMQEndpoint.java index 25343414cffe6..ba560b46b8c7f 100644 --- a/components/camel-spring-parent/camel-spring-rabbitmq/src/main/java/org/apache/camel/component/springrabbit/SpringRabbitMQEndpoint.java +++ b/components/camel-spring-parent/camel-spring-rabbitmq/src/main/java/org/apache/camel/component/springrabbit/SpringRabbitMQEndpoint.java @@ -26,6 +26,9 @@ import org.apache.camel.PollingConsumer; 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; @@ -57,6 +60,36 @@ @UriEndpoint(firstVersion = "3.8.0", scheme = "spring-rabbitmq", title = "Spring RabbitMQ", syntax = "spring-rabbitmq:exchangeName", category = { Category.MESSAGING }, headersClass = SpringRabbitMQConstants.class) +@BodyTypes(consumerOut = @BodyType(value = { Carrier.TEXT, Carrier.BYTES }, dependsOn = "messageConverter", + description = "A String when the content type starts with text, as for text this" + + " component sends; a byte array otherwise, JSON and Java serialized objects" + + " too, which are not deserialized"), + consumerReply = @BodyType(value = { Carrier.TEXT, Carrier.BYTES, Carrier.STREAM, Carrier.FILE }, + dependsOn = "messageConverter", + byOption = @BodyType.When(option = "allowNullBody", value = "true", + carriers = { + Carrier.NULL, Carrier.TEXT, Carrier.BYTES, + Carrier.STREAM, Carrier.FILE }), + description = "The reply to a message with a reply-to, converted as the producer" + + " converts a body: a Map or a POJO fails"), + producerIn = @BodyType(value = { Carrier.TEXT, Carrier.BYTES, Carrier.STREAM, Carrier.FILE }, + dependsOn = "messageConverter", + byOption = @BodyType.When(option = "allowNullBody", value = "true", + carriers = { + Carrier.NULL, Carrier.TEXT, Carrier.BYTES, + Carrier.STREAM, Carrier.FILE }), + description = "Text, bytes, a stream or a file, sent as a byte array, text as text/plain" + + " unless the CamelSpringRabbitmqContentType header says another type. A Map" + + " or a POJO fails, as it is not serialized: marshal it first"), + producerOut = @BodyType(value = Carrier.UNKNOWN, + byOption = { + @BodyType.When(option = "exchangePattern", value = "InOnly", + carriers = Carrier.UNCHANGED), + @BodyType.When(option = "disableReplyTo", value = "true", + carriers = Carrier.UNCHANGED) }, + description = "Unchanged for a message that expects no reply (InOnly). A message that" + + " expects one (InOut) gets the body of the reply as the consumer gives it:" + + " a String for a text content type, a byte array otherwise")) public class SpringRabbitMQEndpoint extends DefaultEndpoint implements AsyncEndpoint, EndpointServiceLocation { public static final String ARG_PREFIX = "arg."; diff --git a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/SmppEndpointBuilderFactory.java b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/SmppEndpointBuilderFactory.java index 806c9fd636b0a..1a6b3cf79bbd8 100644 --- a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/SmppEndpointBuilderFactory.java +++ b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/SmppEndpointBuilderFactory.java @@ -3011,13 +3011,12 @@ public String smppDoneDate() { return "CamelSmppDoneDate"; } /** - * only for SubmitSm, SubmitMulti and DataSm. Specifies the encoding - * (character set name) of the bytes in the message body. If the message - * body is a string then this is not relevant because Java Strings are - * always Unicode. If the body is a byte array then this header can be - * used to indicate that it is ISO-8859-1 or some other value. Default - * value is specified by the endpoint configuration parameter - * _encoding_. + * only for SubmitSm, SubmitMulti and ReplaceSm. Specifies the encoding + * (character set name) the text of the message body is encoded in, as + * the short message. A byte array body is first read as text, in the + * charset of the exchange, unless an 8-bit data coding or alphabet + * header sends it as it is. Default value is specified by the endpoint + * configuration parameter _encoding_. * * The option is a: {@code String} type. * diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/test/java/org/apache/camel/dsl/yaml/validator/TextBodyFlowTest.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/test/java/org/apache/camel/dsl/yaml/validator/TextBodyFlowTest.java index 620acf8bab550..24da4237401c3 100644 --- a/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/test/java/org/apache/camel/dsl/yaml/validator/TextBodyFlowTest.java +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/test/java/org/apache/camel/dsl/yaml/validator/TextBodyFlowTest.java @@ -1406,6 +1406,91 @@ public void testTheBodyOfCloudMessaging() { .anySatisfy(m -> assertThat(m).contains("to: google-pubsub needs the body as text or bytes")); } + @Test + public void testTheBodyOfMessaging() { + // the paho consumer gives bytes, so a field read needs an unmarshal; pulsar and smtp send what converts to + // bytes or text, so parsed data must be marshalled first, and so must the reply of a nats consumer that answers + // (InOut); the converter of spring-rabbitmq may be set on the component, and an imap mail may be text, a stream + // or a multipart, which say nothing + String yaml = """ + - route: + id: mqtt + from: + uri: paho:orders + steps: + - setHeader: + name: id + simple: ${body[id]} + - route: + id: publish + from: + uri: timer:tick + steps: + - setBody: + constant: '{"id": 1}' + - unmarshal: + json: {} + - to: pulsar:persistent://public/default/orders + - route: + id: service + from: + uri: nats:orders + parameters: + exchangePattern: InOut + steps: + - setBody: + constant: '{"id": 1}' + - unmarshal: + json: {} + - route: + id: listener + from: + uri: nats:events + steps: + - setBody: + constant: '{"id": 1}' + - unmarshal: + json: {} + - route: + id: rabbit + from: + uri: timer:tick + steps: + - setBody: + constant: '{"id": 1}' + - unmarshal: + json: {} + - to: spring-rabbitmq:orders + - route: + id: mail + from: + uri: timer:tick + steps: + - setBody: + constant: '{"id": 1}' + - unmarshal: + json: {} + - to: smtp://localhost?to=info@acme.com + - route: + id: inbox + from: + uri: imap://localhost + steps: + - setHeader: + name: id + simple: ${body[id]} + """; + assertThat(lines(yaml)).hasSize(4).anySatisfy(m -> assertThat(m) + .contains("route mqtt: simple reads a field of the body (${body[id]})") + .contains("the paho consumer gives it as bytes")) + .anySatisfy(m -> assertThat(m).contains("to: pulsar needs the body as text, bytes, a stream or a file")) + .anySatisfy(m -> assertThat(m) + .contains("route service:") + .contains("the body at the end of the route is the reply to the nats request")) + .anySatisfy(m -> assertThat(m) + .contains("route mail: to: smtp needs the body as text, bytes, a stream or a file")); + } + @Test public void testTheBodyOfCoreComponents() { // the stream consumer gives each line as text, so a field read needs an unmarshal, and stream:out writes text,