This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch camel-3.14.x in repository https://gitbox.apache.org/repos/asf/camel.git
commit 5440c6ab01a5a4683b2d1b34383037b26571c070 Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Tue Mar 1 16:09:24 2022 +0100 CAMEL-17704: camel-netty-starter - Unable to set camel.component.netty.decoders --- .../http/NettyHttpConfigurationConfigurer.java | 28 +++++-- .../camel/component/netty/http/netty-http.json | 8 +- .../netty/http/HttpClientInitializerFactory.java | 4 +- .../netty/http/HttpServerInitializerFactory.java | 4 +- .../netty/http/NettyHttpConfiguration.java | 8 +- components/camel-netty/pom.xml | 5 ++ .../component/netty/NettyComponentConfigurer.java | 10 +-- .../netty/NettyConfigurationConfigurer.java | 28 +++++-- .../component/netty/NettyEndpointConfigurer.java | 10 +-- .../org/apache/camel/component/netty/netty.json | 8 +- .../netty/DefaultClientInitializerFactory.java | 4 +- .../netty/DefaultServerInitializerFactory.java | 4 +- .../camel/component/netty/NettyConfiguration.java | 97 +++++++++++++++------- .../component/netty/MainNettyCustomCodecTest.java | 60 +++++++++++++ 14 files changed, 200 insertions(+), 78 deletions(-) diff --git a/components/camel-netty-http/src/generated/java/org/apache/camel/component/netty/http/NettyHttpConfigurationConfigurer.java b/components/camel-netty-http/src/generated/java/org/apache/camel/component/netty/http/NettyHttpConfigurationConfigurer.java index 2fc676d9298..f81752b3585 100644 --- a/components/camel-netty-http/src/generated/java/org/apache/camel/component/netty/http/NettyHttpConfigurationConfigurer.java +++ b/components/camel-netty-http/src/generated/java/org/apache/camel/component/netty/http/NettyHttpConfigurationConfigurer.java @@ -56,7 +56,9 @@ public class NettyHttpConfigurationConfigurer extends org.apache.camel.support.c case "decodermaxlinelength": case "DecoderMaxLineLength": target.setDecoderMaxLineLength(property(camelContext, int.class, value)); return true; case "decoders": - case "Decoders": target.setDecoders(property(camelContext, java.util.List.class, value)); return true; + case "Decoders": target.setDecoders(property(camelContext, java.lang.String.class, value)); return true; + case "decodersaslist": + case "DecodersAsList": target.setDecodersAsList(property(camelContext, java.util.List.class, value)); return true; case "delimiter": case "Delimiter": target.setDelimiter(property(camelContext, org.apache.camel.component.netty.TextLineDelimiter.class, value)); return true; case "disablestreamcache": @@ -68,7 +70,9 @@ public class NettyHttpConfigurationConfigurer extends org.apache.camel.support.c case "enabledprotocols": case "EnabledProtocols": target.setEnabledProtocols(property(camelContext, java.lang.String.class, value)); return true; case "encoders": - case "Encoders": target.setEncoders(property(camelContext, java.util.List.class, value)); return true; + case "Encoders": target.setEncoders(property(camelContext, java.lang.String.class, value)); return true; + case "encodersaslist": + case "EncodersAsList": target.setEncodersAsList(property(camelContext, java.util.List.class, value)); return true; case "encoding": case "Encoding": target.setEncoding(property(camelContext, java.lang.String.class, value)); return true; case "host": @@ -239,7 +243,9 @@ public class NettyHttpConfigurationConfigurer extends org.apache.camel.support.c case "decodermaxlinelength": case "DecoderMaxLineLength": return int.class; case "decoders": - case "Decoders": return java.util.List.class; + case "Decoders": return java.lang.String.class; + case "decodersaslist": + case "DecodersAsList": return java.util.List.class; case "delimiter": case "Delimiter": return org.apache.camel.component.netty.TextLineDelimiter.class; case "disablestreamcache": @@ -251,7 +257,9 @@ public class NettyHttpConfigurationConfigurer extends org.apache.camel.support.c case "enabledprotocols": case "EnabledProtocols": return java.lang.String.class; case "encoders": - case "Encoders": return java.util.List.class; + case "Encoders": return java.lang.String.class; + case "encodersaslist": + case "EncodersAsList": return java.util.List.class; case "encoding": case "Encoding": return java.lang.String.class; case "host": @@ -424,6 +432,8 @@ public class NettyHttpConfigurationConfigurer extends org.apache.camel.support.c case "DecoderMaxLineLength": return target.getDecoderMaxLineLength(); case "decoders": case "Decoders": return target.getDecoders(); + case "decodersaslist": + case "DecodersAsList": return target.getDecodersAsList(); case "delimiter": case "Delimiter": return target.getDelimiter(); case "disablestreamcache": @@ -436,6 +446,8 @@ public class NettyHttpConfigurationConfigurer extends org.apache.camel.support.c case "EnabledProtocols": return target.getEnabledProtocols(); case "encoders": case "Encoders": return target.getEncoders(); + case "encodersaslist": + case "EncodersAsList": return target.getEncodersAsList(); case "encoding": case "Encoding": return target.getEncoding(); case "host": @@ -571,10 +583,10 @@ public class NettyHttpConfigurationConfigurer extends org.apache.camel.support.c @Override public Object getCollectionValueType(Object target, String name, boolean ignoreCase) { switch (ignoreCase ? name.toLowerCase() : name) { - case "decoders": - case "Decoders": return io.netty.channel.ChannelHandler.class; - case "encoders": - case "Encoders": return io.netty.channel.ChannelHandler.class; + case "decodersaslist": + case "DecodersAsList": return io.netty.channel.ChannelHandler.class; + case "encodersaslist": + case "EncodersAsList": return io.netty.channel.ChannelHandler.class; case "options": case "Options": return java.lang.Object.class; default: return null; diff --git a/components/camel-netty-http/src/generated/resources/org/apache/camel/component/netty/http/netty-http.json b/components/camel-netty-http/src/generated/resources/org/apache/camel/component/netty/http/netty-http.json index a18f1103efe..01aaa847621 100644 --- a/components/camel-netty-http/src/generated/resources/org/apache/camel/component/netty/http/netty-http.json +++ b/components/camel-netty-http/src/generated/resources/org/apache/camel/component/netty/http/netty-http.json @@ -80,9 +80,9 @@ "allowDefaultCodec": { "kind": "property", "displayName": "Allow Default Codec", "group": "codec", "label": "codec", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "configurationClass": "org.apache.camel.component.netty.NettyConfiguration", "configurationField": "configuration", "description": "The netty component installs a default codec if both, encoder\/decoder is null and textline is fal [...] "autoAppendDelimiter": { "kind": "property", "displayName": "Auto Append Delimiter", "group": "codec", "label": "codec", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "configurationClass": "org.apache.camel.component.netty.NettyConfiguration", "configurationField": "configuration", "description": "Whether or not to auto append missing end delimiter when sending using the textline codec." }, "decoderMaxLineLength": { "kind": "property", "displayName": "Decoder Max Line Length", "group": "codec", "label": "codec", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 1024, "configurationClass": "org.apache.camel.component.netty.NettyConfiguration", "configurationField": "configuration", "description": "The max line length to use for the textline codec." }, - "decoders": { "kind": "property", "displayName": "Decoders", "group": "codec", "label": "codec", "required": false, "type": "array", "javaType": "java.util.List<io.netty.channel.ChannelHandler>", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.netty.NettyConfiguration", "configurationField": "configuration", "description": "A list of decoders to be used. You can use a String which have values separated by comma, and have the [...] + "decoders": { "kind": "property", "displayName": "Decoders", "group": "codec", "label": "codec", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.netty.NettyConfiguration", "configurationField": "configuration", "description": "A list of decoders to be used. You can use a String which have values separated by comma, and have the values be looked up in the Re [...] "delimiter": { "kind": "property", "displayName": "Delimiter", "group": "codec", "label": "codec", "required": false, "type": "object", "javaType": "org.apache.camel.component.netty.TextLineDelimiter", "enum": [ "LINE", "NULL" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "LINE", "configurationClass": "org.apache.camel.component.netty.NettyConfiguration", "configurationField": "configuration", "description": "The delimiter to use for the textline codec. [...] - "encoders": { "kind": "property", "displayName": "Encoders", "group": "codec", "label": "codec", "required": false, "type": "array", "javaType": "java.util.List<io.netty.channel.ChannelHandler>", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.netty.NettyConfiguration", "configurationField": "configuration", "description": "A list of encoders to be used. You can use a String which have values separated by comma, and have the [...] + "encoders": { "kind": "property", "displayName": "Encoders", "group": "codec", "label": "codec", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.netty.NettyConfiguration", "configurationField": "configuration", "description": "A list of encoders to be used. You can use a String which have values separated by comma, and have the values be looked up in the Re [...] "encoding": { "kind": "property", "displayName": "Encoding", "group": "codec", "label": "codec", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.netty.NettyConfiguration", "configurationField": "configuration", "description": "The encoding (a charset name) to use for the textline codec. If not provided, Camel will use the JVM default Charset." }, "textline": { "kind": "property", "displayName": "Textline", "group": "codec", "label": "codec", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.netty.NettyConfiguration", "configurationField": "configuration", "description": "Only used for TCP. If no codec is specified, you can use this flag to indicate a text line based codec; if not specif [...] "enabledProtocols": { "kind": "property", "displayName": "Enabled Protocols", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "TLSv1,TLSv1.1,TLSv1.2", "configurationClass": "org.apache.camel.component.netty.NettyConfiguration", "configurationField": "configuration", "description": "Which protocols to enable when using SSL" }, @@ -169,8 +169,8 @@ "transferExchange": { "kind": "parameter", "displayName": "Transfer Exchange", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.netty.http.NettyHttpConfiguration", "configurationField": "configuration", "description": "Only used for TCP. You can transfer the exchange over the wire instead of just the b [...] "workerCount": { "kind": "parameter", "displayName": "Worker Count", "group": "advanced", "label": "advanced", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.netty.http.NettyHttpConfiguration", "configurationField": "configuration", "description": "When netty works on nio mode, it uses default workerCount parameter from Netty (which is cpu_core_threads x 2). User can [...] "workerGroup": { "kind": "parameter", "displayName": "Worker Group", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "io.netty.channel.EventLoopGroup", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.netty.http.NettyHttpConfiguration", "configurationField": "configuration", "description": "To use a explicit EventLoopGroup as the boss thread pool. For example to share a thread pool w [...] - "decoders": { "kind": "parameter", "displayName": "Decoders", "group": "codec", "label": "codec", "required": false, "type": "array", "javaType": "java.util.List<io.netty.channel.ChannelHandler>", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.netty.http.NettyHttpConfiguration", "configurationField": "configuration", "description": "A list of decoders to be used. You can use a String which have values separated by comma, an [...] - "encoders": { "kind": "parameter", "displayName": "Encoders", "group": "codec", "label": "codec", "required": false, "type": "array", "javaType": "java.util.List<io.netty.channel.ChannelHandler>", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.netty.http.NettyHttpConfiguration", "configurationField": "configuration", "description": "A list of encoders to be used. You can use a String which have values separated by comma, an [...] + "decoders": { "kind": "parameter", "displayName": "Decoders", "group": "codec", "label": "codec", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.netty.http.NettyHttpConfiguration", "configurationField": "configuration", "description": "A list of decoders to be used. You can use a String which have values separated by comma, and have the values be looked up [...] + "encoders": { "kind": "parameter", "displayName": "Encoders", "group": "codec", "label": "codec", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.netty.http.NettyHttpConfiguration", "configurationField": "configuration", "description": "A list of encoders to be used. You can use a String which have values separated by comma, and have the values be looked up [...] "enabledProtocols": { "kind": "parameter", "displayName": "Enabled Protocols", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "TLSv1,TLSv1.1,TLSv1.2", "configurationClass": "org.apache.camel.component.netty.http.NettyHttpConfiguration", "configurationField": "configuration", "description": "Which protocols to enable when using SSL" }, "keyStoreFile": { "kind": "parameter", "displayName": "Key Store File", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.io.File", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.netty.http.NettyHttpConfiguration", "configurationField": "configuration", "description": "Client side certificate keystore to be used for encryption" }, "keyStoreFormat": { "kind": "parameter", "displayName": "Key Store Format", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.netty.http.NettyHttpConfiguration", "configurationField": "configuration", "description": "Keystore format to be used for payload encryption. Defaults to JKS if not set" }, diff --git a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/HttpClientInitializerFactory.java b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/HttpClientInitializerFactory.java index 953e90870c6..7ee0bc61211 100644 --- a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/HttpClientInitializerFactory.java +++ b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/HttpClientInitializerFactory.java @@ -93,7 +93,7 @@ public class HttpClientInitializerFactory extends ClientInitializerFactory { pipeline.addLast("http", new HttpClientCodec()); - List<ChannelHandler> encoders = producer.getConfiguration().getEncoders(); + List<ChannelHandler> encoders = producer.getConfiguration().getEncodersAsList(); for (int x = 0; x < encoders.size(); x++) { ChannelHandler encoder = encoders.get(x); if (encoder instanceof ChannelHandlerFactory) { @@ -103,7 +103,7 @@ public class HttpClientInitializerFactory extends ClientInitializerFactory { pipeline.addLast("encoder-" + x, encoder); } - List<ChannelHandler> decoders = producer.getConfiguration().getDecoders(); + List<ChannelHandler> decoders = producer.getConfiguration().getDecodersAsList(); for (int x = 0; x < decoders.size(); x++) { ChannelHandler decoder = decoders.get(x); if (decoder instanceof ChannelHandlerFactory) { diff --git a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/HttpServerInitializerFactory.java b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/HttpServerInitializerFactory.java index f28c789e649..6678df7c948 100644 --- a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/HttpServerInitializerFactory.java +++ b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/HttpServerInitializerFactory.java @@ -95,7 +95,7 @@ public class HttpServerInitializerFactory extends ServerInitializerFactory { } pipeline.addLast("decoder", new HttpRequestDecoder(4096, configuration.getMaxHeaderSize(), 8192)); - List<ChannelHandler> decoders = consumer.getConfiguration().getDecoders(); + List<ChannelHandler> decoders = consumer.getConfiguration().getDecodersAsList(); for (int x = 0; x < decoders.size(); x++) { ChannelHandler decoder = decoders.get(x); if (decoder instanceof ChannelHandlerFactory) { @@ -105,7 +105,7 @@ public class HttpServerInitializerFactory extends ServerInitializerFactory { pipeline.addLast("decoder-" + x, decoder); } pipeline.addLast("encoder", new HttpResponseEncoder()); - List<ChannelHandler> encoders = consumer.getConfiguration().getEncoders(); + List<ChannelHandler> encoders = consumer.getConfiguration().getEncodersAsList(); for (int x = 0; x < encoders.size(); x++) { ChannelHandler encoder = encoders.get(x); if (encoder instanceof ChannelHandlerFactory) { diff --git a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/NettyHttpConfiguration.java b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/NettyHttpConfiguration.java index a6893bc43af..5949dcd2072 100644 --- a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/NettyHttpConfiguration.java +++ b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/NettyHttpConfiguration.java @@ -17,9 +17,7 @@ package org.apache.camel.component.netty.http; import java.util.ArrayList; -import java.util.List; -import io.netty.channel.ChannelHandler; import org.apache.camel.RuntimeCamelException; import org.apache.camel.component.netty.NettyConfiguration; import org.apache.camel.spi.Configurer; @@ -93,10 +91,8 @@ public class NettyHttpConfiguration extends NettyConfiguration { // clone as NettyHttpConfiguration NettyHttpConfiguration answer = (NettyHttpConfiguration) clone(); // make sure the lists is copied in its own instance - List<ChannelHandler> encodersCopy = new ArrayList<>(getEncoders()); - answer.setEncoders(encodersCopy); - List<ChannelHandler> decodersCopy = new ArrayList<>(getDecoders()); - answer.setDecoders(decodersCopy); + answer.setEncodersAsList(new ArrayList<>(getEncodersAsList())); + answer.setDecodersAsList(new ArrayList<>(getDecodersAsList())); return answer; } catch (CloneNotSupportedException e) { throw new RuntimeCamelException(e); diff --git a/components/camel-netty/pom.xml b/components/camel-netty/pom.xml index c389ae97974..1a165318965 100644 --- a/components/camel-netty/pom.xml +++ b/components/camel-netty/pom.xml @@ -91,6 +91,11 @@ <artifactId>camel-management</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>org.apache.camel</groupId> + <artifactId>camel-main</artifactId> + <scope>test</scope> + </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> diff --git a/components/camel-netty/src/generated/java/org/apache/camel/component/netty/NettyComponentConfigurer.java b/components/camel-netty/src/generated/java/org/apache/camel/component/netty/NettyComponentConfigurer.java index 926df0700cb..86ae0fda93a 100644 --- a/components/camel-netty/src/generated/java/org/apache/camel/component/netty/NettyComponentConfigurer.java +++ b/components/camel-netty/src/generated/java/org/apache/camel/component/netty/NettyComponentConfigurer.java @@ -57,14 +57,14 @@ public class NettyComponentConfigurer extends PropertyConfigurerSupport implemen case "correlationManager": getOrCreateConfiguration(target).setCorrelationManager(property(camelContext, org.apache.camel.component.netty.NettyCamelStateCorrelationManager.class, value)); return true; case "decodermaxlinelength": case "decoderMaxLineLength": getOrCreateConfiguration(target).setDecoderMaxLineLength(property(camelContext, int.class, value)); return true; - case "decoders": getOrCreateConfiguration(target).setDecoders(property(camelContext, java.util.List.class, value)); return true; + case "decoders": getOrCreateConfiguration(target).setDecoders(property(camelContext, java.lang.String.class, value)); return true; case "delimiter": getOrCreateConfiguration(target).setDelimiter(property(camelContext, org.apache.camel.component.netty.TextLineDelimiter.class, value)); return true; case "disconnect": getOrCreateConfiguration(target).setDisconnect(property(camelContext, boolean.class, value)); return true; case "disconnectonnoreply": case "disconnectOnNoReply": getOrCreateConfiguration(target).setDisconnectOnNoReply(property(camelContext, boolean.class, value)); return true; case "enabledprotocols": case "enabledProtocols": getOrCreateConfiguration(target).setEnabledProtocols(property(camelContext, java.lang.String.class, value)); return true; - case "encoders": getOrCreateConfiguration(target).setEncoders(property(camelContext, java.util.List.class, value)); return true; + case "encoders": getOrCreateConfiguration(target).setEncoders(property(camelContext, java.lang.String.class, value)); return true; case "encoding": getOrCreateConfiguration(target).setEncoding(property(camelContext, java.lang.String.class, value)); return true; case "executorservice": case "executorService": target.setExecutorService(property(camelContext, io.netty.util.concurrent.EventExecutorGroup.class, value)); return true; @@ -196,14 +196,14 @@ public class NettyComponentConfigurer extends PropertyConfigurerSupport implemen case "correlationManager": return org.apache.camel.component.netty.NettyCamelStateCorrelationManager.class; case "decodermaxlinelength": case "decoderMaxLineLength": return int.class; - case "decoders": return java.util.List.class; + case "decoders": return java.lang.String.class; case "delimiter": return org.apache.camel.component.netty.TextLineDelimiter.class; case "disconnect": return boolean.class; case "disconnectonnoreply": case "disconnectOnNoReply": return boolean.class; case "enabledprotocols": case "enabledProtocols": return java.lang.String.class; - case "encoders": return java.util.List.class; + case "encoders": return java.lang.String.class; case "encoding": return java.lang.String.class; case "executorservice": case "executorService": return io.netty.util.concurrent.EventExecutorGroup.class; @@ -446,8 +446,6 @@ public class NettyComponentConfigurer extends PropertyConfigurerSupport implemen @Override public Object getCollectionValueType(Object target, String name, boolean ignoreCase) { switch (ignoreCase ? name.toLowerCase() : name) { - case "decoders": return io.netty.channel.ChannelHandler.class; - case "encoders": return io.netty.channel.ChannelHandler.class; case "options": return java.lang.Object.class; default: return null; } diff --git a/components/camel-netty/src/generated/java/org/apache/camel/component/netty/NettyConfigurationConfigurer.java b/components/camel-netty/src/generated/java/org/apache/camel/component/netty/NettyConfigurationConfigurer.java index 51f1a937a25..447689dcd3b 100644 --- a/components/camel-netty/src/generated/java/org/apache/camel/component/netty/NettyConfigurationConfigurer.java +++ b/components/camel-netty/src/generated/java/org/apache/camel/component/netty/NettyConfigurationConfigurer.java @@ -50,7 +50,9 @@ public class NettyConfigurationConfigurer extends org.apache.camel.support.compo case "decodermaxlinelength": case "DecoderMaxLineLength": target.setDecoderMaxLineLength(property(camelContext, int.class, value)); return true; case "decoders": - case "Decoders": target.setDecoders(property(camelContext, java.util.List.class, value)); return true; + case "Decoders": target.setDecoders(property(camelContext, java.lang.String.class, value)); return true; + case "decodersaslist": + case "DecodersAsList": target.setDecodersAsList(property(camelContext, java.util.List.class, value)); return true; case "delimiter": case "Delimiter": target.setDelimiter(property(camelContext, org.apache.camel.component.netty.TextLineDelimiter.class, value)); return true; case "disconnect": @@ -60,7 +62,9 @@ public class NettyConfigurationConfigurer extends org.apache.camel.support.compo case "enabledprotocols": case "EnabledProtocols": target.setEnabledProtocols(property(camelContext, java.lang.String.class, value)); return true; case "encoders": - case "Encoders": target.setEncoders(property(camelContext, java.util.List.class, value)); return true; + case "Encoders": target.setEncoders(property(camelContext, java.lang.String.class, value)); return true; + case "encodersaslist": + case "EncodersAsList": target.setEncodersAsList(property(camelContext, java.util.List.class, value)); return true; case "encoding": case "Encoding": target.setEncoding(property(camelContext, java.lang.String.class, value)); return true; case "host": @@ -199,7 +203,9 @@ public class NettyConfigurationConfigurer extends org.apache.camel.support.compo case "decodermaxlinelength": case "DecoderMaxLineLength": return int.class; case "decoders": - case "Decoders": return java.util.List.class; + case "Decoders": return java.lang.String.class; + case "decodersaslist": + case "DecodersAsList": return java.util.List.class; case "delimiter": case "Delimiter": return org.apache.camel.component.netty.TextLineDelimiter.class; case "disconnect": @@ -209,7 +215,9 @@ public class NettyConfigurationConfigurer extends org.apache.camel.support.compo case "enabledprotocols": case "EnabledProtocols": return java.lang.String.class; case "encoders": - case "Encoders": return java.util.List.class; + case "Encoders": return java.lang.String.class; + case "encodersaslist": + case "EncodersAsList": return java.util.List.class; case "encoding": case "Encoding": return java.lang.String.class; case "host": @@ -350,6 +358,8 @@ public class NettyConfigurationConfigurer extends org.apache.camel.support.compo case "DecoderMaxLineLength": return target.getDecoderMaxLineLength(); case "decoders": case "Decoders": return target.getDecoders(); + case "decodersaslist": + case "DecodersAsList": return target.getDecodersAsList(); case "delimiter": case "Delimiter": return target.getDelimiter(); case "disconnect": @@ -360,6 +370,8 @@ public class NettyConfigurationConfigurer extends org.apache.camel.support.compo case "EnabledProtocols": return target.getEnabledProtocols(); case "encoders": case "Encoders": return target.getEncoders(); + case "encodersaslist": + case "EncodersAsList": return target.getEncodersAsList(); case "encoding": case "Encoding": return target.getEncoding(); case "host": @@ -469,10 +481,10 @@ public class NettyConfigurationConfigurer extends org.apache.camel.support.compo @Override public Object getCollectionValueType(Object target, String name, boolean ignoreCase) { switch (ignoreCase ? name.toLowerCase() : name) { - case "decoders": - case "Decoders": return io.netty.channel.ChannelHandler.class; - case "encoders": - case "Encoders": return io.netty.channel.ChannelHandler.class; + case "decodersaslist": + case "DecodersAsList": return io.netty.channel.ChannelHandler.class; + case "encodersaslist": + case "EncodersAsList": return io.netty.channel.ChannelHandler.class; case "options": case "Options": return java.lang.Object.class; default: return null; diff --git a/components/camel-netty/src/generated/java/org/apache/camel/component/netty/NettyEndpointConfigurer.java b/components/camel-netty/src/generated/java/org/apache/camel/component/netty/NettyEndpointConfigurer.java index 168ad062563..de52af20f45 100644 --- a/components/camel-netty/src/generated/java/org/apache/camel/component/netty/NettyEndpointConfigurer.java +++ b/components/camel-netty/src/generated/java/org/apache/camel/component/netty/NettyEndpointConfigurer.java @@ -47,14 +47,14 @@ public class NettyEndpointConfigurer extends PropertyConfigurerSupport implement case "correlationManager": target.getConfiguration().setCorrelationManager(property(camelContext, org.apache.camel.component.netty.NettyCamelStateCorrelationManager.class, value)); return true; case "decodermaxlinelength": case "decoderMaxLineLength": target.getConfiguration().setDecoderMaxLineLength(property(camelContext, int.class, value)); return true; - case "decoders": target.getConfiguration().setDecoders(property(camelContext, java.util.List.class, value)); return true; + case "decoders": target.getConfiguration().setDecoders(property(camelContext, java.lang.String.class, value)); return true; case "delimiter": target.getConfiguration().setDelimiter(property(camelContext, org.apache.camel.component.netty.TextLineDelimiter.class, value)); return true; case "disconnect": target.getConfiguration().setDisconnect(property(camelContext, boolean.class, value)); return true; case "disconnectonnoreply": case "disconnectOnNoReply": target.getConfiguration().setDisconnectOnNoReply(property(camelContext, boolean.class, value)); return true; case "enabledprotocols": case "enabledProtocols": target.getConfiguration().setEnabledProtocols(property(camelContext, java.lang.String.class, value)); return true; - case "encoders": target.getConfiguration().setEncoders(property(camelContext, java.util.List.class, value)); return true; + case "encoders": target.getConfiguration().setEncoders(property(camelContext, java.lang.String.class, value)); return true; case "encoding": target.getConfiguration().setEncoding(property(camelContext, java.lang.String.class, value)); return true; case "exceptionhandler": case "exceptionHandler": target.setExceptionHandler(property(camelContext, org.apache.camel.spi.ExceptionHandler.class, value)); return true; @@ -182,14 +182,14 @@ public class NettyEndpointConfigurer extends PropertyConfigurerSupport implement case "correlationManager": return org.apache.camel.component.netty.NettyCamelStateCorrelationManager.class; case "decodermaxlinelength": case "decoderMaxLineLength": return int.class; - case "decoders": return java.util.List.class; + case "decoders": return java.lang.String.class; case "delimiter": return org.apache.camel.component.netty.TextLineDelimiter.class; case "disconnect": return boolean.class; case "disconnectonnoreply": case "disconnectOnNoReply": return boolean.class; case "enabledprotocols": case "enabledProtocols": return java.lang.String.class; - case "encoders": return java.util.List.class; + case "encoders": return java.lang.String.class; case "encoding": return java.lang.String.class; case "exceptionhandler": case "exceptionHandler": return org.apache.camel.spi.ExceptionHandler.class; @@ -427,8 +427,6 @@ public class NettyEndpointConfigurer extends PropertyConfigurerSupport implement @Override public Object getCollectionValueType(Object target, String name, boolean ignoreCase) { switch (ignoreCase ? name.toLowerCase() : name) { - case "decoders": return io.netty.channel.ChannelHandler.class; - case "encoders": return io.netty.channel.ChannelHandler.class; case "options": return java.lang.Object.class; default: return null; } diff --git a/components/camel-netty/src/generated/resources/org/apache/camel/component/netty/netty.json b/components/camel-netty/src/generated/resources/org/apache/camel/component/netty/netty.json index ae868eb8e0c..f7476d0e0eb 100644 --- a/components/camel-netty/src/generated/resources/org/apache/camel/component/netty/netty.json +++ b/components/camel-netty/src/generated/resources/org/apache/camel/component/netty/netty.json @@ -76,9 +76,9 @@ "allowDefaultCodec": { "kind": "property", "displayName": "Allow Default Codec", "group": "codec", "label": "codec", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "configurationClass": "org.apache.camel.component.netty.NettyConfiguration", "configurationField": "configuration", "description": "The netty component installs a default codec if both, encoder\/decoder is null and textline is fal [...] "autoAppendDelimiter": { "kind": "property", "displayName": "Auto Append Delimiter", "group": "codec", "label": "codec", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "configurationClass": "org.apache.camel.component.netty.NettyConfiguration", "configurationField": "configuration", "description": "Whether or not to auto append missing end delimiter when sending using the textline codec." }, "decoderMaxLineLength": { "kind": "property", "displayName": "Decoder Max Line Length", "group": "codec", "label": "codec", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 1024, "configurationClass": "org.apache.camel.component.netty.NettyConfiguration", "configurationField": "configuration", "description": "The max line length to use for the textline codec." }, - "decoders": { "kind": "property", "displayName": "Decoders", "group": "codec", "label": "codec", "required": false, "type": "array", "javaType": "java.util.List<io.netty.channel.ChannelHandler>", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.netty.NettyConfiguration", "configurationField": "configuration", "description": "A list of decoders to be used. You can use a String which have values separated by comma, and have the [...] + "decoders": { "kind": "property", "displayName": "Decoders", "group": "codec", "label": "codec", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.netty.NettyConfiguration", "configurationField": "configuration", "description": "A list of decoders to be used. You can use a String which have values separated by comma, and have the values be looked up in the Re [...] "delimiter": { "kind": "property", "displayName": "Delimiter", "group": "codec", "label": "codec", "required": false, "type": "object", "javaType": "org.apache.camel.component.netty.TextLineDelimiter", "enum": [ "LINE", "NULL" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "LINE", "configurationClass": "org.apache.camel.component.netty.NettyConfiguration", "configurationField": "configuration", "description": "The delimiter to use for the textline codec. [...] - "encoders": { "kind": "property", "displayName": "Encoders", "group": "codec", "label": "codec", "required": false, "type": "array", "javaType": "java.util.List<io.netty.channel.ChannelHandler>", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.netty.NettyConfiguration", "configurationField": "configuration", "description": "A list of encoders to be used. You can use a String which have values separated by comma, and have the [...] + "encoders": { "kind": "property", "displayName": "Encoders", "group": "codec", "label": "codec", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.netty.NettyConfiguration", "configurationField": "configuration", "description": "A list of encoders to be used. You can use a String which have values separated by comma, and have the values be looked up in the Re [...] "encoding": { "kind": "property", "displayName": "Encoding", "group": "codec", "label": "codec", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.netty.NettyConfiguration", "configurationField": "configuration", "description": "The encoding (a charset name) to use for the textline codec. If not provided, Camel will use the JVM default Charset." }, "textline": { "kind": "property", "displayName": "Textline", "group": "codec", "label": "codec", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.netty.NettyConfiguration", "configurationField": "configuration", "description": "Only used for TCP. If no codec is specified, you can use this flag to indicate a text line based codec; if not specif [...] "enabledProtocols": { "kind": "property", "displayName": "Enabled Protocols", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "TLSv1,TLSv1.1,TLSv1.2", "configurationClass": "org.apache.camel.component.netty.NettyConfiguration", "configurationField": "configuration", "description": "Which protocols to enable when using SSL" }, @@ -153,9 +153,9 @@ "allowDefaultCodec": { "kind": "parameter", "displayName": "Allow Default Codec", "group": "codec", "label": "codec", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "configurationClass": "org.apache.camel.component.netty.NettyConfiguration", "configurationField": "configuration", "description": "The netty component installs a default codec if both, encoder\/decoder is null and textline is fa [...] "autoAppendDelimiter": { "kind": "parameter", "displayName": "Auto Append Delimiter", "group": "codec", "label": "codec", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "configurationClass": "org.apache.camel.component.netty.NettyConfiguration", "configurationField": "configuration", "description": "Whether or not to auto append missing end delimiter when sending using the textline codec." }, "decoderMaxLineLength": { "kind": "parameter", "displayName": "Decoder Max Line Length", "group": "codec", "label": "codec", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 1024, "configurationClass": "org.apache.camel.component.netty.NettyConfiguration", "configurationField": "configuration", "description": "The max line length to use for the textline codec." }, - "decoders": { "kind": "parameter", "displayName": "Decoders", "group": "codec", "label": "codec", "required": false, "type": "array", "javaType": "java.util.List<io.netty.channel.ChannelHandler>", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.netty.NettyConfiguration", "configurationField": "configuration", "description": "A list of decoders to be used. You can use a String which have values separated by comma, and have th [...] + "decoders": { "kind": "parameter", "displayName": "Decoders", "group": "codec", "label": "codec", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.netty.NettyConfiguration", "configurationField": "configuration", "description": "A list of decoders to be used. You can use a String which have values separated by comma, and have the values be looked up in the R [...] "delimiter": { "kind": "parameter", "displayName": "Delimiter", "group": "codec", "label": "codec", "required": false, "type": "object", "javaType": "org.apache.camel.component.netty.TextLineDelimiter", "enum": [ "LINE", "NULL" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "LINE", "configurationClass": "org.apache.camel.component.netty.NettyConfiguration", "configurationField": "configuration", "description": "The delimiter to use for the textline codec [...] - "encoders": { "kind": "parameter", "displayName": "Encoders", "group": "codec", "label": "codec", "required": false, "type": "array", "javaType": "java.util.List<io.netty.channel.ChannelHandler>", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.netty.NettyConfiguration", "configurationField": "configuration", "description": "A list of encoders to be used. You can use a String which have values separated by comma, and have th [...] + "encoders": { "kind": "parameter", "displayName": "Encoders", "group": "codec", "label": "codec", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.netty.NettyConfiguration", "configurationField": "configuration", "description": "A list of encoders to be used. You can use a String which have values separated by comma, and have the values be looked up in the R [...] "encoding": { "kind": "parameter", "displayName": "Encoding", "group": "codec", "label": "codec", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.netty.NettyConfiguration", "configurationField": "configuration", "description": "The encoding (a charset name) to use for the textline codec. If not provided, Camel will use the JVM default Charset." }, "textline": { "kind": "parameter", "displayName": "Textline", "group": "codec", "label": "codec", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.netty.NettyConfiguration", "configurationField": "configuration", "description": "Only used for TCP. If no codec is specified, you can use this flag to indicate a text line based codec; if not speci [...] "enabledProtocols": { "kind": "parameter", "displayName": "Enabled Protocols", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "TLSv1,TLSv1.1,TLSv1.2", "configurationClass": "org.apache.camel.component.netty.NettyConfiguration", "configurationField": "configuration", "description": "Which protocols to enable when using SSL" }, diff --git a/components/camel-netty/src/main/java/org/apache/camel/component/netty/DefaultClientInitializerFactory.java b/components/camel-netty/src/main/java/org/apache/camel/component/netty/DefaultClientInitializerFactory.java index af089219ca4..ce7759da545 100644 --- a/components/camel-netty/src/main/java/org/apache/camel/component/netty/DefaultClientInitializerFactory.java +++ b/components/camel-netty/src/main/java/org/apache/camel/component/netty/DefaultClientInitializerFactory.java @@ -62,7 +62,7 @@ public class DefaultClientInitializerFactory extends ClientInitializerFactory { addToPipeline("ssl", channelPipeline, sslHandler); } - List<ChannelHandler> decoders = producer.getConfiguration().getDecoders(); + List<ChannelHandler> decoders = producer.getConfiguration().getDecodersAsList(); for (int x = 0; x < decoders.size(); x++) { ChannelHandler decoder = decoders.get(x); if (decoder instanceof ChannelHandlerFactory) { @@ -72,7 +72,7 @@ public class DefaultClientInitializerFactory extends ClientInitializerFactory { addToPipeline("decoder-" + x, channelPipeline, decoder); } - List<ChannelHandler> encoders = producer.getConfiguration().getEncoders(); + List<ChannelHandler> encoders = producer.getConfiguration().getEncodersAsList(); for (int x = 0; x < encoders.size(); x++) { ChannelHandler encoder = encoders.get(x); if (encoder instanceof ChannelHandlerFactory) { diff --git a/components/camel-netty/src/main/java/org/apache/camel/component/netty/DefaultServerInitializerFactory.java b/components/camel-netty/src/main/java/org/apache/camel/component/netty/DefaultServerInitializerFactory.java index 76b73f3b949..bfc5fad422d 100644 --- a/components/camel-netty/src/main/java/org/apache/camel/component/netty/DefaultServerInitializerFactory.java +++ b/components/camel-netty/src/main/java/org/apache/camel/component/netty/DefaultServerInitializerFactory.java @@ -80,7 +80,7 @@ public class DefaultServerInitializerFactory extends ServerInitializerFactory { addToPipeline("ssl", channelPipeline, sslHandler); } - List<ChannelHandler> encoders = consumer.getConfiguration().getEncoders(); + List<ChannelHandler> encoders = consumer.getConfiguration().getEncodersAsList(); for (int x = 0; x < encoders.size(); x++) { ChannelHandler encoder = encoders.get(x); if (encoder instanceof ChannelHandlerFactory) { @@ -90,7 +90,7 @@ public class DefaultServerInitializerFactory extends ServerInitializerFactory { addToPipeline("encoder-" + x, channelPipeline, encoder); } - List<ChannelHandler> decoders = consumer.getConfiguration().getDecoders(); + List<ChannelHandler> decoders = consumer.getConfiguration().getDecodersAsList(); for (int x = 0; x < decoders.size(); x++) { ChannelHandler decoder = decoders.get(x); if (decoder instanceof ChannelHandlerFactory) { diff --git a/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyConfiguration.java b/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyConfiguration.java index 006eb844448..ca0f25b3c57 100644 --- a/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyConfiguration.java +++ b/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyConfiguration.java @@ -51,6 +51,9 @@ import org.slf4j.LoggerFactory; public class NettyConfiguration extends NettyServerBootstrapConfiguration implements Cloneable { private static final Logger LOG = LoggerFactory.getLogger(NettyConfiguration.class); + private transient List<ChannelHandler> encodersList = new ArrayList<>(); + private transient List<ChannelHandler> decodersList = new ArrayList<>(); + @UriParam(label = "producer") private long requestTimeout; @UriParam(defaultValue = "true") @@ -66,9 +69,9 @@ public class NettyConfiguration extends NettyServerBootstrapConfiguration implem @UriParam(label = "codec") private String encoding; @UriParam(label = "codec") - private List<ChannelHandler> encoders = new ArrayList<>(); + private String encoders; @UriParam(label = "codec") - private List<ChannelHandler> decoders = new ArrayList<>(); + private String decoders; @UriParam(label = "common, security", defaultValue = "false") private boolean hostnameVerification; @UriParam @@ -123,10 +126,8 @@ public class NettyConfiguration extends NettyServerBootstrapConfiguration implem try { NettyConfiguration answer = (NettyConfiguration) clone(); // make sure the lists is copied in its own instance - List<ChannelHandler> encodersCopy = new ArrayList<>(encoders); - answer.setEncoders(encodersCopy); - List<ChannelHandler> decodersCopy = new ArrayList<>(decoders); - answer.setDecoders(decodersCopy); + answer.setEncodersAsList(new ArrayList<>(getEncodersAsList())); + answer.setDecodersAsList(new ArrayList<>(getDecodersAsList())); return answer; } catch (CloneNotSupportedException e) { throw new RuntimeCamelException(e); @@ -135,7 +136,7 @@ public class NettyConfiguration extends NettyServerBootstrapConfiguration implem public void validateConfiguration() { // validate that the encoders is either shareable or is a handler factory - for (ChannelHandler encoder : encoders) { + for (ChannelHandler encoder : encodersList) { if (encoder instanceof ChannelHandlerFactory) { continue; } @@ -148,7 +149,7 @@ public class NettyConfiguration extends NettyServerBootstrapConfiguration implem } // validate that the decoders is either shareable or is a handler factory - for (ChannelHandler decoder : decoders) { + for (ChannelHandler decoder : decodersList) { if (decoder instanceof ChannelHandlerFactory) { continue; } @@ -208,10 +209,18 @@ public class NettyConfiguration extends NettyServerBootstrapConfiguration implem // set custom encoders and decoders first List<ChannelHandler> referencedEncoders = component.resolveAndRemoveReferenceListParameter(parameters, "encoders", ChannelHandler.class, null); - addToHandlersList(encoders, referencedEncoders, ChannelHandler.class); + addToHandlersList(encodersList, referencedEncoders, ChannelHandler.class); List<ChannelHandler> referencedDecoders = component.resolveAndRemoveReferenceListParameter(parameters, "decoders", ChannelHandler.class, null); - addToHandlersList(decoders, referencedDecoders, ChannelHandler.class); + addToHandlersList(decodersList, referencedDecoders, ChannelHandler.class); + + // set custom encoders and decoders from config + List<ChannelHandler> configEncoders + = EndpointHelper.resolveReferenceListParameter(component.getCamelContext(), encoders, ChannelHandler.class); + addToHandlersList(encodersList, configEncoders, ChannelHandler.class); + List<ChannelHandler> configDecoders + = EndpointHelper.resolveReferenceListParameter(component.getCamelContext(), decoders, ChannelHandler.class); + addToHandlersList(decodersList, configDecoders, ChannelHandler.class); // then set parameters with the help of the camel context type converters // and use configurer to avoid any reflection calls @@ -233,36 +242,36 @@ public class NettyConfiguration extends NettyServerBootstrapConfiguration implem } // add default encoders and decoders - if (encoders.isEmpty() && decoders.isEmpty()) { + if (encodersList.isEmpty() && decodersList.isEmpty()) { if (isAllowDefaultCodec()) { if ("udp".equalsIgnoreCase(protocol)) { - encoders.add(ChannelHandlerFactories.newDatagramPacketEncoder()); + encodersList.add(ChannelHandlerFactories.newDatagramPacketEncoder()); } // are we textline or byte array if (isTextline()) { Charset charset = getEncoding() != null ? Charset.forName(getEncoding()) : CharsetUtil.UTF_8; - encoders.add(ChannelHandlerFactories.newStringEncoder(charset, protocol)); + encodersList.add(ChannelHandlerFactories.newStringEncoder(charset, protocol)); ByteBuf[] delimiters = delimiter == TextLineDelimiter.LINE ? Delimiters.lineDelimiter() : Delimiters.nulDelimiter(); - decoders.add( + decodersList.add( ChannelHandlerFactories.newDelimiterBasedFrameDecoder(decoderMaxLineLength, delimiters, protocol)); - decoders.add(ChannelHandlerFactories.newStringDecoder(charset, protocol)); + decodersList.add(ChannelHandlerFactories.newStringDecoder(charset, protocol)); LOG.debug( "Using textline encoders and decoders with charset: {}, delimiter: {} and decoderMaxLineLength: {}", charset, delimiter, decoderMaxLineLength); } else if ("udp".equalsIgnoreCase(protocol) && isUdpByteArrayCodec()) { - encoders.add(ChannelHandlerFactories.newByteArrayEncoder(protocol)); - decoders.add(ChannelHandlerFactories.newByteArrayDecoder(protocol)); + encodersList.add(ChannelHandlerFactories.newByteArrayEncoder(protocol)); + decodersList.add(ChannelHandlerFactories.newByteArrayDecoder(protocol)); } else { // Fall back to allowing Strings to be serialized only Charset charset = getEncoding() != null ? Charset.forName(getEncoding()) : CharsetUtil.UTF_8; - encoders.add(ChannelHandlerFactories.newStringEncoder(charset, protocol)); - decoders.add(ChannelHandlerFactories.newStringDecoder(charset, protocol)); + encodersList.add(ChannelHandlerFactories.newStringEncoder(charset, protocol)); + decodersList.add(ChannelHandlerFactories.newStringDecoder(charset, protocol)); } if ("udp".equalsIgnoreCase(protocol)) { - decoders.add(ChannelHandlerFactories.newDatagramPacketDecoder()); + decodersList.add(ChannelHandlerFactories.newDatagramPacketDecoder()); } } else { LOG.debug("No encoders and decoders will be used"); @@ -382,8 +391,12 @@ public class NettyConfiguration extends NettyServerBootstrapConfiguration implem this.encoding = encoding; } - public List<ChannelHandler> getDecoders() { - return decoders; + public List<ChannelHandler> getDecodersAsList() { + return decodersList; + } + + public void setDecodersAsList(List<ChannelHandler> decoders) { + this.decodersList = decoders; } /** @@ -391,11 +404,27 @@ public class NettyConfiguration extends NettyServerBootstrapConfiguration implem * looked up in the Registry. Just remember to prefix the value with # so Camel knows it should lookup. */ public void setDecoders(List<ChannelHandler> decoders) { + this.decodersList = decoders; + } + + /** + * A list of decoders to be used. You can use a String which have values separated by comma, and have the values be + * looked up in the Registry. Just remember to prefix the value with # so Camel knows it should lookup. + */ + public void setDecoders(String decoders) { this.decoders = decoders; } - public List<ChannelHandler> getEncoders() { - return encoders; + public String getDecoders() { + return decoders; + } + + public List<ChannelHandler> getEncodersAsList() { + return encodersList; + } + + public void setEncodersAsList(List<ChannelHandler> encoders) { + this.encodersList = encoders; } /** @@ -403,15 +432,27 @@ public class NettyConfiguration extends NettyServerBootstrapConfiguration implem * looked up in the Registry. Just remember to prefix the value with # so Camel knows it should lookup. */ public void setEncoders(List<ChannelHandler> encoders) { + this.encodersList = encoders; + } + + /** + * A list of encoders to be used. You can use a String which have values separated by comma, and have the values be + * looked up in the Registry. Just remember to prefix the value with # so Camel knows it should lookup. + */ + public void setEncoders(String encoders) { this.encoders = encoders; } + public String getEncoders() { + return encoders; + } + /** * Adds a custom ChannelHandler class that can be used to perform special marshalling of outbound payloads. */ public void addEncoder(ChannelHandler encoder) { - if (!encoders.contains(encoder)) { - encoders.add(encoder); + if (!encodersList.contains(encoder)) { + encodersList.add(encoder); } } @@ -419,8 +460,8 @@ public class NettyConfiguration extends NettyServerBootstrapConfiguration implem * Adds a custom ChannelHandler class that can be used to perform special marshalling of inbound payloads. */ public void addDecoder(ChannelHandler decoder) { - if (!decoders.contains(decoder)) { - decoders.add(decoder); + if (!decodersList.contains(decoder)) { + decodersList.add(decoder); } } diff --git a/components/camel-netty/src/test/java/org/apache/camel/component/netty/MainNettyCustomCodecTest.java b/components/camel-netty/src/test/java/org/apache/camel/component/netty/MainNettyCustomCodecTest.java new file mode 100644 index 00000000000..36dd3fb2375 --- /dev/null +++ b/components/camel-netty/src/test/java/org/apache/camel/component/netty/MainNettyCustomCodecTest.java @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.netty; + +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.main.Main; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class MainNettyCustomCodecTest extends BaseNettyTest { + + // use reaadble bytes + private byte[] data = new byte[] { 65, 66, 67, 68, 69, 70, 71, 72, 73, 0, 0 }; + + @Test + public void testMain() throws Exception { + Main main = new Main(); + main.bind("myCustomDecoder", MyCustomCodec.createMyCustomDecoder()); + main.bind("myCustomDecoder2", MyCustomCodec.createMyCustomDecoder2()); + main.bind("myCustomEncoder", MyCustomCodec.createMyCustomEncoder()); + main.addInitialProperty("camel.component.netty.encoders", "#myCustomEncoder"); + main.addInitialProperty("camel.component.netty.decoders", "#myCustomDecoder,#myCustomDecoder2"); + main.configure().addRoutesBuilder(new RouteBuilder() { + @Override + public void configure() throws Exception { + String uri = "netty:tcp://localhost:" + getPort() + "?disconnect=true&sync=false&allowDefaultCodec=false"; + + from(uri).to("log:input") + .process(e -> { + byte[] local = e.getMessage().getBody(byte[].class); + Assertions.assertEquals(data, local); + }); + + from("timer:once?repeatCount=1") + .setBody().constant(data) + .to(uri); + } + }); + main.configure().withDurationMaxMessages(2); + main.configure().withDurationMaxSeconds(5); + main.run(); + + main.stop(); + } + +}