This is an automated email from the ASF dual-hosted git repository. orpiske pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
commit 520541a019672fcc21e395654fe2b55c4a851b58 Author: Tom Cunningham <tcunn...@redhat.com> AuthorDate: Fri Jun 14 20:47:24 2024 -0400 CAMEL-20679 Make buffer size configurable, file creation HashSets out of process --- .../org/apache/camel/catalog/components/smb.json | 43 +++++++-------- .../apache/camel/catalog/schemas/camel-spring.xsd | 50 ++++++++++++++++-- .../camel/component/smb/SmbEndpointConfigurer.java | 6 +++ .../camel/component/smb/SmbEndpointUriFactory.java | 3 +- .../org/apache/camel/component/smb/smb.json | 43 +++++++-------- .../camel/component/smb/SmbConfiguration.java | 12 +++++ .../apache/camel/component/smb/SmbProducer.java | 61 ++++++++++++---------- .../endpoint/dsl/SmbEndpointBuilderFactory.java | 30 +++++++++++ .../apache/camel/kotlin/components/SmbUriDsl.kt | 14 +++++ 9 files changed, 187 insertions(+), 75 deletions(-) diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/smb.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/smb.json index f51cf35fb33..9985bff7376 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/smb.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/smb.json @@ -41,26 +41,27 @@ "pollStrategy": { "index": 10, "kind": "parameter", "displayName": "Poll Strategy", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.PollingConsumerPollStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "A pluggable org.apache.camel.PollingConsumerPollingStrategy allowing you to provide your custom implementation to control error handling usually occurred during the po [...] "autoCreate": { "index": 11, "kind": "parameter", "displayName": "Auto Create", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.smb.SmbConfiguration", "configurationField": "configuration", "description": "Whether to create parent directory if it does not exist" }, "fileExist": { "index": 12, "kind": "parameter", "displayName": "File Exist", "group": "producer", "label": "producer", "required": false, "type": "object", "javaType": "org.apache.camel.component.file.GenericFileExist", "enum": [ "Override", "Append", "Fail", "Ignore", "Move", "TryRename" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": "Ignore", "configurationClass": "org.apache.camel.component.smb.SmbConfiguration", "configuration [...] - "lazyStartProducer": { "index": 13, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a produ [...] - "idempotentRepository": { "index": 14, "kind": "parameter", "displayName": "Idempotent Repository", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.IdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.smb.SmbConfiguration", "configurationField": "configuration", "description": "A pluggable repository org.apache.camel.spi.IdempotentRepository w [...] - "smbConfig": { "index": 15, "kind": "parameter", "displayName": "Smb Config", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "com.hierynomus.smbj.SmbConfig", "deprecated": false, "deprecationNote": "", "autowired": true, "secret": false, "configurationClass": "org.apache.camel.component.smb.SmbConfiguration", "configurationField": "configuration", "description": "An optional SMB client configuration, can be used to configure client specific [...] - "smbIoBean": { "index": 16, "kind": "parameter", "displayName": "Smb Io Bean", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.smb.SmbIOBean", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.smb.SmbConfiguration", "configurationField": "configuration", "description": "An optional SMB I\/O bean to use to setup the file access attributes when reading\/writi [...] - "backoffErrorThreshold": { "index": 17, "kind": "parameter", "displayName": "Backoff Error Threshold", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "The number of subsequent error polls (failed due some error) that should happen before the backoffMultipler should kick-in." }, - "backoffIdleThreshold": { "index": 18, "kind": "parameter", "displayName": "Backoff Idle Threshold", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "The number of subsequent idle polls that should happen before the backoffMultipler should kick-in." }, - "backoffMultiplier": { "index": 19, "kind": "parameter", "displayName": "Backoff Multiplier", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "To let the scheduled polling consumer backoff if there has been a number of subsequent idles\/errors in a row. The multiplier is then the number of polls that will be skipped before the next actual attempt is h [...] - "delay": { "index": 20, "kind": "parameter", "displayName": "Delay", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 500, "description": "Milliseconds before the next poll." }, - "greedy": { "index": 21, "kind": "parameter", "displayName": "Greedy", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "If greedy is enabled, then the ScheduledPollConsumer will run immediately again, if the previous run polled 1 or more messages." }, - "initialDelay": { "index": 22, "kind": "parameter", "displayName": "Initial Delay", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 1000, "description": "Milliseconds before the first poll starts." }, - "repeatCount": { "index": 23, "kind": "parameter", "displayName": "Repeat Count", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 0, "description": "Specifies a maximum limit of number of fires. So if you set it to 1, the scheduler will only fire once. If you set it to 5, it will only fire five times. A value of zero or negative means fire forever." }, - "runLoggingLevel": { "index": 24, "kind": "parameter", "displayName": "Run Logging Level", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "object", "javaType": "org.apache.camel.LoggingLevel", "enum": [ "TRACE", "DEBUG", "INFO", "WARN", "ERROR", "OFF" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "TRACE", "description": "The consumer logs a start\/complete log line when it polls. This option allows you to configure the l [...] - "scheduledExecutorService": { "index": 25, "kind": "parameter", "displayName": "Scheduled Executor Service", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "object", "javaType": "java.util.concurrent.ScheduledExecutorService", "deprecated": false, "autowired": false, "secret": false, "description": "Allows for configuring a custom\/shared thread pool to use for the consumer. By default each consumer has its own single threaded thread pool." }, - "scheduler": { "index": 26, "kind": "parameter", "displayName": "Scheduler", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "object", "javaType": "java.lang.Object", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "none", "description": "To use a cron scheduler from either camel-spring or camel-quartz component. Use value spring or quartz for built in scheduler" }, - "schedulerProperties": { "index": 27, "kind": "parameter", "displayName": "Scheduler Properties", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.Object>", "prefix": "scheduler.", "multiValue": true, "deprecated": false, "autowired": false, "secret": false, "description": "To configure additional properties when using a custom scheduler or any of the Quartz, Spring based scheduler." }, - "startScheduler": { "index": 28, "kind": "parameter", "displayName": "Start Scheduler", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether the scheduler should be auto started." }, - "timeUnit": { "index": 29, "kind": "parameter", "displayName": "Time Unit", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "object", "javaType": "java.util.concurrent.TimeUnit", "enum": [ "NANOSECONDS", "MICROSECONDS", "MILLISECONDS", "SECONDS", "MINUTES", "HOURS", "DAYS" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "MILLISECONDS", "description": "Time unit for initialDelay and delay options." }, - "useFixedDelay": { "index": 30, "kind": "parameter", "displayName": "Use Fixed Delay", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Controls if fixed delay or fixed rate is used. See ScheduledExecutorService in JDK for details." }, - "domain": { "index": 31, "kind": "parameter", "displayName": "Domain", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.smb.SmbConfiguration", "configurationField": "configuration", "description": "The user domain" }, - "password": { "index": 32, "kind": "parameter", "displayName": "Password", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.smb.SmbConfiguration", "configurationField": "configuration", "description": "The password to access the share" }, - "username": { "index": 33, "kind": "parameter", "displayName": "Username", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.smb.SmbConfiguration", "configurationField": "configuration", "description": "The username required to access the share" } + "readBufferSize": { "index": 13, "kind": "parameter", "displayName": "Read Buffer Size", "group": "producer", "label": "producer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": 2048, "configurationClass": "org.apache.camel.component.smb.SmbConfiguration", "configurationField": "configuration", "description": "Read buffer size when for file being produced" }, + "lazyStartProducer": { "index": 14, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a produ [...] + "idempotentRepository": { "index": 15, "kind": "parameter", "displayName": "Idempotent Repository", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.IdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.smb.SmbConfiguration", "configurationField": "configuration", "description": "A pluggable repository org.apache.camel.spi.IdempotentRepository w [...] + "smbConfig": { "index": 16, "kind": "parameter", "displayName": "Smb Config", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "com.hierynomus.smbj.SmbConfig", "deprecated": false, "deprecationNote": "", "autowired": true, "secret": false, "configurationClass": "org.apache.camel.component.smb.SmbConfiguration", "configurationField": "configuration", "description": "An optional SMB client configuration, can be used to configure client specific [...] + "smbIoBean": { "index": 17, "kind": "parameter", "displayName": "Smb Io Bean", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.smb.SmbIOBean", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.smb.SmbConfiguration", "configurationField": "configuration", "description": "An optional SMB I\/O bean to use to setup the file access attributes when reading\/writi [...] + "backoffErrorThreshold": { "index": 18, "kind": "parameter", "displayName": "Backoff Error Threshold", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "The number of subsequent error polls (failed due some error) that should happen before the backoffMultipler should kick-in." }, + "backoffIdleThreshold": { "index": 19, "kind": "parameter", "displayName": "Backoff Idle Threshold", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "The number of subsequent idle polls that should happen before the backoffMultipler should kick-in." }, + "backoffMultiplier": { "index": 20, "kind": "parameter", "displayName": "Backoff Multiplier", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "To let the scheduled polling consumer backoff if there has been a number of subsequent idles\/errors in a row. The multiplier is then the number of polls that will be skipped before the next actual attempt is h [...] + "delay": { "index": 21, "kind": "parameter", "displayName": "Delay", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 500, "description": "Milliseconds before the next poll." }, + "greedy": { "index": 22, "kind": "parameter", "displayName": "Greedy", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "If greedy is enabled, then the ScheduledPollConsumer will run immediately again, if the previous run polled 1 or more messages." }, + "initialDelay": { "index": 23, "kind": "parameter", "displayName": "Initial Delay", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 1000, "description": "Milliseconds before the first poll starts." }, + "repeatCount": { "index": 24, "kind": "parameter", "displayName": "Repeat Count", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 0, "description": "Specifies a maximum limit of number of fires. So if you set it to 1, the scheduler will only fire once. If you set it to 5, it will only fire five times. A value of zero or negative means fire forever." }, + "runLoggingLevel": { "index": 25, "kind": "parameter", "displayName": "Run Logging Level", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "object", "javaType": "org.apache.camel.LoggingLevel", "enum": [ "TRACE", "DEBUG", "INFO", "WARN", "ERROR", "OFF" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "TRACE", "description": "The consumer logs a start\/complete log line when it polls. This option allows you to configure the l [...] + "scheduledExecutorService": { "index": 26, "kind": "parameter", "displayName": "Scheduled Executor Service", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "object", "javaType": "java.util.concurrent.ScheduledExecutorService", "deprecated": false, "autowired": false, "secret": false, "description": "Allows for configuring a custom\/shared thread pool to use for the consumer. By default each consumer has its own single threaded thread pool." }, + "scheduler": { "index": 27, "kind": "parameter", "displayName": "Scheduler", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "object", "javaType": "java.lang.Object", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "none", "description": "To use a cron scheduler from either camel-spring or camel-quartz component. Use value spring or quartz for built in scheduler" }, + "schedulerProperties": { "index": 28, "kind": "parameter", "displayName": "Scheduler Properties", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.Object>", "prefix": "scheduler.", "multiValue": true, "deprecated": false, "autowired": false, "secret": false, "description": "To configure additional properties when using a custom scheduler or any of the Quartz, Spring based scheduler." }, + "startScheduler": { "index": 29, "kind": "parameter", "displayName": "Start Scheduler", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether the scheduler should be auto started." }, + "timeUnit": { "index": 30, "kind": "parameter", "displayName": "Time Unit", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "object", "javaType": "java.util.concurrent.TimeUnit", "enum": [ "NANOSECONDS", "MICROSECONDS", "MILLISECONDS", "SECONDS", "MINUTES", "HOURS", "DAYS" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "MILLISECONDS", "description": "Time unit for initialDelay and delay options." }, + "useFixedDelay": { "index": 31, "kind": "parameter", "displayName": "Use Fixed Delay", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Controls if fixed delay or fixed rate is used. See ScheduledExecutorService in JDK for details." }, + "domain": { "index": 32, "kind": "parameter", "displayName": "Domain", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.smb.SmbConfiguration", "configurationField": "configuration", "description": "The user domain" }, + "password": { "index": 33, "kind": "parameter", "displayName": "Password", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.smb.SmbConfiguration", "configurationField": "configuration", "description": "The password to access the share" }, + "username": { "index": 34, "kind": "parameter", "displayName": "Username", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.smb.SmbConfiguration", "configurationField": "configuration", "description": "The username required to access the share" } } } diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd index ece74309fe5..e92a71aeca2 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd @@ -75,7 +75,7 @@ Configures batch-processing resequence eip. <xs:annotation> <xs:documentation xml:lang="en"> <![CDATA[ -Define custom beans that can be used in your Camel routes and in general. +Calls a Java bean ]]> </xs:documentation> </xs:annotation> @@ -3973,10 +3973,50 @@ Enables random backoff. Default value: false <xs:complexContent> <xs:extension base="tns:noOutputDefinition"> <xs:sequence/> - <xs:attribute name="ref" type="xs:string"/> - <xs:attribute name="method" type="xs:string"/> - <xs:attribute name="beanType" type="xs:string"/> - <xs:attribute name="scope" type="xs:string"/> + <xs:attribute name="ref" type="xs:string"> + <xs:annotation> + <xs:documentation xml:lang="en"> +<![CDATA[ +Sets a reference to an existing bean to use, which is looked up from the registry. +]]> + </xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="method" type="xs:string"> + <xs:annotation> + <xs:documentation xml:lang="en"> +<![CDATA[ +Sets the method name on the bean to use. +]]> + </xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="beanType" type="xs:string"> + <xs:annotation> + <xs:documentation xml:lang="en"> +<![CDATA[ +Sets the class name (fully qualified) of the bean to use. +]]> + </xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="scope" type="xs:string"> + <xs:annotation> + <xs:documentation xml:lang="en"> +<![CDATA[ +Scope of bean. When using singleton scope (default) the bean is created or looked up only once and reused for the +lifetime of the endpoint. The bean should be thread-safe in case concurrent threads is calling the bean at the same +time. When using request scope the bean is created or looked up once per request (exchange). This can be used if you +want to store state on a bean while processing a request and you want to call the same bean instance multiple times +while processing the request. The bean does not have to be thread-safe as the instance is only called from the same +request. When using prototype scope, then the bean will be looked up or created per call. However in case of lookup then +this is delegated to the bean registry such as Spring or CDI (if in use), which depends on their configuration can act +as either singleton or prototype scope. So when using prototype scope then this depends on the bean registry +implementation. Default value: Singleton +]]> + </xs:documentation> + </xs:annotation> + </xs:attribute> </xs:extension> </xs:complexContent> </xs:complexType> diff --git a/components/camel-smb/src/generated/java/org/apache/camel/component/smb/SmbEndpointConfigurer.java b/components/camel-smb/src/generated/java/org/apache/camel/component/smb/SmbEndpointConfigurer.java index fcdafb1a741..d8efbcdb041 100644 --- a/components/camel-smb/src/generated/java/org/apache/camel/component/smb/SmbEndpointConfigurer.java +++ b/components/camel-smb/src/generated/java/org/apache/camel/component/smb/SmbEndpointConfigurer.java @@ -52,6 +52,8 @@ public class SmbEndpointConfigurer extends PropertyConfigurerSupport implements case "path": target.getConfiguration().setPath(property(camelContext, java.lang.String.class, value)); return true; case "pollstrategy": case "pollStrategy": target.setPollStrategy(property(camelContext, org.apache.camel.spi.PollingConsumerPollStrategy.class, value)); return true; + case "readbuffersize": + case "readBufferSize": target.getConfiguration().setReadBufferSize(property(camelContext, int.class, value)); return true; case "recursive": target.getConfiguration().setRecursive(property(camelContext, boolean.class, value)); return true; case "repeatcount": case "repeatCount": target.setRepeatCount(property(camelContext, long.class, value)); return true; @@ -118,6 +120,8 @@ public class SmbEndpointConfigurer extends PropertyConfigurerSupport implements case "path": return java.lang.String.class; case "pollstrategy": case "pollStrategy": return org.apache.camel.spi.PollingConsumerPollStrategy.class; + case "readbuffersize": + case "readBufferSize": return int.class; case "recursive": return boolean.class; case "repeatcount": case "repeatCount": return long.class; @@ -180,6 +184,8 @@ public class SmbEndpointConfigurer extends PropertyConfigurerSupport implements case "path": return target.getConfiguration().getPath(); case "pollstrategy": case "pollStrategy": return target.getPollStrategy(); + case "readbuffersize": + case "readBufferSize": return target.getConfiguration().getReadBufferSize(); case "recursive": return target.getConfiguration().isRecursive(); case "repeatcount": case "repeatCount": return target.getRepeatCount(); diff --git a/components/camel-smb/src/generated/java/org/apache/camel/component/smb/SmbEndpointUriFactory.java b/components/camel-smb/src/generated/java/org/apache/camel/component/smb/SmbEndpointUriFactory.java index d7987a8c2a2..fd2922cc47d 100644 --- a/components/camel-smb/src/generated/java/org/apache/camel/component/smb/SmbEndpointUriFactory.java +++ b/components/camel-smb/src/generated/java/org/apache/camel/component/smb/SmbEndpointUriFactory.java @@ -23,7 +23,7 @@ public class SmbEndpointUriFactory extends org.apache.camel.support.component.En private static final Set<String> SECRET_PROPERTY_NAMES; private static final Set<String> MULTI_VALUE_PREFIXES; static { - Set<String> props = new HashSet<>(34); + Set<String> props = new HashSet<>(35); props.add("autoCreate"); props.add("backoffErrorThreshold"); props.add("backoffIdleThreshold"); @@ -43,6 +43,7 @@ public class SmbEndpointUriFactory extends org.apache.camel.support.component.En props.add("path"); props.add("pollStrategy"); props.add("port"); + props.add("readBufferSize"); props.add("recursive"); props.add("repeatCount"); props.add("runLoggingLevel"); diff --git a/components/camel-smb/src/generated/resources/META-INF/org/apache/camel/component/smb/smb.json b/components/camel-smb/src/generated/resources/META-INF/org/apache/camel/component/smb/smb.json index f51cf35fb33..9985bff7376 100644 --- a/components/camel-smb/src/generated/resources/META-INF/org/apache/camel/component/smb/smb.json +++ b/components/camel-smb/src/generated/resources/META-INF/org/apache/camel/component/smb/smb.json @@ -41,26 +41,27 @@ "pollStrategy": { "index": 10, "kind": "parameter", "displayName": "Poll Strategy", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.PollingConsumerPollStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "A pluggable org.apache.camel.PollingConsumerPollingStrategy allowing you to provide your custom implementation to control error handling usually occurred during the po [...] "autoCreate": { "index": 11, "kind": "parameter", "displayName": "Auto Create", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.smb.SmbConfiguration", "configurationField": "configuration", "description": "Whether to create parent directory if it does not exist" }, "fileExist": { "index": 12, "kind": "parameter", "displayName": "File Exist", "group": "producer", "label": "producer", "required": false, "type": "object", "javaType": "org.apache.camel.component.file.GenericFileExist", "enum": [ "Override", "Append", "Fail", "Ignore", "Move", "TryRename" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": "Ignore", "configurationClass": "org.apache.camel.component.smb.SmbConfiguration", "configuration [...] - "lazyStartProducer": { "index": 13, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a produ [...] - "idempotentRepository": { "index": 14, "kind": "parameter", "displayName": "Idempotent Repository", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.IdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.smb.SmbConfiguration", "configurationField": "configuration", "description": "A pluggable repository org.apache.camel.spi.IdempotentRepository w [...] - "smbConfig": { "index": 15, "kind": "parameter", "displayName": "Smb Config", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "com.hierynomus.smbj.SmbConfig", "deprecated": false, "deprecationNote": "", "autowired": true, "secret": false, "configurationClass": "org.apache.camel.component.smb.SmbConfiguration", "configurationField": "configuration", "description": "An optional SMB client configuration, can be used to configure client specific [...] - "smbIoBean": { "index": 16, "kind": "parameter", "displayName": "Smb Io Bean", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.smb.SmbIOBean", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.smb.SmbConfiguration", "configurationField": "configuration", "description": "An optional SMB I\/O bean to use to setup the file access attributes when reading\/writi [...] - "backoffErrorThreshold": { "index": 17, "kind": "parameter", "displayName": "Backoff Error Threshold", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "The number of subsequent error polls (failed due some error) that should happen before the backoffMultipler should kick-in." }, - "backoffIdleThreshold": { "index": 18, "kind": "parameter", "displayName": "Backoff Idle Threshold", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "The number of subsequent idle polls that should happen before the backoffMultipler should kick-in." }, - "backoffMultiplier": { "index": 19, "kind": "parameter", "displayName": "Backoff Multiplier", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "To let the scheduled polling consumer backoff if there has been a number of subsequent idles\/errors in a row. The multiplier is then the number of polls that will be skipped before the next actual attempt is h [...] - "delay": { "index": 20, "kind": "parameter", "displayName": "Delay", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 500, "description": "Milliseconds before the next poll." }, - "greedy": { "index": 21, "kind": "parameter", "displayName": "Greedy", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "If greedy is enabled, then the ScheduledPollConsumer will run immediately again, if the previous run polled 1 or more messages." }, - "initialDelay": { "index": 22, "kind": "parameter", "displayName": "Initial Delay", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 1000, "description": "Milliseconds before the first poll starts." }, - "repeatCount": { "index": 23, "kind": "parameter", "displayName": "Repeat Count", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 0, "description": "Specifies a maximum limit of number of fires. So if you set it to 1, the scheduler will only fire once. If you set it to 5, it will only fire five times. A value of zero or negative means fire forever." }, - "runLoggingLevel": { "index": 24, "kind": "parameter", "displayName": "Run Logging Level", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "object", "javaType": "org.apache.camel.LoggingLevel", "enum": [ "TRACE", "DEBUG", "INFO", "WARN", "ERROR", "OFF" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "TRACE", "description": "The consumer logs a start\/complete log line when it polls. This option allows you to configure the l [...] - "scheduledExecutorService": { "index": 25, "kind": "parameter", "displayName": "Scheduled Executor Service", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "object", "javaType": "java.util.concurrent.ScheduledExecutorService", "deprecated": false, "autowired": false, "secret": false, "description": "Allows for configuring a custom\/shared thread pool to use for the consumer. By default each consumer has its own single threaded thread pool." }, - "scheduler": { "index": 26, "kind": "parameter", "displayName": "Scheduler", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "object", "javaType": "java.lang.Object", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "none", "description": "To use a cron scheduler from either camel-spring or camel-quartz component. Use value spring or quartz for built in scheduler" }, - "schedulerProperties": { "index": 27, "kind": "parameter", "displayName": "Scheduler Properties", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.Object>", "prefix": "scheduler.", "multiValue": true, "deprecated": false, "autowired": false, "secret": false, "description": "To configure additional properties when using a custom scheduler or any of the Quartz, Spring based scheduler." }, - "startScheduler": { "index": 28, "kind": "parameter", "displayName": "Start Scheduler", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether the scheduler should be auto started." }, - "timeUnit": { "index": 29, "kind": "parameter", "displayName": "Time Unit", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "object", "javaType": "java.util.concurrent.TimeUnit", "enum": [ "NANOSECONDS", "MICROSECONDS", "MILLISECONDS", "SECONDS", "MINUTES", "HOURS", "DAYS" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "MILLISECONDS", "description": "Time unit for initialDelay and delay options." }, - "useFixedDelay": { "index": 30, "kind": "parameter", "displayName": "Use Fixed Delay", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Controls if fixed delay or fixed rate is used. See ScheduledExecutorService in JDK for details." }, - "domain": { "index": 31, "kind": "parameter", "displayName": "Domain", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.smb.SmbConfiguration", "configurationField": "configuration", "description": "The user domain" }, - "password": { "index": 32, "kind": "parameter", "displayName": "Password", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.smb.SmbConfiguration", "configurationField": "configuration", "description": "The password to access the share" }, - "username": { "index": 33, "kind": "parameter", "displayName": "Username", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.smb.SmbConfiguration", "configurationField": "configuration", "description": "The username required to access the share" } + "readBufferSize": { "index": 13, "kind": "parameter", "displayName": "Read Buffer Size", "group": "producer", "label": "producer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": 2048, "configurationClass": "org.apache.camel.component.smb.SmbConfiguration", "configurationField": "configuration", "description": "Read buffer size when for file being produced" }, + "lazyStartProducer": { "index": 14, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a produ [...] + "idempotentRepository": { "index": 15, "kind": "parameter", "displayName": "Idempotent Repository", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.IdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.smb.SmbConfiguration", "configurationField": "configuration", "description": "A pluggable repository org.apache.camel.spi.IdempotentRepository w [...] + "smbConfig": { "index": 16, "kind": "parameter", "displayName": "Smb Config", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "com.hierynomus.smbj.SmbConfig", "deprecated": false, "deprecationNote": "", "autowired": true, "secret": false, "configurationClass": "org.apache.camel.component.smb.SmbConfiguration", "configurationField": "configuration", "description": "An optional SMB client configuration, can be used to configure client specific [...] + "smbIoBean": { "index": 17, "kind": "parameter", "displayName": "Smb Io Bean", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.smb.SmbIOBean", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.smb.SmbConfiguration", "configurationField": "configuration", "description": "An optional SMB I\/O bean to use to setup the file access attributes when reading\/writi [...] + "backoffErrorThreshold": { "index": 18, "kind": "parameter", "displayName": "Backoff Error Threshold", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "The number of subsequent error polls (failed due some error) that should happen before the backoffMultipler should kick-in." }, + "backoffIdleThreshold": { "index": 19, "kind": "parameter", "displayName": "Backoff Idle Threshold", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "The number of subsequent idle polls that should happen before the backoffMultipler should kick-in." }, + "backoffMultiplier": { "index": 20, "kind": "parameter", "displayName": "Backoff Multiplier", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "To let the scheduled polling consumer backoff if there has been a number of subsequent idles\/errors in a row. The multiplier is then the number of polls that will be skipped before the next actual attempt is h [...] + "delay": { "index": 21, "kind": "parameter", "displayName": "Delay", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 500, "description": "Milliseconds before the next poll." }, + "greedy": { "index": 22, "kind": "parameter", "displayName": "Greedy", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "If greedy is enabled, then the ScheduledPollConsumer will run immediately again, if the previous run polled 1 or more messages." }, + "initialDelay": { "index": 23, "kind": "parameter", "displayName": "Initial Delay", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 1000, "description": "Milliseconds before the first poll starts." }, + "repeatCount": { "index": 24, "kind": "parameter", "displayName": "Repeat Count", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 0, "description": "Specifies a maximum limit of number of fires. So if you set it to 1, the scheduler will only fire once. If you set it to 5, it will only fire five times. A value of zero or negative means fire forever." }, + "runLoggingLevel": { "index": 25, "kind": "parameter", "displayName": "Run Logging Level", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "object", "javaType": "org.apache.camel.LoggingLevel", "enum": [ "TRACE", "DEBUG", "INFO", "WARN", "ERROR", "OFF" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "TRACE", "description": "The consumer logs a start\/complete log line when it polls. This option allows you to configure the l [...] + "scheduledExecutorService": { "index": 26, "kind": "parameter", "displayName": "Scheduled Executor Service", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "object", "javaType": "java.util.concurrent.ScheduledExecutorService", "deprecated": false, "autowired": false, "secret": false, "description": "Allows for configuring a custom\/shared thread pool to use for the consumer. By default each consumer has its own single threaded thread pool." }, + "scheduler": { "index": 27, "kind": "parameter", "displayName": "Scheduler", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "object", "javaType": "java.lang.Object", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "none", "description": "To use a cron scheduler from either camel-spring or camel-quartz component. Use value spring or quartz for built in scheduler" }, + "schedulerProperties": { "index": 28, "kind": "parameter", "displayName": "Scheduler Properties", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.Object>", "prefix": "scheduler.", "multiValue": true, "deprecated": false, "autowired": false, "secret": false, "description": "To configure additional properties when using a custom scheduler or any of the Quartz, Spring based scheduler." }, + "startScheduler": { "index": 29, "kind": "parameter", "displayName": "Start Scheduler", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether the scheduler should be auto started." }, + "timeUnit": { "index": 30, "kind": "parameter", "displayName": "Time Unit", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "object", "javaType": "java.util.concurrent.TimeUnit", "enum": [ "NANOSECONDS", "MICROSECONDS", "MILLISECONDS", "SECONDS", "MINUTES", "HOURS", "DAYS" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "MILLISECONDS", "description": "Time unit for initialDelay and delay options." }, + "useFixedDelay": { "index": 31, "kind": "parameter", "displayName": "Use Fixed Delay", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Controls if fixed delay or fixed rate is used. See ScheduledExecutorService in JDK for details." }, + "domain": { "index": 32, "kind": "parameter", "displayName": "Domain", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.smb.SmbConfiguration", "configurationField": "configuration", "description": "The user domain" }, + "password": { "index": 33, "kind": "parameter", "displayName": "Password", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.smb.SmbConfiguration", "configurationField": "configuration", "description": "The password to access the share" }, + "username": { "index": 34, "kind": "parameter", "displayName": "Username", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.smb.SmbConfiguration", "configurationField": "configuration", "description": "The username required to access the share" } } } diff --git a/components/camel-smb/src/main/java/org/apache/camel/component/smb/SmbConfiguration.java b/components/camel-smb/src/main/java/org/apache/camel/component/smb/SmbConfiguration.java index 9c0725ba97d..40845490c1b 100644 --- a/components/camel-smb/src/main/java/org/apache/camel/component/smb/SmbConfiguration.java +++ b/components/camel-smb/src/main/java/org/apache/camel/component/smb/SmbConfiguration.java @@ -39,6 +39,10 @@ public class SmbConfiguration { defaultValue = "false") private boolean autoCreate; + @Metadata(required = false, defaultValue = "2048") + @UriParam(label = "producer", description = "Read buffer size when for file being produced", defaultValue = "2048") + private int readBufferSize; + @Metadata(required = true) @UriParam(description = "The path, within the share, to consume the files from") private String path; @@ -161,4 +165,12 @@ public class SmbConfiguration { public void setAutoCreate(boolean autoCreate) { this.autoCreate = autoCreate; } + + public void setReadBufferSize(int readBufferSize) { + this.readBufferSize = readBufferSize; + } + + public int getReadBufferSize() { + return readBufferSize; + } } diff --git a/components/camel-smb/src/main/java/org/apache/camel/component/smb/SmbProducer.java b/components/camel-smb/src/main/java/org/apache/camel/component/smb/SmbProducer.java index 0762698a77f..8661001da8a 100644 --- a/components/camel-smb/src/main/java/org/apache/camel/component/smb/SmbProducer.java +++ b/components/camel-smb/src/main/java/org/apache/camel/component/smb/SmbProducer.java @@ -53,6 +53,13 @@ public class SmbProducer extends DefaultProducer { private Session session; private final SMBClient smbClient; + HashSet<AccessMask> GENERIC_ALL_ACCESSMASK = new HashSet<AccessMask>(Arrays.asList(AccessMask.GENERIC_ALL)); + HashSet<AccessMask> FILE_WRITE_DATA_ACCESSMASK = new HashSet<AccessMask>(Arrays.asList(AccessMask.FILE_WRITE_DATA)); + HashSet<SMB2CreateOptions> FILE_DIRECTORY_CREATE_OPTIONS + = new HashSet<>(Arrays.asList(SMB2CreateOptions.FILE_DIRECTORY_FILE)); + HashSet<FileAttributes> FILE_ATTRIBUTES_NORMAL + = new HashSet<FileAttributes>(Arrays.asList(FileAttributes.FILE_ATTRIBUTE_NORMAL)); + protected SmbProducer(final SmbEndpoint endpoint) { super(endpoint); @@ -72,7 +79,6 @@ public class SmbProducer extends DefaultProducer { @Override protected void doStart() throws Exception { LOGGER.debug("Producer SMB client started"); - super.doStart(); } @@ -85,6 +91,13 @@ public class SmbProducer extends DefaultProducer { return result; } + private int getReadBufferSize() { + int readBufferSize = getEndpoint().getConfiguration().getReadBufferSize(); + readBufferSize = (readBufferSize <= 0) ? 2048 : readBufferSize; + + return readBufferSize; + } + protected void connectIfNecessary(Exchange exchange) throws IOException { Connection connection = smbClient.connect(getEndpoint().getHostname(), getEndpoint().getPort()); @@ -157,38 +170,34 @@ public class SmbProducer extends DefaultProducer { SmbConfiguration configuration = getEndpoint().getConfiguration(); String path = (configuration.getPath() == null) ? "" : configuration.getPath(); - LOGGER.debug("storeFile() fileName [" + fileName + "]"); - try { connectIfNecessary(exchange); - java.io.File file = new java.io.File(path + java.io.File.separator + fileName); + java.io.File file = new java.io.File(path, fileName); DiskShare share = (DiskShare) session.connectShare(getEndpoint().getShareName()); createDirectory(share, file); GenericFileExist gfe = determineFileExist(exchange); - - SMB2CreateDisposition scd = SMB2CreateDisposition.FILE_OPEN; - HashSet<AccessMask> accessMask = new HashSet<AccessMask>(Arrays.asList(AccessMask.GENERIC_ALL)); - HashSet<SMB2CreateOptions> createOptions = new HashSet<>(Arrays.asList(SMB2CreateOptions.FILE_DIRECTORY_FILE)); - HashSet<FileAttributes> fileAttributes - = new HashSet<FileAttributes>(Arrays.asList(FileAttributes.FILE_ATTRIBUTE_NORMAL)); + File shareFile = null; // File existence modes switch (gfe) { case Override: - scd = SMB2CreateDisposition.FILE_OVERWRITE_IF; - break; - case Fail: - scd = SMB2CreateDisposition.FILE_CREATE; - if (share.fileExists(file.getPath())) { - doFail(file.getPath()); - } + shareFile = share.openFile(file.getPath(), + FILE_WRITE_DATA_ACCESSMASK, + FILE_ATTRIBUTES_NORMAL, + SMB2ShareAccess.ALL, + SMB2CreateDisposition.FILE_OVERWRITE_IF, + FILE_DIRECTORY_CREATE_OPTIONS); break; case Append: - scd = SMB2CreateDisposition.FILE_OPEN_IF; - accessMask = new HashSet<AccessMask>(Arrays.asList(AccessMask.FILE_WRITE_DATA)); + shareFile = share.openFile(file.getPath(), + FILE_WRITE_DATA_ACCESSMASK, + FILE_ATTRIBUTES_NORMAL, + SMB2ShareAccess.ALL, + SMB2CreateDisposition.FILE_OPEN_IF, + FILE_DIRECTORY_CREATE_OPTIONS); break; case Ignore: if (share.fileExists(file.getPath())) { @@ -196,25 +205,23 @@ public class SmbProducer extends DefaultProducer { return; } break; + case Fail: + if (share.fileExists(file.getPath())) { + doFail(file.getPath()); + } + break; case Move: throw new UnsupportedOperationException("Move is not implemented for this producer at the moment"); case TryRename: throw new UnsupportedOperationException("TryRename is not implemented for this producer at the moment"); } - File shareFile = share.openFile(file.getPath(), - accessMask, - fileAttributes, - SMB2ShareAccess.ALL, - scd, - createOptions); - InputStream is = (exchange.getMessage(InputStream.class) == null) ? exchange.getMessage().getBody(InputStream.class) : exchange.getMessage(InputStream.class); // In order to provide append option, we need to use offset / write with shareFile rather // than with outputstream - int buffer = 2048; + int buffer = getReadBufferSize(); long fileOffset = 0; byte[] byteBuffer = new byte[buffer]; diff --git a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/SmbEndpointBuilderFactory.java b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/SmbEndpointBuilderFactory.java index 5d303e5539b..8d28700b7ad 100644 --- a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/SmbEndpointBuilderFactory.java +++ b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/SmbEndpointBuilderFactory.java @@ -997,6 +997,36 @@ public interface SmbEndpointBuilderFactory { doSetProperty("fileExist", fileExist); return this; } + /** + * Read buffer size when for file being produced. + * + * The option is a: <code>int</code> type. + * + * Default: 2048 + * Group: producer + * + * @param readBufferSize the value to set + * @return the dsl builder + */ + default SmbEndpointProducerBuilder readBufferSize(int readBufferSize) { + doSetProperty("readBufferSize", readBufferSize); + return this; + } + /** + * Read buffer size when for file being produced. + * + * The option will be converted to a <code>int</code> type. + * + * Default: 2048 + * Group: producer + * + * @param readBufferSize the value to set + * @return the dsl builder + */ + default SmbEndpointProducerBuilder readBufferSize(String readBufferSize) { + doSetProperty("readBufferSize", readBufferSize); + return this; + } /** * The user domain. * diff --git a/dsl/camel-kotlin-api/src/generated/kotlin/org/apache/camel/kotlin/components/SmbUriDsl.kt b/dsl/camel-kotlin-api/src/generated/kotlin/org/apache/camel/kotlin/components/SmbUriDsl.kt index ae59ba7eb67..9790d93f92d 100644 --- a/dsl/camel-kotlin-api/src/generated/kotlin/org/apache/camel/kotlin/components/SmbUriDsl.kt +++ b/dsl/camel-kotlin-api/src/generated/kotlin/org/apache/camel/kotlin/components/SmbUriDsl.kt @@ -199,6 +199,20 @@ public class SmbUriDsl( it.property("fileExist", fileExist) } + /** + * Read buffer size when for file being produced + */ + public fun readBufferSize(readBufferSize: String) { + it.property("readBufferSize", readBufferSize) + } + + /** + * Read buffer size when for file being produced + */ + public fun readBufferSize(readBufferSize: Int) { + it.property("readBufferSize", readBufferSize.toString()) + } + /** * Whether the producer should be started lazy (on the first message). By starting lazy you can * use this to allow CamelContext and routes to startup in situations where a producer may otherwise