This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push: new eb5b6ab9219 CAMEL-11780: camel-amqp improve option handling (#16125) eb5b6ab9219 is described below commit eb5b6ab9219f42382562ac76ea4b3d059fb966c8 Author: Jono Morris <j...@apache.org> AuthorDate: Thu Oct 31 08:14:49 2024 +1300 CAMEL-11780: camel-amqp improve option handling (#16125) * CAMEL-11780 initialize if any option provided * CAMEL-11780 generated changes --- .../org/apache/camel/catalog/components/amqp.json | 8 +-- .../component/amqp/AMQPComponentConfigurer.java | 16 ++--- .../org/apache/camel/component/amqp/amqp.json | 8 +-- .../camel-amqp/src/main/docs/amqp-component.adoc | 11 +++- .../apache/camel/component/amqp/AMQPComponent.java | 54 +++++++-------- .../camel/component/amqp/AMQPConfigTest.java | 76 +++++++++++++++++++++- .../component/dsl/AmqpComponentBuilderFactory.java | 26 +++----- 7 files changed, 130 insertions(+), 69 deletions(-) diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/amqp.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/amqp.json index 29d7998d6db..301b1fbabd7 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/amqp.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/amqp.json @@ -28,18 +28,18 @@ "connectionFactory": { "index": 1, "kind": "property", "displayName": "Connection Factory", "group": "common", "label": "", "required": false, "type": "object", "javaType": "jakarta.jms.ConnectionFactory", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jms.JmsConfiguration", "configurationField": "configuration", "description": "The connection factory to be use. A connection factory must be configured either on the componen [...] "disableReplyTo": { "index": 2, "kind": "property", "displayName": "Disable Reply To", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.jms.JmsConfiguration", "configurationField": "configuration", "description": "Specifies whether Camel ignores the JMSReplyTo header in messages. If true, Camel does not send a r [...] "durableSubscriptionName": { "index": 3, "kind": "property", "displayName": "Durable Subscription Name", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jms.JmsConfiguration", "configurationField": "configuration", "description": "The durable subscriber name for specifying durable topic subscriptions. The clientId option must [...] - "host": { "index": 4, "kind": "property", "displayName": "Host", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "localhost", "description": "The host name or IP address of the computer that hosts the AMQP Broker." }, + "host": { "index": 4, "kind": "property", "displayName": "Host", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The host name or IP address of the computer that hosts the AMQP Broker." }, "includeAmqpAnnotations": { "index": 5, "kind": "property", "displayName": "Include AMQP Annotations", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to include AMQP annotations when mapping from AMQP to Camel Message. Setting this to true maps AMQP message annotations that contain a JMS_AMQP_MA_ prefix to messag [...] "jmsMessageType": { "index": 6, "kind": "property", "displayName": "Jms Message Type", "group": "common", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.jms.JmsMessageType", "enum": [ "Bytes", "Map", "Object", "Stream", "Text" ], "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jms.JmsConfiguration", "configurationField": "configuration", "description": "Allows you to force the use o [...] "keyStoreLocation": { "index": 7, "kind": "property", "displayName": "Key Store Location", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The SSL keystore location." }, "keyStoreType": { "index": 8, "kind": "property", "displayName": "Key Store Type", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "JKS", "description": "The SSL keystore type." }, - "port": { "index": 9, "kind": "property", "displayName": "Port", "group": "common", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 5672, "description": "The port number on which the AMPQ Broker listens." }, + "port": { "index": 9, "kind": "property", "displayName": "Port", "group": "common", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "description": "The port number on which the AMPQ Broker listens." }, "replyTo": { "index": 10, "kind": "property", "displayName": "Reply To", "group": "common", "label": "common", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jms.JmsConfiguration", "configurationField": "configuration", "description": "Provides an explicit ReplyTo destination (overrides any incoming value of Message.getJMSReplyTo() in consumer)." }, "testConnectionOnStartup": { "index": 11, "kind": "property", "displayName": "Test Connection On Startup", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.jms.JmsConfiguration", "configurationField": "configuration", "description": "Specifies whether to test the connection on startup. This ensures that when Cam [...] "trustStoreLocation": { "index": 12, "kind": "property", "displayName": "Trust Store Location", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The SSL truststore location." }, "trustStoreType": { "index": 13, "kind": "property", "displayName": "Trust Store Type", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "JKS", "description": "The SSL truststore type." }, - "useSsl": { "index": 14, "kind": "property", "displayName": "Use Ssl", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable SSL when connecting to the AMQP Broker." }, - "useTopicPrefix": { "index": 15, "kind": "property", "displayName": "Use Topic Prefix", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to configure topics with a topic:\/\/ prefix." }, + "useSsl": { "index": 14, "kind": "property", "displayName": "Use Ssl", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to enable SSL when connecting to the AMQP Broker." }, + "useTopicPrefix": { "index": 15, "kind": "property", "displayName": "Use Topic Prefix", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to configure topics with a topic:\/\/ prefix." }, "acknowledgementModeName": { "index": 16, "kind": "property", "displayName": "Acknowledgement Mode Name", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "enum": [ "SESSION_TRANSACTED", "CLIENT_ACKNOWLEDGE", "AUTO_ACKNOWLEDGE", "DUPS_OK_ACKNOWLEDGE" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "AUTO_ACKNOWLEDGE", "configurationClass": "org.apache.camel.component.jms.JmsConfiguration", "conf [...] "artemisConsumerPriority": { "index": 17, "kind": "property", "displayName": "Artemis Consumer Priority", "group": "consumer", "label": "consumer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jms.JmsConfiguration", "configurationField": "configuration", "description": "Consumer priorities allow you to ensure that high priority consumers receive messages while they [...] "asyncConsumer": { "index": 18, "kind": "property", "displayName": "Async Consumer", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.jms.JmsConfiguration", "configurationField": "configuration", "description": "Whether the JmsConsumer processes the Exchange asynchronously. If enabled then the JmsConsu [...] diff --git a/components/camel-amqp/src/generated/java/org/apache/camel/component/amqp/AMQPComponentConfigurer.java b/components/camel-amqp/src/generated/java/org/apache/camel/component/amqp/AMQPComponentConfigurer.java index a05416e70c5..9f6202050c6 100644 --- a/components/camel-amqp/src/generated/java/org/apache/camel/component/amqp/AMQPComponentConfigurer.java +++ b/components/camel-amqp/src/generated/java/org/apache/camel/component/amqp/AMQPComponentConfigurer.java @@ -32,7 +32,7 @@ public class AMQPComponentConfigurer extends JmsComponentConfigurer implements G case "keyStorePassword": target.setKeyStorePassword(property(camelContext, java.lang.String.class, value)); return true; case "keystoretype": case "keyStoreType": target.setKeyStoreType(property(camelContext, java.lang.String.class, value)); return true; - case "port": target.setPort(property(camelContext, int.class, value)); return true; + case "port": target.setPort(property(camelContext, java.lang.Integer.class, value)); return true; case "truststorelocation": case "trustStoreLocation": target.setTrustStoreLocation(property(camelContext, java.lang.String.class, value)); return true; case "truststorepassword": @@ -40,9 +40,9 @@ public class AMQPComponentConfigurer extends JmsComponentConfigurer implements G case "truststoretype": case "trustStoreType": target.setTrustStoreType(property(camelContext, java.lang.String.class, value)); return true; case "usessl": - case "useSsl": target.setUseSsl(property(camelContext, boolean.class, value)); return true; + case "useSsl": target.setUseSsl(property(camelContext, java.lang.Boolean.class, value)); return true; case "usetopicprefix": - case "useTopicPrefix": target.setUseTopicPrefix(property(camelContext, boolean.class, value)); return true; + case "useTopicPrefix": target.setUseTopicPrefix(property(camelContext, java.lang.Boolean.class, value)); return true; default: return super.configure(camelContext, obj, name, value, ignoreCase); } } @@ -59,7 +59,7 @@ public class AMQPComponentConfigurer extends JmsComponentConfigurer implements G case "keyStorePassword": return java.lang.String.class; case "keystoretype": case "keyStoreType": return java.lang.String.class; - case "port": return int.class; + case "port": return java.lang.Integer.class; case "truststorelocation": case "trustStoreLocation": return java.lang.String.class; case "truststorepassword": @@ -67,9 +67,9 @@ public class AMQPComponentConfigurer extends JmsComponentConfigurer implements G case "truststoretype": case "trustStoreType": return java.lang.String.class; case "usessl": - case "useSsl": return boolean.class; + case "useSsl": return java.lang.Boolean.class; case "usetopicprefix": - case "useTopicPrefix": return boolean.class; + case "useTopicPrefix": return java.lang.Boolean.class; default: return super.getOptionType(name, ignoreCase); } } @@ -95,9 +95,9 @@ public class AMQPComponentConfigurer extends JmsComponentConfigurer implements G case "truststoretype": case "trustStoreType": return target.getTrustStoreType(); case "usessl": - case "useSsl": return target.isUseSsl(); + case "useSsl": return target.getUseSsl(); case "usetopicprefix": - case "useTopicPrefix": return target.isUseTopicPrefix(); + case "useTopicPrefix": return target.getUseTopicPrefix(); default: return super.getOptionValue(obj, name, ignoreCase); } } diff --git a/components/camel-amqp/src/generated/resources/META-INF/org/apache/camel/component/amqp/amqp.json b/components/camel-amqp/src/generated/resources/META-INF/org/apache/camel/component/amqp/amqp.json index 29d7998d6db..301b1fbabd7 100644 --- a/components/camel-amqp/src/generated/resources/META-INF/org/apache/camel/component/amqp/amqp.json +++ b/components/camel-amqp/src/generated/resources/META-INF/org/apache/camel/component/amqp/amqp.json @@ -28,18 +28,18 @@ "connectionFactory": { "index": 1, "kind": "property", "displayName": "Connection Factory", "group": "common", "label": "", "required": false, "type": "object", "javaType": "jakarta.jms.ConnectionFactory", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jms.JmsConfiguration", "configurationField": "configuration", "description": "The connection factory to be use. A connection factory must be configured either on the componen [...] "disableReplyTo": { "index": 2, "kind": "property", "displayName": "Disable Reply To", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.jms.JmsConfiguration", "configurationField": "configuration", "description": "Specifies whether Camel ignores the JMSReplyTo header in messages. If true, Camel does not send a r [...] "durableSubscriptionName": { "index": 3, "kind": "property", "displayName": "Durable Subscription Name", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jms.JmsConfiguration", "configurationField": "configuration", "description": "The durable subscriber name for specifying durable topic subscriptions. The clientId option must [...] - "host": { "index": 4, "kind": "property", "displayName": "Host", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "localhost", "description": "The host name or IP address of the computer that hosts the AMQP Broker." }, + "host": { "index": 4, "kind": "property", "displayName": "Host", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The host name or IP address of the computer that hosts the AMQP Broker." }, "includeAmqpAnnotations": { "index": 5, "kind": "property", "displayName": "Include AMQP Annotations", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to include AMQP annotations when mapping from AMQP to Camel Message. Setting this to true maps AMQP message annotations that contain a JMS_AMQP_MA_ prefix to messag [...] "jmsMessageType": { "index": 6, "kind": "property", "displayName": "Jms Message Type", "group": "common", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.jms.JmsMessageType", "enum": [ "Bytes", "Map", "Object", "Stream", "Text" ], "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jms.JmsConfiguration", "configurationField": "configuration", "description": "Allows you to force the use o [...] "keyStoreLocation": { "index": 7, "kind": "property", "displayName": "Key Store Location", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The SSL keystore location." }, "keyStoreType": { "index": 8, "kind": "property", "displayName": "Key Store Type", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "JKS", "description": "The SSL keystore type." }, - "port": { "index": 9, "kind": "property", "displayName": "Port", "group": "common", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 5672, "description": "The port number on which the AMPQ Broker listens." }, + "port": { "index": 9, "kind": "property", "displayName": "Port", "group": "common", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "description": "The port number on which the AMPQ Broker listens." }, "replyTo": { "index": 10, "kind": "property", "displayName": "Reply To", "group": "common", "label": "common", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jms.JmsConfiguration", "configurationField": "configuration", "description": "Provides an explicit ReplyTo destination (overrides any incoming value of Message.getJMSReplyTo() in consumer)." }, "testConnectionOnStartup": { "index": 11, "kind": "property", "displayName": "Test Connection On Startup", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.jms.JmsConfiguration", "configurationField": "configuration", "description": "Specifies whether to test the connection on startup. This ensures that when Cam [...] "trustStoreLocation": { "index": 12, "kind": "property", "displayName": "Trust Store Location", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The SSL truststore location." }, "trustStoreType": { "index": 13, "kind": "property", "displayName": "Trust Store Type", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "JKS", "description": "The SSL truststore type." }, - "useSsl": { "index": 14, "kind": "property", "displayName": "Use Ssl", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable SSL when connecting to the AMQP Broker." }, - "useTopicPrefix": { "index": 15, "kind": "property", "displayName": "Use Topic Prefix", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to configure topics with a topic:\/\/ prefix." }, + "useSsl": { "index": 14, "kind": "property", "displayName": "Use Ssl", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to enable SSL when connecting to the AMQP Broker." }, + "useTopicPrefix": { "index": 15, "kind": "property", "displayName": "Use Topic Prefix", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to configure topics with a topic:\/\/ prefix." }, "acknowledgementModeName": { "index": 16, "kind": "property", "displayName": "Acknowledgement Mode Name", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "enum": [ "SESSION_TRANSACTED", "CLIENT_ACKNOWLEDGE", "AUTO_ACKNOWLEDGE", "DUPS_OK_ACKNOWLEDGE" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "AUTO_ACKNOWLEDGE", "configurationClass": "org.apache.camel.component.jms.JmsConfiguration", "conf [...] "artemisConsumerPriority": { "index": 17, "kind": "property", "displayName": "Artemis Consumer Priority", "group": "consumer", "label": "consumer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jms.JmsConfiguration", "configurationField": "configuration", "description": "Consumer priorities allow you to ensure that high priority consumers receive messages while they [...] "asyncConsumer": { "index": 18, "kind": "property", "displayName": "Async Consumer", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.jms.JmsConfiguration", "configurationField": "configuration", "description": "Whether the JmsConsumer processes the Exchange asynchronously. If enabled then the JmsConsu [...] diff --git a/components/camel-amqp/src/main/docs/amqp-component.adoc b/components/camel-amqp/src/main/docs/amqp-component.adoc index c87d6f5fc13..759d8276e2b 100644 --- a/components/camel-amqp/src/main/docs/amqp-component.adoc +++ b/components/camel-amqp/src/main/docs/amqp-component.adoc @@ -83,12 +83,13 @@ AMQPComponent amqp = AMQPComponent.amqpComponent("amqp://localhost:5672"); AMQPComponent authorizedAmqp = AMQPComponent.amqpComponent("amqp://localhost:5672", "user", "password"); ---- -Alternatively, configure the AMQP Component using the available options for SSL, authentication, -and AMQP Broker host/port. +Alternatively, the AMQP Component can be initialized by providing one or more of the available options for +configuring SSL, authentication, and AMQP Broker host and port. *SSL configuration* -The component can be configured to connect to an AMQP broker using SSL, for example: +The component can be configured to connect to an AMQP broker using SSL by setting the +`useSsl` option and providing keystore and truststore details, for example: [source,java] ---- @@ -124,6 +125,10 @@ amqpComponent.setHost("remoteHost"); amqpComponent.setPort(5555); ---- +If `host` or `port` options have not been provided and the component is initialized using one or more of the other available +options the host on the AMQP JMSConnectionFactory URI is set to 'localhost' if not provided, and the port is set to '5672' +if not provided. + *Spring AMQP connection details auto-configuration* [source,java] diff --git a/components/camel-amqp/src/main/java/org/apache/camel/component/amqp/AMQPComponent.java b/components/camel-amqp/src/main/java/org/apache/camel/component/amqp/AMQPComponent.java index 9c4c61fca7b..a8302e018ee 100644 --- a/components/camel-amqp/src/main/java/org/apache/camel/component/amqp/AMQPComponent.java +++ b/components/camel-amqp/src/main/java/org/apache/camel/component/amqp/AMQPComponent.java @@ -40,15 +40,14 @@ public class AMQPComponent extends JmsComponent { public static final String AMQP_DEFAULT_HOST = "localhost"; public static final int AMQP_DEFAULT_PORT = 5672; - @Metadata(defaultValue = "localhost", - description = "The host name or IP address of the computer that hosts the AMQP Broker.") - private String host = AMQP_DEFAULT_HOST; - @Metadata(defaultValue = "5672", description = "The port number on which the AMPQ Broker listens.") - private int port = AMQP_DEFAULT_PORT; - @Metadata(defaultValue = "true", description = "Whether to configure topics with a `topic://` prefix.") - private boolean useTopicPrefix = true; + @Metadata(description = "The host name or IP address of the computer that hosts the AMQP Broker.") + private String host; + @Metadata(description = "The port number on which the AMPQ Broker listens.") + private Integer port; + @Metadata(description = "Whether to configure topics with a `topic://` prefix.") + private Boolean useTopicPrefix; @Metadata(description = "Whether to enable SSL when connecting to the AMQP Broker.") - private boolean useSsl; + private Boolean useSsl; @Metadata(description = "The SSL keystore location.") private String keyStoreLocation; @Metadata(defaultValue = "JKS", description = "The SSL keystore type.") @@ -98,21 +97,22 @@ public class AMQPComponent extends JmsComponent { @Override protected void doInit() throws Exception { - if (useConfig()) { + if (host != null || port != null || getUsername() != null || getPassword() != null || useTopicPrefix != null + || useSsl != null) { StringBuilder sb = new StringBuilder(); - sb.append(useSsl ? "amqps://" : "amqp://"); - sb.append(host).append(":").append(port); - if (isUseSsl()) { - sb.append("?transport.trustStoreLocation=").append(trustStoreLocation); + sb.append(useSsl == Boolean.TRUE ? "amqps://" : "amqp://"); + sb.append(host == null ? AMQP_DEFAULT_HOST : host).append(":").append(port == null ? AMQP_DEFAULT_PORT : port); + if (useSsl == Boolean.TRUE) { + sb.append("?transport.trustStoreLocation=").append(trustStoreLocation == null ? "" : trustStoreLocation); sb.append("&transport.trustStoreType=").append(trustStoreType); - sb.append("&transport.trustStorePassword=").append(trustStorePassword); - sb.append("&transport.keyStoreLocation=").append(keyStoreLocation); + sb.append("&transport.trustStorePassword=").append(trustStorePassword == null ? "" : trustStorePassword); + sb.append("&transport.keyStoreLocation=").append(keyStoreLocation == null ? "" : keyStoreLocation); sb.append("&transport.keyStoreType=").append(keyStoreType); - sb.append("&transport.keyStorePassword=").append(keyStorePassword); + sb.append("&transport.keyStorePassword=").append(keyStorePassword == null ? "" : keyStorePassword); } JmsConnectionFactory connectionFactory = new JmsConnectionFactory(getUsername(), getPassword(), sb.toString()); - if (useTopicPrefix) { + if (useTopicPrefix != Boolean.FALSE) { connectionFactory.setTopicPrefix("topic://"); } getConfiguration().setConnectionFactory(connectionFactory); @@ -132,14 +132,6 @@ public class AMQPComponent extends JmsComponent { super.doInit(); } - private boolean useConfig() { - if (!host.equals(AMQP_DEFAULT_HOST) || port != AMQP_DEFAULT_PORT || getUsername() != null || - getPassword() != null || !useTopicPrefix || useSsl) { - return true; - } - return false; - } - @Override protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception { JmsEndpoint endpoint = (JmsEndpoint) super.createEndpoint(uri, remaining, parameters); @@ -197,27 +189,27 @@ public class AMQPComponent extends JmsComponent { this.host = host; } - public int getPort() { + public Integer getPort() { return port; } - public void setPort(int port) { + public void setPort(Integer port) { this.port = port; } - public boolean isUseTopicPrefix() { + public Boolean getUseTopicPrefix() { return useTopicPrefix; } - public void setUseTopicPrefix(boolean useTopicPrefix) { + public void setUseTopicPrefix(Boolean useTopicPrefix) { this.useTopicPrefix = useTopicPrefix; } - public boolean isUseSsl() { + public Boolean getUseSsl() { return useSsl; } - public void setUseSsl(boolean useSsl) { + public void setUseSsl(Boolean useSsl) { this.useSsl = useSsl; } diff --git a/components/camel-amqp/src/test/java/org/apache/camel/component/amqp/AMQPConfigTest.java b/components/camel-amqp/src/test/java/org/apache/camel/component/amqp/AMQPConfigTest.java index 72c22556502..eefdce6f904 100644 --- a/components/camel-amqp/src/test/java/org/apache/camel/component/amqp/AMQPConfigTest.java +++ b/components/camel-amqp/src/test/java/org/apache/camel/component/amqp/AMQPConfigTest.java @@ -26,6 +26,7 @@ import org.junit.jupiter.api.extension.RegisterExtension; import static org.apache.camel.component.amqp.AMQPComponent.amqpComponent; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -49,8 +50,12 @@ public class AMQPConfigTest { @Test public void testConfiguredComponent() { AMQPComponent customizedComponent = contextExtension.getContext().getComponent("amqp-configured", AMQPComponent.class); - assertTrue(customizedComponent.getConnectionFactory() instanceof JmsConnectionFactory); + assertEquals("remotehost", customizedComponent.getHost()); + assertEquals(5556, customizedComponent.getPort()); + assertEquals("camel", customizedComponent.getUsername()); + assertEquals("rider", customizedComponent.getPassword()); + assertTrue(customizedComponent.getConnectionFactory() instanceof JmsConnectionFactory); JmsConnectionFactory connectionFactory = (JmsConnectionFactory) customizedComponent.getConnectionFactory(); assertEquals("camel", connectionFactory.getUsername()); assertEquals("rider", connectionFactory.getPassword()); @@ -61,8 +66,15 @@ public class AMQPConfigTest { @Test public void testConfiguredSslComponent() { AMQPComponent customizedComponent = contextExtension.getContext().getComponent("amqps-configured", AMQPComponent.class); - assertTrue(customizedComponent.getConnectionFactory() instanceof JmsConnectionFactory); + assertTrue(customizedComponent.getUseSsl()); + assertEquals("server-ca-truststore.p12", customizedComponent.getTrustStoreLocation()); + assertEquals("securepass", customizedComponent.getTrustStorePassword()); + assertEquals("PKCS12", customizedComponent.getTrustStoreType()); + assertEquals("server-keystore.p12", customizedComponent.getKeyStoreLocation()); + assertEquals("securepass", customizedComponent.getKeyStorePassword()); + assertEquals("PKCS12", customizedComponent.getKeyStoreType()); + assertTrue(customizedComponent.getConnectionFactory() instanceof JmsConnectionFactory); JmsConnectionFactory connectionFactory = (JmsConnectionFactory) customizedComponent.getConnectionFactory(); assertNull(connectionFactory.getUsername()); assertNull(connectionFactory.getPassword()); @@ -72,6 +84,54 @@ public class AMQPConfigTest { assertEquals("topic://", connectionFactory.getTopicPrefix()); } + @Test + public void testEnabledSslComponent() { + AMQPComponent amqpSslEnabledComponent + = contextExtension.getContext().getComponent("amqps-enabled", AMQPComponent.class); + assertTrue(amqpSslEnabledComponent.getUseSsl()); + assertNull(amqpSslEnabledComponent.getTrustStoreLocation()); + assertNull(amqpSslEnabledComponent.getTrustStorePassword()); + assertEquals("JKS", amqpSslEnabledComponent.getTrustStoreType()); + assertNull(amqpSslEnabledComponent.getKeyStoreLocation()); + assertNull(amqpSslEnabledComponent.getKeyStorePassword()); + assertEquals("JKS", amqpSslEnabledComponent.getKeyStoreType()); + + assertTrue(amqpSslEnabledComponent.getConnectionFactory() instanceof JmsConnectionFactory); + JmsConnectionFactory connectionFactory = (JmsConnectionFactory) amqpSslEnabledComponent.getConnectionFactory(); + assertNull(connectionFactory.getUsername()); + assertNull(connectionFactory.getPassword()); + assertEquals( + "amqps://localhost:5672?transport.trustStoreLocation=&transport.trustStoreType=JKS&transport.trustStorePassword=&transport.keyStoreLocation=&transport.keyStoreType=JKS&transport.keyStorePassword=", + connectionFactory.getRemoteURI()); + assertEquals("topic://", connectionFactory.getTopicPrefix()); + } + + @Test + public void testComponentPort() { + AMQPComponent amqpComponent = contextExtension.getContext().getComponent("amqp-portonly", AMQPComponent.class); + assertEquals(5556, amqpComponent.getPort()); + + assertTrue(amqpComponent.getConnectionFactory() instanceof JmsConnectionFactory); + JmsConnectionFactory connectionFactory = (JmsConnectionFactory) amqpComponent.getConnectionFactory(); + assertNull(connectionFactory.getUsername()); + assertNull(connectionFactory.getPassword()); + assertEquals("amqp://localhost:5556", connectionFactory.getRemoteURI()); + assertEquals("topic://", connectionFactory.getTopicPrefix()); + } + + @Test + public void testNoTopicPrefix() { + AMQPComponent component = contextExtension.getContext().getComponent("amqp-notopicprefix", AMQPComponent.class); + assertFalse(component.getUseTopicPrefix()); + + assertTrue(component.getConnectionFactory() instanceof JmsConnectionFactory); + JmsConnectionFactory connectionFactory = (JmsConnectionFactory) component.getConnectionFactory(); + assertNull(connectionFactory.getUsername()); + assertNull(connectionFactory.getPassword()); + assertEquals("amqp://localhost:5672", connectionFactory.getRemoteURI()); + assertNull(connectionFactory.getTopicPrefix()); + } + @ContextFixture public void configureContext(CamelContext context) { context.addComponent("amqp", amqpComponent("amqp://remotehost:5556")); @@ -92,5 +152,17 @@ public class AMQPConfigTest { amqpSslComponent.setKeyStorePassword("securepass"); amqpSslComponent.setKeyStoreType("PKCS12"); context.addComponent("amqps-configured", amqpSslComponent); + + AMQPComponent amqpSslEnabledComponent = new AMQPComponent(); + amqpSslEnabledComponent.setUseSsl(true); + context.addComponent("amqps-enabled", amqpSslEnabledComponent); + + AMQPComponent amqpPortOnlyComponent = new AMQPComponent(); + amqpPortOnlyComponent.setPort(5556); + context.addComponent("amqp-portonly", amqpPortOnlyComponent); + + AMQPComponent amqpNoTopicPrefix = new AMQPComponent(); + amqpNoTopicPrefix.setUseTopicPrefix(false); + context.addComponent("amqp-notopicprefix", amqpNoTopicPrefix); } } diff --git a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/AmqpComponentBuilderFactory.java b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/AmqpComponentBuilderFactory.java index 2aa90ba090d..5dd24219338 100644 --- a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/AmqpComponentBuilderFactory.java +++ b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/AmqpComponentBuilderFactory.java @@ -125,14 +125,12 @@ public interface AmqpComponentBuilderFactory { return this; } - /** * The host name or IP address of the computer that hosts the AMQP * Broker. * * The option is a: <code>java.lang.String</code> type. * - * Default: localhost * Group: common * * @param host the value to set @@ -215,19 +213,17 @@ public interface AmqpComponentBuilderFactory { return this; } - /** * The port number on which the AMPQ Broker listens. * - * The option is a: <code>int</code> type. + * The option is a: <code>java.lang.Integer</code> type. * - * Default: 5672 * Group: common * * @param port the value to set * @return the dsl builder */ - default AmqpComponentBuilder port(int port) { + default AmqpComponentBuilder port(java.lang.Integer port) { doSetProperty("port", port); return this; } @@ -301,36 +297,32 @@ public interface AmqpComponentBuilderFactory { return this; } - /** * Whether to enable SSL when connecting to the AMQP Broker. * - * The option is a: <code>boolean</code> type. + * The option is a: <code>java.lang.Boolean</code> type. * - * Default: false * Group: common * * @param useSsl the value to set * @return the dsl builder */ - default AmqpComponentBuilder useSsl(boolean useSsl) { + default AmqpComponentBuilder useSsl(java.lang.Boolean useSsl) { doSetProperty("useSsl", useSsl); return this; } - /** * Whether to configure topics with a topic:// prefix. * - * The option is a: <code>boolean</code> type. + * The option is a: <code>java.lang.Boolean</code> type. * - * Default: true * Group: common * * @param useTopicPrefix the value to set * @return the dsl builder */ - default AmqpComponentBuilder useTopicPrefix(boolean useTopicPrefix) { + default AmqpComponentBuilder useTopicPrefix(java.lang.Boolean useTopicPrefix) { doSetProperty("useTopicPrefix", useTopicPrefix); return this; } @@ -2402,13 +2394,13 @@ public interface AmqpComponentBuilderFactory { case "jmsMessageType": getOrCreateConfiguration((AMQPComponent) component).setJmsMessageType((org.apache.camel.component.jms.JmsMessageType) value); return true; case "keyStoreLocation": ((AMQPComponent) component).setKeyStoreLocation((java.lang.String) value); return true; case "keyStoreType": ((AMQPComponent) component).setKeyStoreType((java.lang.String) value); return true; - case "port": ((AMQPComponent) component).setPort((int) value); return true; + case "port": ((AMQPComponent) component).setPort((java.lang.Integer) value); return true; case "replyTo": getOrCreateConfiguration((AMQPComponent) component).setReplyTo((java.lang.String) value); return true; case "testConnectionOnStartup": getOrCreateConfiguration((AMQPComponent) component).setTestConnectionOnStartup((boolean) value); return true; case "trustStoreLocation": ((AMQPComponent) component).setTrustStoreLocation((java.lang.String) value); return true; case "trustStoreType": ((AMQPComponent) component).setTrustStoreType((java.lang.String) value); return true; - case "useSsl": ((AMQPComponent) component).setUseSsl((boolean) value); return true; - case "useTopicPrefix": ((AMQPComponent) component).setUseTopicPrefix((boolean) value); return true; + case "useSsl": ((AMQPComponent) component).setUseSsl((java.lang.Boolean) value); return true; + case "useTopicPrefix": ((AMQPComponent) component).setUseTopicPrefix((java.lang.Boolean) value); return true; case "acknowledgementModeName": getOrCreateConfiguration((AMQPComponent) component).setAcknowledgementModeName((java.lang.String) value); return true; case "artemisConsumerPriority": getOrCreateConfiguration((AMQPComponent) component).setArtemisConsumerPriority((int) value); return true; case "asyncConsumer": getOrCreateConfiguration((AMQPComponent) component).setAsyncConsumer((boolean) value); return true;