You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by or...@apache.org on 2022/04/01 15:13:03 UTC

[camel] branch main updated: CAMEL-17879: removed the deprecated camel-soroush component

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


The following commit(s) were added to refs/heads/main by this push:
     new 7c7a8a2  CAMEL-17879: removed the deprecated camel-soroush component
7c7a8a2 is described below

commit 7c7a8a2c4359b785707d3dfb727f31c728f9cc96
Author: Otavio Rodolfo Piske <an...@gmail.com>
AuthorDate: Fri Apr 1 16:03:34 2022 +0200

    CAMEL-17879: removed the deprecated camel-soroush component
---
 bom/camel-bom/pom.xml                              |   5 -
 camel-dependencies/pom.xml                         |   1 -
 catalog/camel-allcomponents/pom.xml                |   4 -
 .../org/apache/camel/catalog/components.properties |   1 -
 .../apache/camel/catalog/components/soroush.json   |  53 --
 components/camel-soroush/pom.xml                   | 145 -----
 .../component/SoroushBotComponentConfigurer.java   |  67 ---
 .../component/SoroushBotEndpointConfigurer.java    | 163 ------
 .../component/SoroushBotEndpointUriFactory.java    |  90 ---
 .../services/org/apache/camel/component.properties |   7 -
 .../services/org/apache/camel/component/soroush    |   2 -
 .../org/apache/camel/configurer/soroush-component  |   2 -
 .../org/apache/camel/configurer/soroush-endpoint   |   2 -
 .../org/apache/camel/urifactory/soroush-endpoint   |   2 -
 .../component/soroushbot/component/soroush.json    |  53 --
 .../src/main/docs/soroush-component.adoc           | 216 -------
 .../component/SoroushBotAbstractConsumer.java      | 245 --------
 .../soroushbot/component/SoroushBotComponent.java  |  53 --
 .../component/SoroushBotDownloadFileProducer.java  |  43 --
 .../soroushbot/component/SoroushBotEndpoint.java   | 651 ---------------------
 .../component/SoroushBotMultiThreadConsumer.java   |  67 ---
 .../component/SoroushBotSendMessageProducer.java   | 117 ----
 .../component/SoroushBotSingleThreadConsumer.java  |  47 --
 .../component/SoroushBotUploadFileProducer.java    |  41 --
 .../component/soroushbot/models/CustomKey.java     |  63 --
 .../component/soroushbot/models/FileType.java      |  26 -
 .../component/soroushbot/models/MinorType.java     |  28 -
 .../component/soroushbot/models/SoroushAction.java |  34 --
 .../soroushbot/models/SoroushMessage.java          | 412 -------------
 .../models/response/SendMessageResponse.java       |  23 -
 .../models/response/SoroushResponse.java           |  58 --
 .../models/response/UploadFileResponse.java        |  40 --
 .../soroushbot/service/SoroushService.java         | 182 ------
 .../soroushbot/utils/CongestionException.java      |  40 --
 .../utils/ExponentialBackOffStrategy.java          |  41 --
 .../soroushbot/utils/FixedBackOffStrategy.java     |  34 --
 .../soroushbot/utils/LinearBackOffStrategy.java    |  39 --
 .../MaximumConnectionRetryReachedException.java    |  41 --
 .../utils/MultiQueueWithTopicThreadPool.java       | 140 -----
 .../soroushbot/utils/SoroushException.java         |  51 --
 .../component/soroushbot/utils/StringUtils.java    |  34 --
 .../apache/camel/component/soroushbot/IOUtils.java |  61 --
 .../component/ConsumerAutoDownloadFileTest.java    |  63 --
 .../ConsumerAutoReconnectAfterIdleTimeoutTest.java |  55 --
 .../component/ConsumerCamelConcurrentTest.java     |  70 ---
 ...nsumerExceptionHandledWithErrorHandlerTest.java |  61 --
 .../component/ConsumerMultiThreadTest.java         |  50 --
 .../component/ConsumerNativeConcurrentTest.java    |  74 ---
 .../ConsumerQueueCapacityPerThreadTest.java        |  49 --
 .../ConsumerRetryOnConnectionFailureTest.java      |  46 --
 .../soroushbot/component/ConsumerTest.java         |  62 --
 ...onentialBackOffProducerConnectionRetryTest.java |  78 ---
 .../FixedBackOffProducerConnectionRetryTest.java   |  79 ---
 .../HandleExceptionWithErrorHandlerTest.java       |  65 --
 .../LinearBackOffProducerConnectionRetryTest.java  |  79 ---
 ...etryWaitingTimeProducerConnectionRetryTest.java |  78 ---
 .../ProducerAutoUploadFileIsFalseTest.java         |  90 ---
 .../component/ProducerAutoUploadFileTest.java      |  91 ---
 .../component/ProducerConnectionRetryTest.java     |  68 ---
 .../component/ProducerDownloadFileTest.java        |  90 ---
 .../ProducerDownloadFileWithoutThumbnailTest.java  |  90 ---
 .../ProducerMaxConnectionRetryReachedTest.java     |  77 ---
 .../soroushbot/component/ProducerTest.java         |  68 ---
 .../component/ProducerUploadFileTest.java          |  90 ---
 .../soroushbot/service/SoroushServiceIT.java       | 134 -----
 .../soroushbot/support/SoroushBotApplication.java  |  34 --
 .../soroushbot/support/SoroushBotTestSupport.java  |  48 --
 .../component/soroushbot/support/SoroushBotWS.java | 210 -------
 .../soroushbot/support/SoroushMockServer.java      |  70 ---
 .../utils/MultiQueueWithTopicThreadPoolTest.java   | 154 -----
 .../src/test/resources/log4j2.properties           |  27 -
 components/pom.xml                                 |   1 -
 .../org/apache/camel/main/components.properties    |   1 -
 .../modules/ROOT/examples/json/soroush.json        |   1 -
 docs/components/modules/ROOT/nav.adoc              |   1 -
 .../modules/ROOT/pages/soroush-component.adoc      |   1 -
 .../component/ComponentsBuilderFactory.java        |  14 -
 .../dsl/SoroushComponentBuilderFactory.java        | 162 -----
 .../src/generated/resources/metadata.json          |  22 -
 .../EndpointConsumerDeserializersResolver.java     |   1 -
 .../EndpointProducerDeserializersResolver.java     |   1 -
 parent/pom.xml                                     |   6 -
 82 files changed, 5885 deletions(-)

diff --git a/bom/camel-bom/pom.xml b/bom/camel-bom/pom.xml
index f161ba0..25387ca 100644
--- a/bom/camel-bom/pom.xml
+++ b/bom/camel-bom/pom.xml
@@ -1865,11 +1865,6 @@
       </dependency>
       <dependency>
         <groupId>org.apache.camel</groupId>
-        <artifactId>camel-soroush</artifactId>
-        <version>${project.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.camel</groupId>
         <artifactId>camel-spark</artifactId>
         <version>${project.version}</version>
       </dependency>
diff --git a/camel-dependencies/pom.xml b/camel-dependencies/pom.xml
index ded3f8e..af215d1 100644
--- a/camel-dependencies/pom.xml
+++ b/camel-dependencies/pom.xml
@@ -321,7 +321,6 @@
     <jcommander-version>1.72</jcommander-version>
     <jcr-version>2.0</jcr-version>
     <jedis-client-version>3.7.1</jedis-client-version>
-    <jersey-version>2.35</jersey-version>
     <jetcd-version>0.5.11</jetcd-version>
     <jettison-version>1.4.1</jettison-version>
     <jetty-plugin-version>${jetty-version}</jetty-plugin-version>
diff --git a/catalog/camel-allcomponents/pom.xml b/catalog/camel-allcomponents/pom.xml
index 6afcaf0..e6b4684 100644
--- a/catalog/camel-allcomponents/pom.xml
+++ b/catalog/camel-allcomponents/pom.xml
@@ -1267,10 +1267,6 @@
 		</dependency>
 		<dependency>
 			<groupId>org.apache.camel</groupId>
-			<artifactId>camel-soroush</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.camel</groupId>
 			<artifactId>camel-spark</artifactId>
 		</dependency>
 		<dependency>
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components.properties b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components.properties
index 694cd8d..a6110fd 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components.properties
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components.properties
@@ -294,7 +294,6 @@ snmp
 solr
 solrCloud
 solrs
-soroush
 spark
 splunk
 splunk-hec
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/soroush.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/soroush.json
deleted file mode 100644
index 5f9c842..0000000
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/soroush.json
+++ /dev/null
@@ -1,53 +0,0 @@
-{
-  "component": {
-    "kind": "component",
-    "name": "soroush",
-    "title": "Soroush",
-    "description": "Send and receive messages as a Soroush chat bot.",
-    "deprecated": true,
-    "firstVersion": "3.0",
-    "label": "chat",
-    "javaType": "org.apache.camel.component.soroushbot.component.SoroushBotComponent",
-    "supportLevel": "Stable",
-    "groupId": "org.apache.camel",
-    "artifactId": "camel-soroush",
-    "version": "3.17.0-SNAPSHOT",
-    "scheme": "soroush",
-    "extendsScheme": "",
-    "syntax": "soroush:action",
-    "async": false,
-    "api": false,
-    "consumerOnly": false,
-    "producerOnly": false,
-    "lenientProperties": false
-  },
-  "componentProperties": {
-    "bridgeErrorHandler": { "kind": "property", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a me [...]
-    "lazyStartProducer": { "kind": "property", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "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 producer may otherwise fail during star [...]
-    "autowiredEnabled": { "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching type, which t [...]
-    "authorizationToken": { "kind": "property", "displayName": "Authorization Token", "group": "global", "label": "global", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The default Soroush authorization token to be used when the information is not provided in the endpoints." }
-  },
-  "properties": {
-    "action": { "kind": "path", "displayName": "Action", "group": "common", "label": "", "required": true, "type": "object", "javaType": "org.apache.camel.component.soroushbot.models.SoroushAction", "enum": [ "sendMessage", "getMessage", "uploadFile", "downloadFile" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The action to do." },
-    "connectionTimeout": { "kind": "parameter", "displayName": "Connection Timeout", "group": "common", "label": "common", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 30000, "description": "Connection timeout in ms when connecting to soroush API" },
-    "maxConnectionRetry": { "kind": "parameter", "displayName": "Max Connection Retry", "group": "common", "label": "common", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 4, "description": "Maximum connection retry when fail to connect to soroush API, if the quota is reached, MaximumConnectionRetryReachedException is thrown for that message." },
-    "bridgeErrorHandler": { "kind": "parameter", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a m [...]
-    "concurrentConsumers": { "kind": "parameter", "displayName": "Concurrent Consumers", "group": "consumer", "label": "consumer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 1, "description": "Number of Thread created by consumer in the route. if you use this method for parallelism, it is guaranteed that messages from same user always execute in the same thread and therefore messages from the same use [...]
-    "queueCapacityPerThread": { "kind": "parameter", "displayName": "Queue Capacity Per Thread", "group": "consumer", "label": "consumer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 0, "description": "Maximum capacity of each queue when concurrentConsumers is greater than 1. if a queue become full, every message that should go to that queue will be dropped. If bridgeErrorHandler is set to true, an exc [...]
-    "exceptionHandler": { "kind": "parameter", "displayName": "Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", "deprecated": false, "autowired": false, "secret": false, "description": "To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the con [...]
-    "exchangePattern": { "kind": "parameter", "displayName": "Exchange Pattern", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut", "InOptionalOut" ], "deprecated": false, "autowired": false, "secret": false, "description": "Sets the exchange pattern when the consumer creates an exchange." },
-    "autoDownload": { "kind": "parameter", "displayName": "Auto Download", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Automatically download SoroushMessage.fileUrl and SoroushMessage.thumbnailUrl if exists for the message and store them in SoroushMessage.file and SoroushMessage.thumbnail field" },
-    "autoUploadFile": { "kind": "parameter", "displayName": "Auto Upload File", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Automatically upload attachments when a message goes to the sendMessage endpoint and the SoroushMessage.file (SoroushMessage.thumbnail) has been set and SoroushMessage.fileUrl(SoroushMessage.thumbnailUrl) is null" },
-    "downloadThumbnail": { "kind": "parameter", "displayName": "Download Thumbnail", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "If true, when downloading an attached file, thumbnail will be downloaded if provided in the message. Otherwise, only the file will be downloaded" },
-    "forceDownload": { "kind": "parameter", "displayName": "Force Download", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Force to download SoroushMessage.fileUrl(SoroushMessage.thumbnailUrl) if exists, even if the SoroushMessage.file(SoroushMessage.thumbnail) was not null in that message" },
-    "forceUpload": { "kind": "parameter", "displayName": "Force Upload", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Force to upload SoroushMessage.file(SoroushMessage.thumbnail) if exists, even if the SoroushMessage.fileUrl(SoroushMessage.thumbnailUrl) is not null in the message" },
-    "lazyStartProducer": { "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "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 producer may otherwise fail during sta [...]
-    "backOffStrategy": { "kind": "parameter", "displayName": "Back Off Strategy", "group": "scheduling", "label": "scheduling", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "Exponential", "description": "The strategy to backoff in case of connection failure. Currently 3 strategies are supported: 1. Exponential (default): It multiply retryWaitingTime by retryExponentialCoefficient after each  [...]
-    "maxRetryWaitingTime": { "kind": "parameter", "displayName": "Max Retry Waiting Time", "group": "scheduling", "label": "scheduling", "required": false, "type": "duration", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3600000", "description": "Maximum amount of time (in millisecond) a thread wait before retrying failed request." },
-    "reconnectIdleConnectionTimeout": { "kind": "parameter", "displayName": "Reconnect Idle Connection Timeout", "group": "scheduling", "label": "scheduling", "required": false, "type": "duration", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "300000", "description": "The timeout in millisecond to reconnect the existing getMessage connection to ensure that the connection is always live and does not dead without notifying the bot. this valu [...]
-    "retryExponentialCoefficient": { "kind": "parameter", "displayName": "Retry Exponential Coefficient", "group": "scheduling", "label": "scheduling", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 2, "description": "Coefficient to compute back off time when using Exponential Back Off strategy" },
-    "retryLinearIncrement": { "kind": "parameter", "displayName": "Retry Linear Increment", "group": "scheduling", "label": "scheduling", "required": false, "type": "duration", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "10000", "description": "The amount of time (in millisecond) which adds to waiting time when using Linear back off strategy" },
-    "retryWaitingTime": { "kind": "parameter", "displayName": "Retry Waiting Time", "group": "scheduling", "label": "scheduling", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 1000, "description": "Waiting time before retry failed request (Millisecond). If backOffStrategy is not Fixed this is the based value for computing back off waiting time. the first retry is always happen immediately after failure  [...]
-    "authorizationToken": { "kind": "parameter", "displayName": "Authorization Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "The authorization token for using the bot. if uri path does not contain authorization token, this token will be used." }
-  }
-}
diff --git a/components/camel-soroush/pom.xml b/components/camel-soroush/pom.xml
deleted file mode 100644
index ad32935..0000000
--- a/components/camel-soroush/pom.xml
+++ /dev/null
@@ -1,145 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    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.
--->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.camel</groupId>
-        <artifactId>components</artifactId>
-        <version>3.17.0-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>camel-soroush</artifactId>
-    <name>Camel :: Soroush (deprecated)</name>
-    <description>Camel Soroush Support</description>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.camel</groupId>
-            <artifactId>camel-support</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>com.squareup.okhttp3</groupId>
-            <artifactId>okhttp-sse</artifactId>
-            <version>${okclient-version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jersey.core</groupId>
-            <artifactId>jersey-client</artifactId>
-            <version>${jersey-version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jersey.media</groupId>
-            <artifactId>jersey-media-json-jackson</artifactId>
-            <version>${jersey-version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jersey.inject</groupId>
-            <artifactId>jersey-hk2</artifactId>
-            <version>${jersey-version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jersey.media</groupId>
-            <artifactId>jersey-media-sse</artifactId>
-            <version>${jersey-version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jersey.media</groupId>
-            <artifactId>jersey-media-multipart</artifactId>
-            <version>${jersey-version}</version>
-        </dependency>
-        <dependency>
-            <groupId>com.fasterxml.jackson.core</groupId>
-            <artifactId>jackson-databind</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.fasterxml.jackson.core</groupId>
-            <artifactId>jackson-annotations</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.fasterxml.jackson.jaxrs</groupId>
-            <artifactId>jackson-jaxrs-json-provider</artifactId>
-        </dependency>
-
-        <!-- test dependencies-->
-        <dependency>
-            <groupId>org.apache.camel</groupId>
-            <artifactId>camel-test-junit5</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-server</artifactId>
-            <version>${jetty-version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-servlet</artifactId>
-            <version>${jetty-version}</version>
-            <scope>test</scope>
-        </dependency>
-
-        <!-- logging -->
-        <dependency>
-            <groupId>org.apache.logging.log4j</groupId>
-            <artifactId>log4j-slf4j-impl</artifactId>
-            <scope>test</scope>
-        </dependency>
-
-        <!-- jersey-server for testing -->
-        <dependency>
-            <groupId>org.glassfish.jersey.core</groupId>
-            <artifactId>jersey-server</artifactId>
-            <version>${jersey-version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jersey.containers</groupId>
-            <artifactId>jersey-container-servlet-core</artifactId>
-            <version>${jersey-version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jersey.containers</groupId>
-            <artifactId>jersey-container-servlet</artifactId>
-            <version>${jersey-version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jersey.media</groupId>
-            <artifactId>jersey-media-moxy</artifactId>
-            <version>${jersey-version}</version>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-surefire-plugin</artifactId>
-                <configuration>
-                    <forkedProcessTimeoutInSeconds>300</forkedProcessTimeoutInSeconds>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/components/camel-soroush/src/generated/java/org/apache/camel/component/soroushbot/component/SoroushBotComponentConfigurer.java b/components/camel-soroush/src/generated/java/org/apache/camel/component/soroushbot/component/SoroushBotComponentConfigurer.java
deleted file mode 100644
index ed624b4..0000000
--- a/components/camel-soroush/src/generated/java/org/apache/camel/component/soroushbot/component/SoroushBotComponentConfigurer.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/* Generated by camel build tools - do NOT edit this file! */
-package org.apache.camel.component.soroushbot.component;
-
-import java.util.Map;
-
-import org.apache.camel.CamelContext;
-import org.apache.camel.spi.ExtendedPropertyConfigurerGetter;
-import org.apache.camel.spi.PropertyConfigurerGetter;
-import org.apache.camel.spi.ConfigurerStrategy;
-import org.apache.camel.spi.GeneratedPropertyConfigurer;
-import org.apache.camel.util.CaseInsensitiveMap;
-import org.apache.camel.support.component.PropertyConfigurerSupport;
-
-/**
- * Generated by camel build tools - do NOT edit this file!
- */
-@SuppressWarnings("unchecked")
-public class SoroushBotComponentConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter {
-
-    @Override
-    public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
-        SoroushBotComponent target = (SoroushBotComponent) obj;
-        switch (ignoreCase ? name.toLowerCase() : name) {
-        case "authorizationtoken":
-        case "authorizationToken": target.setAuthorizationToken(property(camelContext, java.lang.String.class, value)); return true;
-        case "autowiredenabled":
-        case "autowiredEnabled": target.setAutowiredEnabled(property(camelContext, boolean.class, value)); return true;
-        case "bridgeerrorhandler":
-        case "bridgeErrorHandler": target.setBridgeErrorHandler(property(camelContext, boolean.class, value)); return true;
-        case "lazystartproducer":
-        case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
-        default: return false;
-        }
-    }
-
-    @Override
-    public Class<?> getOptionType(String name, boolean ignoreCase) {
-        switch (ignoreCase ? name.toLowerCase() : name) {
-        case "authorizationtoken":
-        case "authorizationToken": return java.lang.String.class;
-        case "autowiredenabled":
-        case "autowiredEnabled": return boolean.class;
-        case "bridgeerrorhandler":
-        case "bridgeErrorHandler": return boolean.class;
-        case "lazystartproducer":
-        case "lazyStartProducer": return boolean.class;
-        default: return null;
-        }
-    }
-
-    @Override
-    public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
-        SoroushBotComponent target = (SoroushBotComponent) obj;
-        switch (ignoreCase ? name.toLowerCase() : name) {
-        case "authorizationtoken":
-        case "authorizationToken": return target.getAuthorizationToken();
-        case "autowiredenabled":
-        case "autowiredEnabled": return target.isAutowiredEnabled();
-        case "bridgeerrorhandler":
-        case "bridgeErrorHandler": return target.isBridgeErrorHandler();
-        case "lazystartproducer":
-        case "lazyStartProducer": return target.isLazyStartProducer();
-        default: return null;
-        }
-    }
-}
-
diff --git a/components/camel-soroush/src/generated/java/org/apache/camel/component/soroushbot/component/SoroushBotEndpointConfigurer.java b/components/camel-soroush/src/generated/java/org/apache/camel/component/soroushbot/component/SoroushBotEndpointConfigurer.java
deleted file mode 100644
index 61bc1ab..0000000
--- a/components/camel-soroush/src/generated/java/org/apache/camel/component/soroushbot/component/SoroushBotEndpointConfigurer.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/* Generated by camel build tools - do NOT edit this file! */
-package org.apache.camel.component.soroushbot.component;
-
-import java.util.Map;
-
-import org.apache.camel.CamelContext;
-import org.apache.camel.spi.ExtendedPropertyConfigurerGetter;
-import org.apache.camel.spi.PropertyConfigurerGetter;
-import org.apache.camel.spi.ConfigurerStrategy;
-import org.apache.camel.spi.GeneratedPropertyConfigurer;
-import org.apache.camel.util.CaseInsensitiveMap;
-import org.apache.camel.support.component.PropertyConfigurerSupport;
-
-/**
- * Generated by camel build tools - do NOT edit this file!
- */
-@SuppressWarnings("unchecked")
-public class SoroushBotEndpointConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter {
-
-    @Override
-    public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
-        SoroushBotEndpoint target = (SoroushBotEndpoint) obj;
-        switch (ignoreCase ? name.toLowerCase() : name) {
-        case "authorizationtoken":
-        case "authorizationToken": target.setAuthorizationToken(property(camelContext, java.lang.String.class, value)); return true;
-        case "autodownload":
-        case "autoDownload": target.setAutoDownload(property(camelContext, boolean.class, value)); return true;
-        case "autouploadfile":
-        case "autoUploadFile": target.setAutoUploadFile(property(camelContext, boolean.class, value)); return true;
-        case "backoffstrategy":
-        case "backOffStrategy": target.setBackOffStrategy(property(camelContext, java.lang.String.class, value)); return true;
-        case "bridgeerrorhandler":
-        case "bridgeErrorHandler": target.setBridgeErrorHandler(property(camelContext, boolean.class, value)); return true;
-        case "concurrentconsumers":
-        case "concurrentConsumers": target.setConcurrentConsumers(property(camelContext, int.class, value)); return true;
-        case "connectiontimeout":
-        case "connectionTimeout": target.setConnectionTimeout(property(camelContext, int.class, value)); return true;
-        case "downloadthumbnail":
-        case "downloadThumbnail": target.setDownloadThumbnail(property(camelContext, boolean.class, value)); return true;
-        case "exceptionhandler":
-        case "exceptionHandler": target.setExceptionHandler(property(camelContext, org.apache.camel.spi.ExceptionHandler.class, value)); return true;
-        case "exchangepattern":
-        case "exchangePattern": target.setExchangePattern(property(camelContext, org.apache.camel.ExchangePattern.class, value)); return true;
-        case "forcedownload":
-        case "forceDownload": target.setForceDownload(property(camelContext, boolean.class, value)); return true;
-        case "forceupload":
-        case "forceUpload": target.setForceUpload(property(camelContext, boolean.class, value)); return true;
-        case "lazystartproducer":
-        case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
-        case "maxconnectionretry":
-        case "maxConnectionRetry": target.setMaxConnectionRetry(property(camelContext, int.class, value)); return true;
-        case "maxretrywaitingtime":
-        case "maxRetryWaitingTime": target.setMaxRetryWaitingTime(property(camelContext, java.time.Duration.class, value).toMillis()); return true;
-        case "queuecapacityperthread":
-        case "queueCapacityPerThread": target.setQueueCapacityPerThread(property(camelContext, int.class, value)); return true;
-        case "reconnectidleconnectiontimeout":
-        case "reconnectIdleConnectionTimeout": target.setReconnectIdleConnectionTimeout(property(camelContext, java.time.Duration.class, value).toMillis()); return true;
-        case "retryexponentialcoefficient":
-        case "retryExponentialCoefficient": target.setRetryExponentialCoefficient(property(camelContext, long.class, value)); return true;
-        case "retrylinearincrement":
-        case "retryLinearIncrement": target.setRetryLinearIncrement(property(camelContext, java.time.Duration.class, value).toMillis()); return true;
-        case "retrywaitingtime":
-        case "retryWaitingTime": target.setRetryWaitingTime(property(camelContext, long.class, value)); return true;
-        default: return false;
-        }
-    }
-
-    @Override
-    public Class<?> getOptionType(String name, boolean ignoreCase) {
-        switch (ignoreCase ? name.toLowerCase() : name) {
-        case "authorizationtoken":
-        case "authorizationToken": return java.lang.String.class;
-        case "autodownload":
-        case "autoDownload": return boolean.class;
-        case "autouploadfile":
-        case "autoUploadFile": return boolean.class;
-        case "backoffstrategy":
-        case "backOffStrategy": return java.lang.String.class;
-        case "bridgeerrorhandler":
-        case "bridgeErrorHandler": return boolean.class;
-        case "concurrentconsumers":
-        case "concurrentConsumers": return int.class;
-        case "connectiontimeout":
-        case "connectionTimeout": return int.class;
-        case "downloadthumbnail":
-        case "downloadThumbnail": return boolean.class;
-        case "exceptionhandler":
-        case "exceptionHandler": return org.apache.camel.spi.ExceptionHandler.class;
-        case "exchangepattern":
-        case "exchangePattern": return org.apache.camel.ExchangePattern.class;
-        case "forcedownload":
-        case "forceDownload": return boolean.class;
-        case "forceupload":
-        case "forceUpload": return boolean.class;
-        case "lazystartproducer":
-        case "lazyStartProducer": return boolean.class;
-        case "maxconnectionretry":
-        case "maxConnectionRetry": return int.class;
-        case "maxretrywaitingtime":
-        case "maxRetryWaitingTime": return long.class;
-        case "queuecapacityperthread":
-        case "queueCapacityPerThread": return int.class;
-        case "reconnectidleconnectiontimeout":
-        case "reconnectIdleConnectionTimeout": return long.class;
-        case "retryexponentialcoefficient":
-        case "retryExponentialCoefficient": return long.class;
-        case "retrylinearincrement":
-        case "retryLinearIncrement": return long.class;
-        case "retrywaitingtime":
-        case "retryWaitingTime": return long.class;
-        default: return null;
-        }
-    }
-
-    @Override
-    public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
-        SoroushBotEndpoint target = (SoroushBotEndpoint) obj;
-        switch (ignoreCase ? name.toLowerCase() : name) {
-        case "authorizationtoken":
-        case "authorizationToken": return target.getAuthorizationToken();
-        case "autodownload":
-        case "autoDownload": return target.isAutoDownload();
-        case "autouploadfile":
-        case "autoUploadFile": return target.isAutoUploadFile();
-        case "backoffstrategy":
-        case "backOffStrategy": return target.getBackOffStrategy();
-        case "bridgeerrorhandler":
-        case "bridgeErrorHandler": return target.isBridgeErrorHandler();
-        case "concurrentconsumers":
-        case "concurrentConsumers": return target.getConcurrentConsumers();
-        case "connectiontimeout":
-        case "connectionTimeout": return target.getConnectionTimeout();
-        case "downloadthumbnail":
-        case "downloadThumbnail": return target.isDownloadThumbnail();
-        case "exceptionhandler":
-        case "exceptionHandler": return target.getExceptionHandler();
-        case "exchangepattern":
-        case "exchangePattern": return target.getExchangePattern();
-        case "forcedownload":
-        case "forceDownload": return target.isForceDownload();
-        case "forceupload":
-        case "forceUpload": return target.isForceUpload();
-        case "lazystartproducer":
-        case "lazyStartProducer": return target.isLazyStartProducer();
-        case "maxconnectionretry":
-        case "maxConnectionRetry": return target.getMaxConnectionRetry();
-        case "maxretrywaitingtime":
-        case "maxRetryWaitingTime": return target.getMaxRetryWaitingTime();
-        case "queuecapacityperthread":
-        case "queueCapacityPerThread": return target.getQueueCapacityPerThread();
-        case "reconnectidleconnectiontimeout":
-        case "reconnectIdleConnectionTimeout": return target.getReconnectIdleConnectionTimeout();
-        case "retryexponentialcoefficient":
-        case "retryExponentialCoefficient": return target.getRetryExponentialCoefficient();
-        case "retrylinearincrement":
-        case "retryLinearIncrement": return target.getRetryLinearIncrement();
-        case "retrywaitingtime":
-        case "retryWaitingTime": return target.getRetryWaitingTime();
-        default: return null;
-        }
-    }
-}
-
diff --git a/components/camel-soroush/src/generated/java/org/apache/camel/component/soroushbot/component/SoroushBotEndpointUriFactory.java b/components/camel-soroush/src/generated/java/org/apache/camel/component/soroushbot/component/SoroushBotEndpointUriFactory.java
deleted file mode 100644
index 6fa0a73..0000000
--- a/components/camel-soroush/src/generated/java/org/apache/camel/component/soroushbot/component/SoroushBotEndpointUriFactory.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/* Generated by camel build tools - do NOT edit this file! */
-package org.apache.camel.component.soroushbot.component;
-
-import java.net.URISyntaxException;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.camel.spi.EndpointUriFactory;
-
-/**
- * Generated by camel build tools - do NOT edit this file!
- */
-public class SoroushBotEndpointUriFactory extends org.apache.camel.support.component.EndpointUriFactorySupport implements EndpointUriFactory {
-
-    private static final String BASE = ":action";
-
-    private static final Set<String> PROPERTY_NAMES;
-    private static final Set<String> SECRET_PROPERTY_NAMES;
-    private static final Set<String> MULTI_VALUE_PREFIXES;
-    static {
-        Set<String> props = new HashSet<>(21);
-        props.add("action");
-        props.add("authorizationToken");
-        props.add("autoDownload");
-        props.add("autoUploadFile");
-        props.add("backOffStrategy");
-        props.add("bridgeErrorHandler");
-        props.add("concurrentConsumers");
-        props.add("connectionTimeout");
-        props.add("downloadThumbnail");
-        props.add("exceptionHandler");
-        props.add("exchangePattern");
-        props.add("forceDownload");
-        props.add("forceUpload");
-        props.add("lazyStartProducer");
-        props.add("maxConnectionRetry");
-        props.add("maxRetryWaitingTime");
-        props.add("queueCapacityPerThread");
-        props.add("reconnectIdleConnectionTimeout");
-        props.add("retryExponentialCoefficient");
-        props.add("retryLinearIncrement");
-        props.add("retryWaitingTime");
-        PROPERTY_NAMES = Collections.unmodifiableSet(props);
-        Set<String> secretProps = new HashSet<>(1);
-        secretProps.add("authorizationToken");
-        SECRET_PROPERTY_NAMES = Collections.unmodifiableSet(secretProps);
-        MULTI_VALUE_PREFIXES = Collections.emptySet();
-    }
-
-    @Override
-    public boolean isEnabled(String scheme) {
-        return "soroush".equals(scheme);
-    }
-
-    @Override
-    public String buildUri(String scheme, Map<String, Object> properties, boolean encode) throws URISyntaxException {
-        String syntax = scheme + BASE;
-        String uri = syntax;
-
-        Map<String, Object> copy = new HashMap<>(properties);
-
-        uri = buildPathParameter(syntax, uri, "action", null, true, copy);
-        uri = buildQueryParameters(uri, copy, encode);
-        return uri;
-    }
-
-    @Override
-    public Set<String> propertyNames() {
-        return PROPERTY_NAMES;
-    }
-
-    @Override
-    public Set<String> secretPropertyNames() {
-        return SECRET_PROPERTY_NAMES;
-    }
-
-    @Override
-    public Set<String> multiValuePrefixes() {
-        return MULTI_VALUE_PREFIXES;
-    }
-
-    @Override
-    public boolean isLenientProperties() {
-        return false;
-    }
-}
-
diff --git a/components/camel-soroush/src/generated/resources/META-INF/services/org/apache/camel/component.properties b/components/camel-soroush/src/generated/resources/META-INF/services/org/apache/camel/component.properties
deleted file mode 100644
index fa1c7db..0000000
--- a/components/camel-soroush/src/generated/resources/META-INF/services/org/apache/camel/component.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-# Generated by camel build tools - do NOT edit this file!
-components=soroush
-groupId=org.apache.camel
-artifactId=camel-soroush
-version=3.17.0-SNAPSHOT
-projectName=Camel :: Soroush (deprecated)
-projectDescription=Camel Soroush Support
diff --git a/components/camel-soroush/src/generated/resources/META-INF/services/org/apache/camel/component/soroush b/components/camel-soroush/src/generated/resources/META-INF/services/org/apache/camel/component/soroush
deleted file mode 100644
index a14f3ab..0000000
--- a/components/camel-soroush/src/generated/resources/META-INF/services/org/apache/camel/component/soroush
+++ /dev/null
@@ -1,2 +0,0 @@
-# Generated by camel build tools - do NOT edit this file!
-class=org.apache.camel.component.soroushbot.component.SoroushBotComponent
diff --git a/components/camel-soroush/src/generated/resources/META-INF/services/org/apache/camel/configurer/soroush-component b/components/camel-soroush/src/generated/resources/META-INF/services/org/apache/camel/configurer/soroush-component
deleted file mode 100644
index be4532f..0000000
--- a/components/camel-soroush/src/generated/resources/META-INF/services/org/apache/camel/configurer/soroush-component
+++ /dev/null
@@ -1,2 +0,0 @@
-# Generated by camel build tools - do NOT edit this file!
-class=org.apache.camel.component.soroushbot.component.SoroushBotComponentConfigurer
diff --git a/components/camel-soroush/src/generated/resources/META-INF/services/org/apache/camel/configurer/soroush-endpoint b/components/camel-soroush/src/generated/resources/META-INF/services/org/apache/camel/configurer/soroush-endpoint
deleted file mode 100644
index f2127d3..0000000
--- a/components/camel-soroush/src/generated/resources/META-INF/services/org/apache/camel/configurer/soroush-endpoint
+++ /dev/null
@@ -1,2 +0,0 @@
-# Generated by camel build tools - do NOT edit this file!
-class=org.apache.camel.component.soroushbot.component.SoroushBotEndpointConfigurer
diff --git a/components/camel-soroush/src/generated/resources/META-INF/services/org/apache/camel/urifactory/soroush-endpoint b/components/camel-soroush/src/generated/resources/META-INF/services/org/apache/camel/urifactory/soroush-endpoint
deleted file mode 100644
index 4c86905..0000000
--- a/components/camel-soroush/src/generated/resources/META-INF/services/org/apache/camel/urifactory/soroush-endpoint
+++ /dev/null
@@ -1,2 +0,0 @@
-# Generated by camel build tools - do NOT edit this file!
-class=org.apache.camel.component.soroushbot.component.SoroushBotEndpointUriFactory
diff --git a/components/camel-soroush/src/generated/resources/org/apache/camel/component/soroushbot/component/soroush.json b/components/camel-soroush/src/generated/resources/org/apache/camel/component/soroushbot/component/soroush.json
deleted file mode 100644
index 5f9c842..0000000
--- a/components/camel-soroush/src/generated/resources/org/apache/camel/component/soroushbot/component/soroush.json
+++ /dev/null
@@ -1,53 +0,0 @@
-{
-  "component": {
-    "kind": "component",
-    "name": "soroush",
-    "title": "Soroush",
-    "description": "Send and receive messages as a Soroush chat bot.",
-    "deprecated": true,
-    "firstVersion": "3.0",
-    "label": "chat",
-    "javaType": "org.apache.camel.component.soroushbot.component.SoroushBotComponent",
-    "supportLevel": "Stable",
-    "groupId": "org.apache.camel",
-    "artifactId": "camel-soroush",
-    "version": "3.17.0-SNAPSHOT",
-    "scheme": "soroush",
-    "extendsScheme": "",
-    "syntax": "soroush:action",
-    "async": false,
-    "api": false,
-    "consumerOnly": false,
-    "producerOnly": false,
-    "lenientProperties": false
-  },
-  "componentProperties": {
-    "bridgeErrorHandler": { "kind": "property", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a me [...]
-    "lazyStartProducer": { "kind": "property", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "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 producer may otherwise fail during star [...]
-    "autowiredEnabled": { "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching type, which t [...]
-    "authorizationToken": { "kind": "property", "displayName": "Authorization Token", "group": "global", "label": "global", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The default Soroush authorization token to be used when the information is not provided in the endpoints." }
-  },
-  "properties": {
-    "action": { "kind": "path", "displayName": "Action", "group": "common", "label": "", "required": true, "type": "object", "javaType": "org.apache.camel.component.soroushbot.models.SoroushAction", "enum": [ "sendMessage", "getMessage", "uploadFile", "downloadFile" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The action to do." },
-    "connectionTimeout": { "kind": "parameter", "displayName": "Connection Timeout", "group": "common", "label": "common", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 30000, "description": "Connection timeout in ms when connecting to soroush API" },
-    "maxConnectionRetry": { "kind": "parameter", "displayName": "Max Connection Retry", "group": "common", "label": "common", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 4, "description": "Maximum connection retry when fail to connect to soroush API, if the quota is reached, MaximumConnectionRetryReachedException is thrown for that message." },
-    "bridgeErrorHandler": { "kind": "parameter", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a m [...]
-    "concurrentConsumers": { "kind": "parameter", "displayName": "Concurrent Consumers", "group": "consumer", "label": "consumer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 1, "description": "Number of Thread created by consumer in the route. if you use this method for parallelism, it is guaranteed that messages from same user always execute in the same thread and therefore messages from the same use [...]
-    "queueCapacityPerThread": { "kind": "parameter", "displayName": "Queue Capacity Per Thread", "group": "consumer", "label": "consumer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 0, "description": "Maximum capacity of each queue when concurrentConsumers is greater than 1. if a queue become full, every message that should go to that queue will be dropped. If bridgeErrorHandler is set to true, an exc [...]
-    "exceptionHandler": { "kind": "parameter", "displayName": "Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", "deprecated": false, "autowired": false, "secret": false, "description": "To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the con [...]
-    "exchangePattern": { "kind": "parameter", "displayName": "Exchange Pattern", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut", "InOptionalOut" ], "deprecated": false, "autowired": false, "secret": false, "description": "Sets the exchange pattern when the consumer creates an exchange." },
-    "autoDownload": { "kind": "parameter", "displayName": "Auto Download", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Automatically download SoroushMessage.fileUrl and SoroushMessage.thumbnailUrl if exists for the message and store them in SoroushMessage.file and SoroushMessage.thumbnail field" },
-    "autoUploadFile": { "kind": "parameter", "displayName": "Auto Upload File", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Automatically upload attachments when a message goes to the sendMessage endpoint and the SoroushMessage.file (SoroushMessage.thumbnail) has been set and SoroushMessage.fileUrl(SoroushMessage.thumbnailUrl) is null" },
-    "downloadThumbnail": { "kind": "parameter", "displayName": "Download Thumbnail", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "If true, when downloading an attached file, thumbnail will be downloaded if provided in the message. Otherwise, only the file will be downloaded" },
-    "forceDownload": { "kind": "parameter", "displayName": "Force Download", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Force to download SoroushMessage.fileUrl(SoroushMessage.thumbnailUrl) if exists, even if the SoroushMessage.file(SoroushMessage.thumbnail) was not null in that message" },
-    "forceUpload": { "kind": "parameter", "displayName": "Force Upload", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Force to upload SoroushMessage.file(SoroushMessage.thumbnail) if exists, even if the SoroushMessage.fileUrl(SoroushMessage.thumbnailUrl) is not null in the message" },
-    "lazyStartProducer": { "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "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 producer may otherwise fail during sta [...]
-    "backOffStrategy": { "kind": "parameter", "displayName": "Back Off Strategy", "group": "scheduling", "label": "scheduling", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "Exponential", "description": "The strategy to backoff in case of connection failure. Currently 3 strategies are supported: 1. Exponential (default): It multiply retryWaitingTime by retryExponentialCoefficient after each  [...]
-    "maxRetryWaitingTime": { "kind": "parameter", "displayName": "Max Retry Waiting Time", "group": "scheduling", "label": "scheduling", "required": false, "type": "duration", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3600000", "description": "Maximum amount of time (in millisecond) a thread wait before retrying failed request." },
-    "reconnectIdleConnectionTimeout": { "kind": "parameter", "displayName": "Reconnect Idle Connection Timeout", "group": "scheduling", "label": "scheduling", "required": false, "type": "duration", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "300000", "description": "The timeout in millisecond to reconnect the existing getMessage connection to ensure that the connection is always live and does not dead without notifying the bot. this valu [...]
-    "retryExponentialCoefficient": { "kind": "parameter", "displayName": "Retry Exponential Coefficient", "group": "scheduling", "label": "scheduling", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 2, "description": "Coefficient to compute back off time when using Exponential Back Off strategy" },
-    "retryLinearIncrement": { "kind": "parameter", "displayName": "Retry Linear Increment", "group": "scheduling", "label": "scheduling", "required": false, "type": "duration", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "10000", "description": "The amount of time (in millisecond) which adds to waiting time when using Linear back off strategy" },
-    "retryWaitingTime": { "kind": "parameter", "displayName": "Retry Waiting Time", "group": "scheduling", "label": "scheduling", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 1000, "description": "Waiting time before retry failed request (Millisecond). If backOffStrategy is not Fixed this is the based value for computing back off waiting time. the first retry is always happen immediately after failure  [...]
-    "authorizationToken": { "kind": "parameter", "displayName": "Authorization Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "The authorization token for using the bot. if uri path does not contain authorization token, this token will be used." }
-  }
-}
diff --git a/components/camel-soroush/src/main/docs/soroush-component.adoc b/components/camel-soroush/src/main/docs/soroush-component.adoc
deleted file mode 100644
index e123d4a..0000000
--- a/components/camel-soroush/src/main/docs/soroush-component.adoc
+++ /dev/null
@@ -1,216 +0,0 @@
-= Soroush Component (deprecated)
-:doctitle: Soroush
-:shortname: soroush
-:artifactid: camel-soroush
-:description: Send and receive messages as a Soroush chat bot.
-:since: 3.0
-:supportlevel: Stable-deprecated
-:deprecated: *deprecated*
-:component-header: Both producer and consumer are supported
-//Manually maintained attributes
-:camel-spring-boot-name: soroush
-
-*Since Camel {since}*
-
-*{component-header}*
-
-The Soroush component provides access to the https://soroush-app.ir/developer.html[Soroush Bot API].
-It allows a Camel-based application to send and receive messages by acting as a Bot, i.e. participating in direct conversation with normal users and send and receive message and files
-
-A Soroush Bot must be created before using this component, following the
-instruction at the
-https://soroush-app.ir/developer.html[Soroush Bot Developers home].
-when a new Bot is created, the https://sapp.ir/mrbot[MrBot] provides
-an **authorization token** corresponding to the Bot. The authorization token is a mandatory parameter for camel-soroush endpoint.
-
-Maven users will need to add the following dependency to their `pom.xml`
-for this component:
-
-[source,xml]
-------------------------------------------------------------
-<dependency>
-    <groupId>org.apache.camel</groupId>
-    <artifactId>camel-soroush</artifactId>
-    <version>x.x.x</version>
-    <!-- use the same version as your Camel core version -->
-</dependency>
-------------------------------------------------------------
-
-Soroush Component supports 4 types of endpoint that can be specified in
-uri path:
-
-[width="100%",cols="2,5",options="header"]
-|===
-|Type| Description
-|*getMessage* (Consumer)
-|With this endpoint you can receive messages from users.
-
-|*sendMessage* (Producer)
-|By sending exchange to this endpoint, you can send messages to users.
-
-|*downloadFile* (Producer)
-|By sending a message to this endpoint the component tries to download
-message attachments (file & thumbnail) if exists, and store them in
-`SoroushMessage.file` and `SoroushMessage.thumbnail`.
-
-|*uploadFile* (Producer)
-|By sending a message to this endpoint it will upload file and thumbnail
-attachments if provided in the message  (`SoroushMessage.file`, `SoroushMessage.thumbnail`)
-and store the urls in the message (`SoroushMessage.fileUrl`, `SoroushMessage.thumbnailUrl`).
-|===
-
-
-
-// component-configure options: START
-
-// component-configure options: END
-
-// component options: START
-include::partial$component-configure-options.adoc[]
-include::partial$component-endpoint-options.adoc[]
-// component options: END
-
-// endpoint options: START
-
-// endpoint options: END
-
-
-== Usage
-
-Every exchange that you send to soroush endpoint must contain a
-body of type `org.apache.camel.component.soroushbot.models.MessageModel`.
-Similarly, every exchange you receive from soroush endpoint contains a body
-of `MessageModel` too.
-
-[source,java]
-------------
-SoroushMessage message = exchange.getIn().getBody(SoroushMessage.class)
-------------
-
-=== Receive Message
-With this endpoint you can receive messages from users.
-
-The following is a basic example of how to receive all messages that your Soroush users are sending to the configured Bot.
-In Java DSL:
-
-[source,java]
--------------
-from("soroush:getMessage/YourAuthorizationToken?autoDownload=true")
-    .bean(ProcessorBean.class);
--------------
-and in Spring XML
-[source,xml]
-------------
-<route>
-    <from uri="soroush:getMessage/YourAuthorizationToken?autoDownload=true"/>
-    <bean ref="processorBean" />
-<route>
-
-<bean id="processorBean" class="com.example.ProcessorBean"/>
-------------
-
-=== Download File
-This endpoint is useful when you want to conditionally download the files specified in the message.
-When you send a message to this endpoint it opens a connection to Soroush Server
-for downloading the files and store `InputStream` of that connection in
-`SoroushMessage.file` and `SoroushMessage.thumbnail` and then you can read contents of the files.
-
-[NOTE]
-====
-If you delay reading from these streams, the Soroush server may close the connection.
-You are responsible for storing attachment files on your disc if needed.
-====
-
-Please refer to  Query Parameters table for more information.
-
-The following is an example of how to conditionally download files in the messages.
-
-[source,java]
--------------
-from("soroush:getMessage/YourAuthorizationToken")
-    .choice().when(exchange -> {
-        SoroushMessage soroushMessage = exchange.getIn().getBody(SoroushMessage.class);
-        return soroushMessage.getFileSize()!=null && soroushMessage.getFileSize()<10000;
-                               })
-    .to("soroush:downloadFile/YourAuthorizationToken");
-    .otherwise().stop()
-    .end()
-    .bean(ProcessorBean.class)
--------------
-
-=== Send Message
-This endpoint is your primary way to send messages and upload files. You can simply
-send a message to a user by sending the message to this endpoint.
-
-This is a simple example that simply replies every user messages with the same message.
-
-[source,java]
--------------
-from("soroush:getMessage/YourAuthorizationToken")
-    .process(exchange->{
-        SoroushMessage soroushMessage = exchange.getIn().getBody(SoroushMessage.class);
-        soroushMessage.setTo(soroushMessage.getFrom());
-    })
-    .to("soroush:sendMessage/YourAuthorizationToken");
--------------
-
-=== Auto Upload Attachments
-This endpoint can help you to automatically upload files and thumbnails of a message to the server
-and set `fileUrl` and `thumbnailUrl` of that message to proper values taken from Soroush Upload File Api.
-The only thing you need to do is setting `SoroushMessage.file` and `SoroushMessage.thumbnail` properties.
-There are 4 utility methods provided for this purpose:
-
-[source,java]
--------------
-SoroushMessage.setFile(File file)
-SoroushMessage.setFile(InputStream fileStream)
-SoroushMessage.setThumbnail(File thumbnail)
-SoroushMessage.setThumbnail(InputStream thumbnailStream)
--------------
-
-
-=== Upload File
-This endpoint is a utility endpoint that allows you to upload a file without sending the message.
-The only thing you need to do for uploading a file is to set `SoroushMessage.file` and `Send Message.thumbnail`
-and this endpoint upload them to the Soroush server.
-
-[source,java]
--------------
-from("soroush:getMessage/YourAuthorizationToken")
-    .process(exchage->{
-        SoroushMessage response = new SoroushMessage();
-        response.setTo(exchange.getIn().getBody(SoroushMessage.class).getFrom());
-        response.setFile(new File("MyResponse.jpg"))
-    })
-    .to("soroush:uploadFile/YourAuthorizationToken")
-    .process(exchage->System.out.println(exchange.getIn().getBody(SoroushMessage.class).getFileUrl())
--------------
-
-=== Error Handling
-There are 3 types of exceptions that can be produced in Soroush Component.
-[width="100%",cols="2,5",options="header"]
-|===
-|Exception| Description
-
-|CongestionException
-|this exception occurs when `bridgeErrorHandler=true` and you use more than 1 concurrentConsumer (`concurrentConsumers>1`)
-and `queueCapacityPerThread` is reached for a queue, on any message that goes to that queue,
-a CongestionException will throw.
-
-|MaximumConnectionRetryReachedException
-|when the component could not connect to the Soroush server for more than `MaxConnectionRetry` times
-
-|SoroushException
-|when a request is rejected by Soroush Server.
-
-|===
-
-One way to handle these exceptions is by using `onException` route definition:
-
-[source,java]
--------------
-onException(CongestionException.class).log("Failed to processing ${id}")
--------------
-
-
-include::spring-boot:partial$starter.adoc[]
diff --git a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotAbstractConsumer.java b/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotAbstractConsumer.java
deleted file mode 100644
index 858ee66..0000000
--- a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotAbstractConsumer.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- * 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.soroushbot.component;
-
-import java.util.concurrent.TimeUnit;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import okhttp3.OkHttpClient;
-import okhttp3.Request;
-import okhttp3.Response;
-import okhttp3.sse.EventSource;
-import okhttp3.sse.EventSourceListener;
-import okhttp3.sse.EventSources;
-import org.apache.camel.Exchange;
-import org.apache.camel.Processor;
-import org.apache.camel.component.soroushbot.models.SoroushAction;
-import org.apache.camel.component.soroushbot.models.SoroushMessage;
-import org.apache.camel.component.soroushbot.service.SoroushService;
-import org.apache.camel.support.DefaultConsumer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * this component handle logic for getting message from Soroush server and for each message it calls abstract function
- * {@link SoroushBotAbstractConsumer#sendExchange(Exchange)} each subclass should handle how it will start the
- * processing of the exchange
- */
-public abstract class SoroushBotAbstractConsumer extends DefaultConsumer implements org.apache.camel.spi.ShutdownPrepared {
-
-    private static final Logger LOG = LoggerFactory.getLogger(SoroushBotAbstractConsumer.class);
-
-    SoroushBotEndpoint endpoint;
-    /**
-     * {@link ObjectMapper} for parse message JSON
-     */
-    ObjectMapper objectMapper = new ObjectMapper();
-    boolean shutdown;
-    long lastMessageReceived;
-    private ReconnectableEventSourceListener connection;
-
-    public SoroushBotAbstractConsumer(SoroushBotEndpoint endpoint, Processor processor) {
-        super(endpoint, processor);
-        this.endpoint = endpoint;
-    }
-
-    @Override
-    public void doStart() {
-        run();
-    }
-
-    /**
-     * handle how processing of the exchange should be started
-     *
-     * @param exchange
-     */
-    protected abstract void sendExchange(Exchange exchange) throws Exception;
-
-    private void run() {
-        lastMessageReceived = System.currentTimeMillis();
-        Request request = new Request.Builder()
-                .url(SoroushService.get().generateUrl(endpoint.getAuthorizationToken(), SoroushAction.getMessage, null))
-                .build();
-        OkHttpClient client = new OkHttpClient.Builder()
-                .connectTimeout(endpoint.getConnectionTimeout(), TimeUnit.MILLISECONDS)
-                .writeTimeout(0L, TimeUnit.MILLISECONDS)
-                .readTimeout(0L, TimeUnit.MILLISECONDS)
-                .build();
-        connection = new ReconnectableEventSourceListener(client, request, endpoint.getMaxConnectionRetry()) {
-            @Override
-            protected boolean onBeforeConnect() {
-                long interval = endpoint.getBackOffStrategyHelper().calculateInterval(getConnectionRetry());
-
-                try {
-                    Thread.sleep(interval);
-                } catch (InterruptedException e) {
-                    Thread.currentThread().interrupt();
-                }
-
-                return !shutdown;
-            }
-
-            @Override
-            public void onOpen(EventSource eventSource, Response response) {
-                super.onOpen(eventSource, response);
-                LOG.info("connection established");
-            }
-
-            @Override
-            protected boolean handleClose(EventSource eventSource, boolean manuallyClosed) {
-                if (!manuallyClosed) {
-                    LOG.warn("connection got closed");
-                } else {
-                    LOG.debug("manually reconnecting to ensure we have live connection");
-                }
-                return true;
-            }
-
-            @Override
-            protected boolean handleFailure(EventSource eventSource, boolean manuallyClosed, Throwable t, Response response) {
-                if (!manuallyClosed) {
-                    LOG.error("connection failed due to following error", t);
-                } else {
-                    LOG.debug("manually reconnecting to ensure we have live connection");
-                }
-                return true;
-            }
-
-            @Override
-            public void onEvent(EventSource eventSource, String id, String type, String data) {
-                Exchange exchange = createExchange(false);
-                try {
-                    SoroushMessage soroushMessage = objectMapper.readValue(data, SoroushMessage.class);
-                    exchange.getIn().setBody(soroushMessage);
-                    LOG.debug("event data is: {}", data);
-                    // if autoDownload is true, download the resource if provided in the message
-                    if (endpoint.isAutoDownload()) {
-                        endpoint.handleDownloadFiles(soroushMessage);
-                    }
-                    //let each subclass decide how to start processing of each exchange
-                    sendExchange(exchange);
-                } catch (Exception ex) {
-                    getExceptionHandler().handleException(ex);
-                }
-            }
-
-            @Override
-            public void onFinishProcess() {
-                LOG.info("max connection retry reached! we are closing the endpoint!");
-            }
-        };
-        connection.connect();
-        endpoint.getCamelContext().getExecutorServiceManager().newSingleThreadScheduledExecutor(this, "health check")
-                .scheduleAtFixedRate(() -> {
-                    if (lastMessageReceived < System.currentTimeMillis() - endpoint.getReconnectIdleConnectionTimeout()) {
-                        connection.close();
-                    }
-                }, 2000, endpoint.getReconnectIdleConnectionTimeout(), TimeUnit.MILLISECONDS);
-    }
-
-    @Override
-    public void prepareShutdown(boolean suspendOnly, boolean forced) {
-        if (!suspendOnly) {
-            shutdown = true;
-            connection.close();
-        }
-    }
-}
-
-class ReconnectableEventSourceListener extends EventSourceListener {
-    private boolean manuallyClosed;
-    //private OkHttpClient client;
-    private final int maxConnectionRetry;
-    private int connectionRetry;
-    private Request request;
-    private final EventSource.Factory factory;
-    private EventSource eventSource;
-
-    public ReconnectableEventSourceListener(OkHttpClient client, Request request, int maxConnectionRetry) {
-        //this.client = client;
-        this.maxConnectionRetry = maxConnectionRetry;
-        this.request = request;
-        factory = EventSources.createFactory(client);
-    }
-
-    public void reconnect() {
-        if (!manuallyClosed) {
-            connectionRetry++;
-        } else {
-            manuallyClosed = false;
-        }
-        if (eventSource != null) {
-            eventSource.cancel();
-        }
-        connect();
-    }
-
-    public void connect() {
-
-        if (!onBeforeConnect()) {
-            return;
-        }
-        if (maxConnectionRetry >= connectionRetry || maxConnectionRetry < 0) {
-            eventSource = factory.newEventSource(request, this);
-        } else {
-            onFinishProcess();
-        }
-    }
-
-    public void close() {
-        manuallyClosed = true;
-        eventSource.cancel();
-    }
-
-    public void onFinishProcess() {
-    }
-
-    protected boolean onBeforeConnect() {
-        return true;
-    }
-
-    @Override
-    public void onOpen(EventSource eventSource, Response response) {
-        connectionRetry = 0;
-    }
-
-    @Override
-    public final void onClosed(EventSource eventSource) {
-        if (handleClose(eventSource, manuallyClosed)) {
-            reconnect();
-        }
-    }
-
-    protected boolean handleClose(EventSource eventSource, boolean manuallyClosed) {
-        return true;
-    }
-
-    @Override
-    public final void onFailure(EventSource eventSource, Throwable t, Response response) {
-        if (handleFailure(eventSource, manuallyClosed, t, response)) {
-            reconnect();
-        }
-    }
-
-    protected boolean handleFailure(EventSource eventSource, boolean manuallyClosed, Throwable t, Response response) {
-        return true;
-    }
-
-    public int getConnectionRetry() {
-        return connectionRetry;
-    }
-}
diff --git a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotComponent.java b/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotComponent.java
deleted file mode 100644
index 2fdadad..0000000
--- a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotComponent.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * 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.soroushbot.component;
-
-import java.util.Map;
-
-import org.apache.camel.Endpoint;
-import org.apache.camel.spi.Metadata;
-import org.apache.camel.spi.annotations.Component;
-import org.apache.camel.support.DefaultComponent;
-
-/**
- * The Soroush Component provides access to Soroush IM App.
- */
-@Component("soroush")
-public class SoroushBotComponent extends DefaultComponent {
-
-    @Metadata(label = "global",
-              description = "The default Soroush authorization token to be used when the information is not provided in the endpoints.")
-    private String authorizationToken;
-
-    @Override
-    protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
-        SoroushBotEndpoint endpoint = new SoroushBotEndpoint(uri, this);
-        setProperties(endpoint, parameters);
-        endpoint.updatePathConfiguration(remaining, authorizationToken, uri);
-        endpoint.normalizeConfiguration();
-        return endpoint;
-    }
-
-    public String getAuthorizationToken() {
-        return authorizationToken;
-    }
-
-    public void setAuthorizationToken(String authorizationToken) {
-        this.authorizationToken = authorizationToken;
-    }
-
-}
diff --git a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotDownloadFileProducer.java b/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotDownloadFileProducer.java
deleted file mode 100644
index 4f99b2e..0000000
--- a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotDownloadFileProducer.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * 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.soroushbot.component;
-
-import org.apache.camel.Exchange;
-import org.apache.camel.component.soroushbot.models.SoroushAction;
-import org.apache.camel.component.soroushbot.models.SoroushMessage;
-import org.apache.camel.support.DefaultProducer;
-
-/**
- * this producer is responsible for uri of type {@link SoroushAction#downloadFile} e.g. "soroush:downloadFile/[token]"
- * if you pass a message to this endpoint, it tries to download the resource ({@link SoroushMessage#fileUrl} and
- * {@link SoroushMessage#thumbnailUrl}) if provided and store them in {@link SoroushMessage#file} or
- * {@link SoroushMessage#thumbnail}.
- */
-public class SoroushBotDownloadFileProducer extends DefaultProducer {
-    SoroushBotEndpoint endpoint;
-
-    public SoroushBotDownloadFileProducer(SoroushBotEndpoint endpoint) {
-        super(endpoint);
-        this.endpoint = endpoint;
-    }
-
-    @Override
-    public void process(Exchange exchange) throws Exception {
-        SoroushMessage body = exchange.getIn().getBody(SoroushMessage.class);
-        endpoint.handleDownloadFiles(body);
-    }
-}
diff --git a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotEndpoint.java b/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotEndpoint.java
deleted file mode 100644
index af3cd4b..0000000
--- a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotEndpoint.java
+++ /dev/null
@@ -1,651 +0,0 @@
-/*
- * 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.soroushbot.component;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Collectors;
-
-import javax.ws.rs.ProcessingException;
-import javax.ws.rs.client.Entity;
-import javax.ws.rs.client.WebTarget;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-import org.apache.camel.Category;
-import org.apache.camel.Consumer;
-import org.apache.camel.Processor;
-import org.apache.camel.Producer;
-import org.apache.camel.component.soroushbot.models.SoroushAction;
-import org.apache.camel.component.soroushbot.models.SoroushMessage;
-import org.apache.camel.component.soroushbot.models.response.UploadFileResponse;
-import org.apache.camel.component.soroushbot.service.SoroushService;
-import org.apache.camel.component.soroushbot.utils.ExponentialBackOffStrategy;
-import org.apache.camel.component.soroushbot.utils.FixedBackOffStrategy;
-import org.apache.camel.component.soroushbot.utils.LinearBackOffStrategy;
-import org.apache.camel.component.soroushbot.utils.MaximumConnectionRetryReachedException;
-import org.apache.camel.component.soroushbot.utils.SoroushException;
-import org.apache.camel.component.soroushbot.utils.StringUtils;
-import org.apache.camel.spi.Metadata;
-import org.apache.camel.spi.UriEndpoint;
-import org.apache.camel.spi.UriParam;
-import org.apache.camel.spi.UriPath;
-import org.apache.camel.support.DefaultEndpoint;
-import org.apache.camel.support.task.BlockingTask;
-import org.apache.camel.support.task.Tasks;
-import org.apache.camel.support.task.budget.Budgets;
-import org.apache.camel.support.task.budget.backoff.BackOffStrategy;
-import org.glassfish.jersey.media.multipart.MultiPart;
-import org.glassfish.jersey.media.multipart.file.StreamDataBodyPart;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Send and receive messages as a Soroush chat bot.
- */
-@UriEndpoint(firstVersion = "3.0", scheme = "soroush", title = "Soroush", syntax = "soroush:action",
-             category = { Category.CHAT })
-public class SoroushBotEndpoint extends DefaultEndpoint {
-
-    private static final Logger LOG = LoggerFactory.getLogger(SoroushBotEndpoint.class);
-
-    @UriPath(name = "action", description = "The action to do.")
-    @Metadata(required = true)
-    private SoroushAction action;
-    @UriParam(label = "security", description = "The authorization token for using"
-                                                + " the bot. if uri path does not contain authorization token, this token will be used.",
-              secret = true)
-    private String authorizationToken;
-    @UriParam(label = "common", description = "Connection timeout in ms when connecting to soroush API", defaultValue = "30000")
-    private int connectionTimeout = 30000;
-    @UriParam(label = "common",
-              description = "Maximum connection retry when fail to connect to soroush API, if the quota is reached,"
-                            + " `MaximumConnectionRetryReachedException` is thrown for that message.",
-              defaultValue = "4")
-    private int maxConnectionRetry = 4;
-    @UriParam(label = "consumer", description = "Number of Thread created by consumer in the route."
-                                                + " if you use this method for parallelism, it is guaranteed that messages from same user always execute in the same"
-                                                + " thread and therefore messages from the same user are processed sequentially",
-              defaultValue = "1",
-              defaultValueNote = "using SoroushBotSingleThreadConsumer")
-    private int concurrentConsumers = 1;
-    @UriParam(label = "consumer", description = "Maximum capacity of each queue when `concurrentConsumers` is greater than 1."
-                                                + " if a queue become full, every message that should go to that queue will be dropped. If `bridgeErrorHandler`"
-                                                + " is set to `true`, an exchange with `CongestionException` is directed to ErrorHandler. You can then processed the"
-                                                + " error using `onException(CongestionException.class)` route",
-              defaultValue = "0", defaultValueNote = "infinite capacity")
-    private int queueCapacityPerThread;
-    @UriParam(label = "producer",
-              description = "Automatically upload attachments when a message goes to the sendMessage endpoint "
-                            + "and the `SoroushMessage.file` (`SoroushMessage.thumbnail`) has been set and `SoroushMessage.fileUrl`(`SoroushMessage.thumbnailUrl`) is null",
-              defaultValue = "true")
-    private boolean autoUploadFile = true;
-    @UriParam(label = "producer",
-              description = "Force to  upload `SoroushMessage.file`(`SoroushMessage.thumbnail`) if exists, even if the "
-                            + "`SoroushMessage.fileUrl`(`SoroushMessage.thumbnailUrl`) is not null in the message",
-              defaultValue = "false")
-    private boolean forceUpload;
-    @UriParam(label = "producer",
-              description = "If true, when downloading an attached file, thumbnail will be downloaded if provided in the message."
-                            + " Otherwise, only the file will be downloaded ",
-              defaultValue = "true")
-    private boolean downloadThumbnail = true;
-    @UriParam(label = "producer", description = "Force to download `SoroushMessage.fileUrl`(`SoroushMessage.thumbnailUrl`)"
-                                                + " if exists, even if the `SoroushMessage.file`(`SoroushMessage.thumbnail`) was not null in that message",
-              defaultValue = "false")
-    private boolean forceDownload;
-    @UriParam(label = "producer",
-              description = "Automatically download `SoroushMessage.fileUrl` and `SoroushMessage.thumbnailUrl` "
-                            + "if exists for the message and store them in `SoroushMessage.file` and `SoroushMessage.thumbnail` field ",
-              defaultValue = "false")
-    private boolean autoDownload;
-    @UriParam(label = "scheduling", description = "Waiting time before retry failed request (Millisecond)."
-                                                  + " If backOffStrategy is not Fixed this is the based value for computing back off waiting time."
-                                                  + " the first retry is always happen immediately after failure and retryWaitingTime do not apply to the first retry.",
-              defaultValue = "1000")
-    private long retryWaitingTime = 1000L;
-    @UriParam(label = "scheduling",
-              description = "The strategy to backoff in case of connection failure. Currently 3 strategies are supported:"
-                            + " 1. `Exponential` (default): It multiply `retryWaitingTime` by `retryExponentialCoefficient` after each connection failure."
-                            + " 2. `Linear`: It increase `retryWaitingTime` by `retryLinearIncrement` after each connection failure."
-                            + " 3. `Fixed`: Always use `retryWaitingTime` as the time between retries.",
-              defaultValue = "Exponential")
-    private String backOffStrategy = "Exponential";
-    @UriParam(label = "scheduling",
-              description = "Coefficient to compute back off time when using `Exponential` Back Off strategy",
-              defaultValue = "2")
-    private long retryExponentialCoefficient = 2L;
-    @UriParam(label = "scheduling",
-              description = "The amount of time (in millisecond) which adds to waiting time when using `Linear` back off strategy",
-              defaultValue = "10000", javaType = "java.time.Duration")
-    private long retryLinearIncrement = 10000L;
-    @UriParam(label = "scheduling",
-              description = "Maximum amount of time (in millisecond) a thread wait before retrying failed request.",
-              defaultValue = "3600000", javaType = "java.time.Duration")
-    private long maxRetryWaitingTime = 3600000L;
-    @UriParam(label = "scheduling", description = "The timeout in millisecond to reconnect the existing getMessage connection"
-                                                  + " to ensure that the connection is always live and does not dead without notifying the bot. this value should not be changed.",
-              defaultValue = "300000", javaType = "java.time.Duration")
-    private long reconnectIdleConnectionTimeout = 5 * 60 * 1000;
-    /**
-     * lazy instance of {@link WebTarget} to used for uploading file to soroush Server, since the url is always the
-     * same, we reuse this WebTarget for all requests
-     */
-    private volatile WebTarget uploadFileTarget;
-    /**
-     * lazy instance of webTarget to used for send message to soroush Server, since the url is always the same, we reuse
-     * this WebTarget for all requests
-     */
-    private volatile WebTarget sendMessageTarget;
-
-    private BackOffStrategy backOffStrategyHelper;
-
-    class Payload {
-        private final InputStream inputStream;
-        private final SoroushMessage message;
-        private final String fileType;
-        private UploadFileResponse response;
-        private Exception exception;
-
-        public Payload(InputStream inputStream, SoroushMessage message, String fileType) {
-            this.inputStream = inputStream;
-            this.message = message;
-            this.fileType = fileType;
-        }
-    }
-
-    public SoroushBotEndpoint(String endpointUri, SoroushBotComponent component) {
-        super(endpointUri, component);
-    }
-
-    /**
-     * @return supported Soroush endpoint as string to display in error.
-     */
-    private String getSupportedEndpointAsString() {
-        return "[" + String.join(", ", getSupportedEndpoint().stream().map(SoroushAction::value).collect(Collectors.toList()))
-               + "]";
-    }
-
-    /**
-     * @return supported Soroush endpoint by this component which is all Soroush Bot API
-     */
-    private List<SoroushAction> getSupportedEndpoint() {
-        return Arrays.asList(SoroushAction.values());
-    }
-
-    /**
-     * Sets the remaining configuration parameters available in the URI.
-     *
-     * @param remaining                 the URI part after the scheme
-     * @param defaultAuthorizationToken the default authorization token to use if not present in the URI
-     * @param uri                       full uri
-     */
-    void updatePathConfiguration(String remaining, String defaultAuthorizationToken, String uri) {
-        List<String> pathParts;
-        if (remaining == null) {
-            throw new IllegalArgumentException(
-                    "Unexpected URI format. Expected soroush://" + getSupportedEndpointAsString()
-                                               + "[/<authorizationToken>][?options]', found " + uri);
-        }
-        pathParts = Arrays.asList(remaining.split("/"));
-        for (int i = pathParts.size() - 1; i >= 0; i--) {
-            if (pathParts.get(i).trim().isEmpty()) {
-                pathParts.remove(i);
-            }
-        }
-
-        if (pathParts.size() > 2 || pathParts.isEmpty()) {
-            throw new IllegalArgumentException(
-                    "Unexpected URI format. Expected soroush://" + getSupportedEndpointAsString()
-                                               + "[/<authorizationToken>][?options]', found " + uri);
-        }
-        for (SoroushAction supported : getSupportedEndpoint()) {
-            if (supported.value().equals(pathParts.get(0))) {
-                action = supported;
-            }
-        }
-        if (action == null) {
-            throw new IllegalArgumentException(
-                    "Unexpected URI format. Expected soroush://" + getSupportedEndpointAsString()
-                                               + "[/<authorizationToken>][?options]', found " + uri);
-        }
-        if (this.authorizationToken == null) {
-            String authorizationToken = defaultAuthorizationToken;
-            if (pathParts.size() > 1) {
-                authorizationToken = pathParts.get(1);
-            }
-            this.authorizationToken = authorizationToken;
-        }
-        if (authorizationToken == null || authorizationToken.trim().isEmpty()) {
-            throw new IllegalArgumentException("The authorization token must be provided and cannot be empty");
-        }
-    }
-
-    /**
-     * check and fix invalid value in uri parameter.
-     */
-    void normalizeConfiguration() {
-        if (reconnectIdleConnectionTimeout <= 0) {
-            reconnectIdleConnectionTimeout = 5 * 60 * 1000;
-        }
-        connectionTimeout = Math.max(0, connectionTimeout);
-        maxConnectionRetry = Math.max(0, maxConnectionRetry);
-        retryExponentialCoefficient = Math.max(1, retryExponentialCoefficient);
-        retryLinearIncrement = Math.max(0, retryLinearIncrement);
-
-        if (backOffStrategy.equalsIgnoreCase("fixed")) {
-            backOffStrategyHelper = new FixedBackOffStrategy(retryWaitingTime, maxRetryWaitingTime);
-        } else if (backOffStrategy.equalsIgnoreCase("linear")) {
-            backOffStrategyHelper = new LinearBackOffStrategy(retryWaitingTime, retryLinearIncrement);
-        } else {
-            backOffStrategyHelper
-                    = new ExponentialBackOffStrategy(retryWaitingTime, retryExponentialCoefficient);
-        }
-    }
-
-    /**
-     * create producer based on uri {@link SoroushAction}
-     *
-     * @return created producer
-     */
-    @Override
-    public Producer createProducer() {
-        if (action == SoroushAction.sendMessage) {
-            return new SoroushBotSendMessageProducer(this);
-        }
-        if (action == SoroushAction.uploadFile) {
-            return new SoroushBotUploadFileProducer(this);
-        }
-        if (action == SoroushAction.downloadFile) {
-            return new SoroushBotDownloadFileProducer(this);
-        } else {
-            throw new IllegalArgumentException(
-                    "only [" + SoroushAction.sendMessage + ", " + SoroushAction.downloadFile + ", " + SoroushAction.uploadFile
-                                               + "] supported for producer(from) and process");
-        }
-    }
-
-    /**
-     * create consumer based on concurrentConsumers value, if concurrentConsumers is greater than 1, we use
-     * {@link SoroushBotMultiThreadConsumer} that use a thread pool in order to process exchanges. the consumer use
-     * multiple queue to ensure that every message from a same user goes to the same thread and therefore every message
-     * from the same user will be processed in the order of arrival time.
-     * <p>
-     * if concurrentConsumers is lower than 2 then we use {@link SoroushBotSingleThreadConsumer} that process all
-     * received message in the order of their arrival time.
-     *
-     * @param  processor processor
-     * @return           consumer
-     */
-    @Override
-    public Consumer createConsumer(Processor processor) throws Exception {
-        Consumer consumer;
-        if (action != SoroushAction.getMessage) {
-            throw new IllegalArgumentException("only " + SoroushAction.getMessage + " support for consumer(from)");
-        }
-        if (concurrentConsumers < 2) {
-            consumer = new SoroushBotSingleThreadConsumer(this, processor);
-            return consumer;
-        } else {
-            consumer = new SoroushBotMultiThreadConsumer(this, processor);
-        }
-        //configure consumer using method available by DefaultConsumer
-        configureConsumer(consumer);
-        return consumer;
-    }
-
-    /**
-     * create a {@link WebTarget} that could be used to download file from soroush based on
-     * {@link SoroushBotEndpoint#authorizationToken}, {@link SoroushBotEndpoint#connectionTimeout} and {@code fileUrl}
-     * (fileId)
-     *
-     * @param  fileUrl fileId to download
-     * @return         WebTarget
-     */
-    private WebTarget getDownloadFileTarget(String fileUrl) {
-        return SoroushService.get().createDownloadFileTarget(authorizationToken, fileUrl, connectionTimeout);
-    }
-
-    /**
-     * return the lazily created instance of {@link SoroushBotEndpoint#uploadFileTarget} to used for uploading file to
-     * soroush.
-     */
-    private WebTarget getUploadFileTarget() {
-        WebTarget result = uploadFileTarget;
-        if (result == null) {
-            synchronized (this) {
-                result = uploadFileTarget;
-                if (result == null) {
-                    result = SoroushService.get().createUploadFileTarget(authorizationToken, connectionTimeout);
-                    uploadFileTarget = result;
-                }
-            }
-        }
-        return result;
-    }
-
-    /**
-     * return the lazily created instance of {@link SoroushBotEndpoint#sendMessageTarget} to used for sending message to
-     * soroush.
-     */
-    WebTarget getSendMessageTarget() {
-        WebTarget result = sendMessageTarget;
-        if (result == null) {
-            synchronized (this) {
-                result = sendMessageTarget;
-                if (result == null) {
-                    result = SoroushService.get().createSendMessageTarget(authorizationToken, connectionTimeout);
-                    sendMessageTarget = result;
-                }
-            }
-        }
-        return result;
-    }
-
-    public SoroushAction getAction() {
-        return action;
-    }
-
-    public void setAction(SoroushAction action) {
-        this.action = action;
-    }
-
-    public String getAuthorizationToken() {
-        return authorizationToken;
-    }
-
-    public void setAuthorizationToken(String authorizationToken) {
-        this.authorizationToken = authorizationToken;
-    }
-
-    public int getConnectionTimeout() {
-        return connectionTimeout;
-    }
-
-    public void setConnectionTimeout(int connectionTimeout) {
-        this.connectionTimeout = connectionTimeout;
-    }
-
-    public int getMaxConnectionRetry() {
-        return maxConnectionRetry;
-    }
-
-    public void setMaxConnectionRetry(int maxConnectionRetry) {
-        this.maxConnectionRetry = maxConnectionRetry;
-    }
-
-    public int getConcurrentConsumers() {
-        return concurrentConsumers;
-    }
-
-    public void setConcurrentConsumers(int concurrentConsumers) {
-        this.concurrentConsumers = concurrentConsumers;
-    }
-
-    public int getQueueCapacityPerThread() {
-        return queueCapacityPerThread;
-    }
-
-    public void setQueueCapacityPerThread(int queueCapacityPerThread) {
-        this.queueCapacityPerThread = queueCapacityPerThread;
-    }
-
-    public boolean isAutoUploadFile() {
-        return autoUploadFile;
-    }
-
-    public void setAutoUploadFile(boolean autoUploadFile) {
-        this.autoUploadFile = autoUploadFile;
-    }
-
-    public boolean isForceUpload() {
-        return forceUpload;
-    }
-
-    public void setForceUpload(boolean forceUpload) {
-        this.forceUpload = forceUpload;
-    }
-
-    public boolean isDownloadThumbnail() {
-        return downloadThumbnail;
-    }
-
-    public void setDownloadThumbnail(boolean downloadThumbnail) {
-        this.downloadThumbnail = downloadThumbnail;
-    }
-
-    public boolean isForceDownload() {
-        return forceDownload;
-    }
-
-    public void setForceDownload(boolean forceDownload) {
-        this.forceDownload = forceDownload;
-    }
-
-    public boolean isAutoDownload() {
-        return autoDownload;
-    }
-
-    public void setAutoDownload(boolean autoDownload) {
-        this.autoDownload = autoDownload;
-    }
-
-    public long getRetryWaitingTime() {
-        return retryWaitingTime;
-    }
-
-    public void setRetryWaitingTime(long retryWaitingTime) {
-        this.retryWaitingTime = retryWaitingTime;
-    }
-
-    public String getBackOffStrategy() {
-        return backOffStrategy;
-    }
-
-    public void setBackOffStrategy(String backOffStrategy) {
-        this.backOffStrategy = backOffStrategy;
-    }
-
-    public long getRetryExponentialCoefficient() {
-        return retryExponentialCoefficient;
-    }
-
-    public void setRetryExponentialCoefficient(long retryExponentialCoefficient) {
-        this.retryExponentialCoefficient = retryExponentialCoefficient;
-    }
-
-    public long getRetryLinearIncrement() {
-        return retryLinearIncrement;
-    }
-
-    public void setRetryLinearIncrement(long retryLinearIncrement) {
-        this.retryLinearIncrement = retryLinearIncrement;
-    }
-
-    public long getMaxRetryWaitingTime() {
-        return maxRetryWaitingTime;
-    }
-
-    public void setMaxRetryWaitingTime(long maxRetryWaitingTime) {
-        this.maxRetryWaitingTime = maxRetryWaitingTime;
-    }
-
-    public long getReconnectIdleConnectionTimeout() {
-        return reconnectIdleConnectionTimeout;
-    }
-
-    public void setReconnectIdleConnectionTimeout(long reconnectIdleConnectionTimeout) {
-        this.reconnectIdleConnectionTimeout = reconnectIdleConnectionTimeout;
-    }
-
-    public void setUploadFileTarget(WebTarget uploadFileTarget) {
-        this.uploadFileTarget = uploadFileTarget;
-    }
-
-    public void setSendMessageTarget(WebTarget sendMessageTarget) {
-        this.sendMessageTarget = sendMessageTarget;
-    }
-
-    public BackOffStrategy getBackOffStrategyHelper() {
-        return backOffStrategyHelper;
-    }
-
-    public void setBackOffStrategyHelper(BackOffStrategy backOffStrategyHelper) {
-        this.backOffStrategyHelper = backOffStrategyHelper;
-    }
-
-    /**
-     * try to upload an inputStream to server
-     */
-    private UploadFileResponse uploadToServer(InputStream inputStream, SoroushMessage message, String fileType) {
-        Payload payload = new Payload(inputStream, message, fileType);
-
-        BlockingTask task = Tasks.foregroundTask().withBudget(
-                Budgets.iterationBudget()
-                        .withMaxIterations(maxConnectionRetry)
-                        .withBackOffStrategy(backOffStrategyHelper)
-                        .build())
-                .withName("upload-to-server")
-                .build();
-
-        if (!task.run(this::doUploadToServer, payload)) {
-            LOG.error("Exhausted all retries trying to upload data");
-            throw new MaximumConnectionRetryReachedException(
-                    "Uploading " + fileType + " for message " + message + " failed. Maximum retry limit reached! aborting "
-                                                             + "upload file and send message",
-                    payload.exception, message);
-        }
-
-        return payload.response;
-
-    }
-
-    private boolean doUploadToServer(Payload payload) {
-        try (MultiPart multipart = new MultiPart()) {
-            multipart.setMediaType(MediaType.MULTIPART_FORM_DATA_TYPE);
-            multipart.bodyPart(new StreamDataBodyPart(
-                    "file", payload.inputStream, null,
-                    MediaType.APPLICATION_OCTET_STREAM_TYPE));
-
-            if (LOG.isDebugEnabled()) {
-                LOG.debug("Trying to upload {} for message: {}", payload.fileType, payload.message);
-            }
-
-            javax.ws.rs.core.Response response = getUploadFileTarget().request(MediaType.APPLICATION_JSON_TYPE)
-                    .post(Entity.entity(multipart, multipart.getMediaType()));
-            payload.response = SoroushService.get().assertSuccessful(response, UploadFileResponse.class, payload.message);
-            return true;
-        } catch (IOException | ProcessingException | SoroushException ex) {
-            payload.exception = ex;
-        }
-        return false;
-    }
-
-    /**
-     * check if {@link SoroushMessage#file} or {@link SoroushMessage#thumbnail} is populated and upload them to the
-     * server. after that it set {@link SoroushMessage#fileUrl} and {@link SoroushMessage#thumbnailUrl} to appropriate
-     * value
-     *
-     * @throws SoroushException if soroush reject the file
-     */
-    void handleFileUpload(SoroushMessage message) {
-        LOG.trace("try to upload file(s) to server if exists for message: {}", message);
-
-        InputStream file = message.getFile();
-        if (file != null && (message.getFileUrl() == null || forceUpload)) {
-            LOG.debug("uploading file to server for message: {}", message);
-
-            UploadFileResponse response = uploadToServer(file, message, "file");
-            message.setFileUrl(response.getFileUrl());
-            LOG.debug("uploaded file url is: {} for message: {}", response.getFileUrl(), message);
-        }
-        InputStream thumbnail = message.getThumbnail();
-        if (thumbnail != null && message.getThumbnailUrl() == null) {
-            LOG.debug("uploading thumbnail to server for message: {}", message);
-
-            UploadFileResponse response = uploadToServer(thumbnail, message, "thumbnail");
-            message.setThumbnailUrl(response.getFileUrl());
-
-            LOG.debug("uploaded thumbnail url is: {} for message: {}", response.getFileUrl(), message);
-        }
-    }
-
-    /**
-     * check whether {@link SoroushMessage#fileUrl}({@link SoroushMessage#thumbnailUrl}) is null or not, and download
-     * the resource if it is not null this function only set {@link SoroushMessage#file} to {@link InputStream} get from
-     * {@link Response#readEntity(Class)} )} and does not store the resource in file.
-     *
-     * @throws SoroushException if the file does not exists on soroush or soroush reject the request
-     */
-    public void handleDownloadFiles(SoroushMessage message) throws SoroushException {
-        if (message.getFileUrl() != null && (message.getFile() == null || forceDownload)) {
-            LOG.debug("downloading file from server for message: {}", message);
-
-            InputStream inputStream = downloadFromServer(message.getFileUrl(), message, "file");
-            message.setFile(inputStream);
-
-            LOG.debug("file successfully downloaded for message: {}", message);
-
-        }
-        if (downloadThumbnail && message.getThumbnailUrl() != null && (message.getThumbnail() == null || forceDownload)) {
-            LOG.debug("downloading thumbnail from server for message: {}", message);
-
-            InputStream inputStream = downloadFromServer(message.getThumbnailUrl(), message, "thumbnail");
-            message.setThumbnail(inputStream);
-
-            LOG.debug("thumbnail successfully downloaded for message: {}", message);
-        }
-    }
-
-    /**
-     * download the resource stored with the key {@code fileUrl} from Soroush Server. other parameters are used only for
-     * logging.
-     *
-     * @throws SoroushException if soroush reject the request
-     */
-    private InputStream downloadFromServer(String fileUrl, SoroushMessage message, String type) throws SoroushException {
-        Response response = null;
-        for (int i = 0; i <= maxConnectionRetry; i++) {
-            WebTarget target = getDownloadFileTarget(fileUrl);
-            if (LOG.isDebugEnabled()) {
-                if (i != 0) {
-                    LOG.debug("retry downloading {}: {} for the {} time", type, fileUrl, StringUtils.ordinal(i));
-                }
-                LOG.debug("try to download {}: {} with url: {}\nfor message: {}", type, fileUrl, target.getUri(), message);
-            }
-            try {
-                response = target.request().get();
-                return SoroushService.get().assertSuccessful(response, InputStream.class, message);
-            } catch (IOException | ProcessingException ex) {
-                if (i == maxConnectionRetry) {
-                    throw new MaximumConnectionRetryReachedException(
-                            "maximum connection retry reached for " + type + ": " + fileUrl, ex, message);
-                }
-
-                LOG.warn("can not download {}: {} from soroush. Response code is {}", type, fileUrl, ex.getMessage());
-
-            }
-        }
-        //should never reach this line
-        LOG.error("should never reach this line. An exception should have been thrown by catch block for target.request().get");
-        throw new MaximumConnectionRetryReachedException(
-                "can not upload " + type + ": " + fileUrl + " response:" + ((response == null) ? null : response.getStatus()),
-                message);
-    }
-}
diff --git a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotMultiThreadConsumer.java b/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotMultiThreadConsumer.java
deleted file mode 100644
index 4badfee..0000000
--- a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotMultiThreadConsumer.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * 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.soroushbot.component;
-
-import org.apache.camel.Exchange;
-import org.apache.camel.Processor;
-import org.apache.camel.component.soroushbot.models.SoroushMessage;
-import org.apache.camel.component.soroushbot.utils.CongestionException;
-import org.apache.camel.component.soroushbot.utils.MultiQueueWithTopicThreadPool;
-
-/**
- * create a thread pool and process each message using one of threads, it is guaranteed that all message from a same
- * person will processed by the same thread. thread pool size could be configured using
- * {@link SoroushBotEndpoint#getConcurrentConsumers()} this consumer support both Sync and Async processors.
- */
-//CHECKSTYLE:OFF
-public class SoroushBotMultiThreadConsumer extends SoroushBotAbstractConsumer {
-
-    /**
-     * Since we want that every message from the same user to be processed one by one,
-     * i.e. no 2 message from the same user execute concurrently,
-     * we create a new simple thread pool that let us select a thread by a topic.
-     * It guarantees that all tasks with the same topic execute in the same thread.
-     * We use userIds as the topic of each task.
-     */
-    MultiQueueWithTopicThreadPool threadPool;
-
-    public SoroushBotMultiThreadConsumer(SoroushBotEndpoint endpoint, Processor processor) {
-        super(endpoint, processor);
-        threadPool = new MultiQueueWithTopicThreadPool(endpoint.getConcurrentConsumers(), endpoint.getQueueCapacityPerThread(), "Soroush Thread");
-    }
-
-    @Override
-    protected void sendExchange(Exchange exchange) {
-        try {
-            threadPool.execute(exchange.getIn().getBody(SoroushMessage.class).getFrom(), () -> {
-                try {
-                    getProcessor().process(exchange);
-                } catch (Exception e) {
-                    exchange.setException(e);
-                }
-                if (exchange.getException() != null) {
-                    getExceptionHandler().handleException("Error processing exchange",
-                            exchange, exchange.getException());
-                }
-                releaseExchange(exchange, false);
-            });
-        } catch (IllegalStateException ex) {
-            throw new CongestionException(ex, exchange.getIn().getBody(SoroushMessage.class));
-        }
-
-    }
-}
diff --git a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotSendMessageProducer.java b/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotSendMessageProducer.java
deleted file mode 100644
index 05b1c23..0000000
--- a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotSendMessageProducer.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * 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.soroushbot.component;
-
-import java.io.IOException;
-
-import javax.ws.rs.ProcessingException;
-import javax.ws.rs.client.Entity;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import org.apache.camel.Exchange;
-import org.apache.camel.component.soroushbot.models.SoroushAction;
-import org.apache.camel.component.soroushbot.models.SoroushMessage;
-import org.apache.camel.component.soroushbot.service.SoroushService;
-import org.apache.camel.component.soroushbot.utils.MaximumConnectionRetryReachedException;
-import org.apache.camel.component.soroushbot.utils.SoroushException;
-import org.apache.camel.support.DefaultProducer;
-import org.apache.camel.support.task.BlockingTask;
-import org.apache.camel.support.task.Tasks;
-import org.apache.camel.support.task.budget.Budgets;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * this Producer is responsible for URIs of type {@link SoroushAction#sendMessage} to send message to SoroushAPI. it
- * will be instantiated for URIs like "soroush:sendMessage/[token]
- */
-public class SoroushBotSendMessageProducer extends DefaultProducer {
-
-    private static final Logger LOG = LoggerFactory.getLogger(SoroushBotSendMessageProducer.class);
-    SoroushBotEndpoint endpoint;
-    ObjectMapper objectMapper = new ObjectMapper();
-
-    private static class SoroushMessagePayload {
-        final SoroushMessage message;
-        Exception exception;
-
-        public SoroushMessagePayload(SoroushMessage message) {
-            this.message = message;
-        }
-    }
-
-    public SoroushBotSendMessageProducer(SoroushBotEndpoint endpoint) {
-        super(endpoint);
-        this.endpoint = endpoint;
-    }
-
-    @Override
-    public void process(Exchange exchange) throws Exception {
-        SoroushMessage message = exchange.getIn().getBody(SoroushMessage.class);
-        // if autoUploadFile is true try to upload files inside the message
-        if (endpoint.isAutoDownload()) {
-            endpoint.handleFileUpload(message);
-        }
-        sendMessage(message);
-    }
-
-    private boolean doSendMessage(SoroushMessagePayload payload) {
-        try {
-            Response response = endpoint.getSendMessageTarget().request(MediaType.APPLICATION_JSON_TYPE)
-                    .post(Entity.entity(objectMapper.writeValueAsString(payload.message), MediaType.APPLICATION_JSON_TYPE));
-            SoroushService.get().assertSuccessful(response, payload.message);
-
-            return true;
-        } catch (SoroushException | IOException | ProcessingException e) {
-            LOG.warn("failed to send message: {}", payload.message, e);
-
-            payload.exception = e;
-        }
-
-        return false;
-    }
-
-    /**
-     * @throws MaximumConnectionRetryReachedException if can not connect to soroush after retry
-     *                                                {@link SoroushBotEndpoint#getMaxConnectionRetry()} times
-     * @throws SoroushException                       if soroush response code wasn't 200
-     */
-    private void sendMessage(SoroushMessage message) throws MaximumConnectionRetryReachedException {
-
-        BlockingTask task = Tasks.foregroundTask()
-                .withBudget(Budgets.iterationBudget()
-                        .withMaxIterations(endpoint.getMaxConnectionRetry() + 1)
-                        .withBackOffStrategy(endpoint.getBackOffStrategyHelper())
-                        .build())
-                .withName("send-message")
-                .build();
-
-        SoroushMessagePayload payload = new SoroushMessagePayload(message);
-
-        if (!task.run(this::doSendMessage, payload)) {
-            if (payload.exception != null) {
-                throw new MaximumConnectionRetryReachedException(
-                        "Failed to send message. maximum retry limit reached. aborting... message: "
-                                                                 + message,
-                        payload.exception, message);
-            }
-        }
-    }
-
-}
diff --git a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotSingleThreadConsumer.java b/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotSingleThreadConsumer.java
deleted file mode 100644
index 1ed907c..0000000
--- a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotSingleThreadConsumer.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * 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.soroushbot.component;
-
-import org.apache.camel.Exchange;
-import org.apache.camel.Processor;
-
-/**
- * The SoroushBot consumer. if concurrentConsumer set to 1, this Consumer will be Instantiated every message will be
- * processed in order of their arrival time this consumer support both Sync and Async processors.
- */
-
-//CHECKSTYLE:OFF
-public class SoroushBotSingleThreadConsumer extends SoroushBotAbstractConsumer {
-
-    public SoroushBotSingleThreadConsumer(SoroushBotEndpoint endpoint, Processor processor) {
-        super(endpoint, processor);
-    }
-
-    @Override
-    protected void sendExchange(Exchange exchange) {
-        try {
-            getProcessor().process(exchange);
-        } catch (Exception e) {
-            exchange.setException(e);
-        }
-        if (exchange.getException() != null) {
-            getExceptionHandler().handleException("Error processing exchange",
-                    exchange, exchange.getException());
-        }
-        releaseExchange(exchange, false);
-    }
-}
diff --git a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotUploadFileProducer.java b/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotUploadFileProducer.java
deleted file mode 100644
index ba031fd..0000000
--- a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotUploadFileProducer.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * 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.soroushbot.component;
-
-import org.apache.camel.Exchange;
-import org.apache.camel.component.soroushbot.models.SoroushAction;
-import org.apache.camel.component.soroushbot.models.SoroushMessage;
-import org.apache.camel.support.DefaultProducer;
-
-/**
- * this Producer is responsible for URIs of type {@link SoroushAction#uploadFile} to upload messages file(thumbnail) to
- * SoroushAPI. it will be instantiated for URIs like "soroush:uploadFile/[token]
- */
-public class SoroushBotUploadFileProducer extends DefaultProducer {
-    SoroushBotEndpoint endpoint;
-
-    public SoroushBotUploadFileProducer(SoroushBotEndpoint endpoint) {
-        super(endpoint);
-        this.endpoint = endpoint;
-    }
-
-    @Override
-    public void process(Exchange exchange) throws Exception {
-        SoroushMessage message = exchange.getIn().getBody(SoroushMessage.class);
-        endpoint.handleFileUpload(message);
-    }
-}
diff --git a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/models/CustomKey.java b/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/models/CustomKey.java
deleted file mode 100644
index 2091306..0000000
--- a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/models/CustomKey.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * 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.soroushbot.models;
-
-import java.util.Objects;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class CustomKey {
-
-    private String command;
-    private String text;
-
-    public String getCommand() {
-        return command;
-    }
-
-    public void setCommand(String command) {
-        this.command = command;
-    }
-
-    public String getText() {
-        return text;
-    }
-
-    public void setText(String text) {
-        this.text = text;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof CustomKey)) {
-            return false;
-        }
-        CustomKey customKey = (CustomKey) o;
-        return Objects.equals(getCommand(), customKey.getCommand())
-                && Objects.equals(getText(), customKey.getText());
-    }
-
-    @Override
-    public int hashCode() {
-
-        return Objects.hash(getCommand(), getText());
-    }
-}
diff --git a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/models/FileType.java b/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/models/FileType.java
deleted file mode 100644
index ff3612b..0000000
--- a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/models/FileType.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * 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.soroushbot.models;
-
-public enum FileType {
-    IMAGE,
-    VIDEO,
-    GIF,
-    PUSH_TO_TALK,
-    CONTACT,
-    ATTACHMENT
-}
diff --git a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/models/MinorType.java b/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/models/MinorType.java
deleted file mode 100644
index 0a30187..0000000
--- a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/models/MinorType.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * 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.soroushbot.models;
-
-public enum MinorType {
-    TEXT,
-    FILE,
-    LOCATION,
-    INFORMATION,
-    START,
-    STOP,
-    SELF_SEEN,
-    CHANGE
-}
diff --git a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/models/SoroushAction.java b/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/models/SoroushAction.java
deleted file mode 100644
index ae9405a..0000000
--- a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/models/SoroushAction.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * 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.soroushbot.models;
-
-public enum SoroushAction {
-    sendMessage("sendMessage"),
-    getMessage("getMessage"),
-    uploadFile("uploadFile"),
-    downloadFile("downloadFile");
-
-    private final String value;
-
-    SoroushAction(String value) {
-        this.value = value;
-    }
-
-    public final String value() {
-        return this.value;
-    }
-}
diff --git a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/models/SoroushMessage.java b/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/models/SoroushMessage.java
deleted file mode 100644
index 9d397e9..0000000
--- a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/models/SoroushMessage.java
+++ /dev/null
@@ -1,412 +0,0 @@
-/*
- * 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.soroushbot.models;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-import java.util.stream.Collectors;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import org.apache.camel.component.soroushbot.component.SoroushBotEndpoint;
-
-@JsonInclude(JsonInclude.Include.NON_NULL)
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class SoroushMessage implements Cloneable {
-    private String to;
-    private String from;
-    private String body;
-    private MinorType type;
-    private String time;
-    private String fileName;
-    private FileType fileType;
-    private Double fileSize;
-    private String fileUrl;
-    private String thumbnailUrl;
-    private Double imageWidth;
-    private Double imageHeight;
-    private Double fileDuration;
-    private Double thumbnailWidth;
-    private Double thumbnailHeight;
-    private String nickName;
-    private String avatarUrl;
-    private Double phoneNo;
-    private Double latitude;
-    private Double longitude;
-    private List<List<CustomKey>> keyboard;
-    @JsonIgnore
-    private InputStream file;
-    @JsonIgnore
-    private InputStream thumbnail;
-
-    public SoroushMessage() {
-    }
-
-    public SoroushMessage(String to, String from, String body, MinorType type, String time, String fileName, FileType fileType,
-                          Double fileSize, String fileUrl, String thumbnailUrl,
-                          Double imageWidth, Double imageHeight, Double fileDuration, Double thumbnailWidth,
-                          Double thumbnailHeight, String nickName, String avatarUrl, Double phoneNo,
-                          Double latitude, Double longitude, List<List<CustomKey>> keyboard) {
-        this.to = to;
-        this.from = from;
-        this.body = body;
-        this.type = type;
-        this.time = time;
-        this.fileName = fileName;
-        this.fileType = fileType;
-        this.fileSize = fileSize;
-        this.fileUrl = fileUrl;
-        this.thumbnailUrl = thumbnailUrl;
-        this.imageWidth = imageWidth;
-        this.imageHeight = imageHeight;
-        this.fileDuration = fileDuration;
-        this.thumbnailWidth = thumbnailWidth;
-        this.thumbnailHeight = thumbnailHeight;
-        this.nickName = nickName;
-        this.avatarUrl = avatarUrl;
-        this.phoneNo = phoneNo;
-        this.latitude = latitude;
-        this.longitude = longitude;
-        this.keyboard = keyboard;
-    }
-
-    /**
-     * set uploading file to a file this field help you store file in the message, it also let you automatically upload
-     * it to the soroush server by sending this message to {@code uploadFile} or {@code sendMessage} endpoint. auto
-     * upload file is working in the following condition: for {@code sendMessage} endpoint:
-     * {@link SoroushMessage#file}{@code !=null && }{@link SoroushBotEndpoint#autoUploadFile} {@code  && (}
-     * {@link SoroushMessage#fileUrl}{@code ==null || }{@link SoroushBotEndpoint#forceUpload}{@code )} for
-     * {@code uploadFile} endpoint: {@link SoroushMessage#file}{@code !=null && (}
-     * {@link SoroushMessage#fileUrl}{@code ==null || }{@link SoroushBotEndpoint#forceUpload}{@code )}
-     *
-     * @param  file                  to be uploaded
-     * @throws FileNotFoundException if file not found
-     * @see                          SoroushBotEndpoint#forceUpload
-     * @see                          SoroushBotEndpoint#autoUploadFile
-     */
-    @JsonIgnore
-    public void setFile(File file) throws FileNotFoundException {
-        this.file = new BufferedInputStream(new FileInputStream(file));
-    }
-
-    /**
-     * set uploading thumbnail to a {@code thumbnail} this field help you store thumbnail in the message, it also let
-     * you automatically upload it to the soroush server by sending this message to {@code uploadFile} or
-     * {@code sendMessage} endpoint. auto upload thumbnail is working in the following condition: for
-     * {@code sendMessage} endpoint:
-     * {@link SoroushMessage#thumbnail}{@code !=null && }{@link SoroushBotEndpoint#autoUploadFile} {@code  && (}
-     * {@link SoroushMessage#thumbnailUrl}{@code ==null || }{@link SoroushBotEndpoint#forceUpload}{@code )} for
-     * {@code uploadFile} endpoint: {@link SoroushMessage#thumbnail}{@code !=null && (}
-     * {@link SoroushMessage#thumbnailUrl}{@code ==null || }{@link SoroushBotEndpoint#forceUpload}{@code )}
-     *
-     * @param  thumbnail             to be uploaded
-     * @throws FileNotFoundException if file not found
-     * @see                          SoroushBotEndpoint#forceUpload
-     * @see                          SoroushBotEndpoint#autoUploadFile
-     */
-    @JsonIgnore
-    public void setThumbnail(File thumbnail) throws FileNotFoundException {
-        this.thumbnail = new BufferedInputStream(new FileInputStream(thumbnail));
-    }
-
-    public String getTo() {
-        return to;
-    }
-
-    public void setTo(String to) {
-        this.to = to;
-    }
-
-    public String getFrom() {
-        return from;
-    }
-
-    public void setFrom(String from) {
-        this.from = from;
-    }
-
-    public String getBody() {
-        return body;
-    }
-
-    public void setBody(String body) {
-        this.body = body;
-    }
-
-    public MinorType getType() {
-        return type;
-    }
-
-    public void setType(MinorType type) {
-        this.type = type;
-    }
-
-    public String getTime() {
-        return time;
-    }
-
-    public void setTime(String time) {
-        this.time = time;
-    }
-
-    public String getFileName() {
-        return fileName;
-    }
-
-    public void setFileName(String fileName) {
-        this.fileName = fileName;
-    }
-
-    public FileType getFileType() {
-        return fileType;
-    }
-
-    public void setFileType(FileType fileType) {
-        this.fileType = fileType;
-    }
-
-    public Double getFileSize() {
-        return fileSize;
-    }
-
-    public void setFileSize(Double fileSize) {
-        this.fileSize = fileSize;
-    }
-
-    public String getFileUrl() {
-        return fileUrl;
-    }
-
-    public void setFileUrl(String fileUrl) {
-        this.fileUrl = fileUrl;
-    }
-
-    public String getThumbnailUrl() {
-        return thumbnailUrl;
-    }
-
-    public void setThumbnailUrl(String thumbnailUrl) {
-        this.thumbnailUrl = thumbnailUrl;
-    }
-
-    public Double getImageWidth() {
-        return imageWidth;
-    }
-
-    public void setImageWidth(Double imageWidth) {
-        this.imageWidth = imageWidth;
-    }
-
-    public Double getImageHeight() {
-        return imageHeight;
-    }
-
-    public void setImageHeight(Double imageHeight) {
-        this.imageHeight = imageHeight;
-    }
-
-    public Double getFileDuration() {
-        return fileDuration;
-    }
-
-    public void setFileDuration(Double fileDuration) {
-        this.fileDuration = fileDuration;
-    }
-
-    public Double getThumbnailWidth() {
-        return thumbnailWidth;
-    }
-
-    public void setThumbnailWidth(Double thumbnailWidth) {
-        this.thumbnailWidth = thumbnailWidth;
-    }
-
-    public Double getThumbnailHeight() {
-        return thumbnailHeight;
-    }
-
-    public void setThumbnailHeight(Double thumbnailHeight) {
-        this.thumbnailHeight = thumbnailHeight;
-    }
-
-    public String getNickName() {
-        return nickName;
-    }
-
-    public void setNickName(String nickName) {
-        this.nickName = nickName;
-    }
-
-    public String getAvatarUrl() {
-        return avatarUrl;
-    }
-
-    public void setAvatarUrl(String avatarUrl) {
-        this.avatarUrl = avatarUrl;
-    }
-
-    public Double getPhoneNo() {
-        return phoneNo;
-    }
-
-    public void setPhoneNo(Double phoneNo) {
-        this.phoneNo = phoneNo;
-    }
-
-    public Double getLatitude() {
-        return latitude;
-    }
-
-    public void setLatitude(Double latitude) {
-        this.latitude = latitude;
-    }
-
-    public Double getLongitude() {
-        return longitude;
-    }
-
-    public void setLongitude(Double longitude) {
-        this.longitude = longitude;
-    }
-
-    public List<List<CustomKey>> getKeyboard() {
-        return keyboard;
-    }
-
-    public void setKeyboard(List<List<CustomKey>> keyboard) {
-        this.keyboard = keyboard;
-    }
-
-    public InputStream getFile() {
-        return file;
-    }
-
-    public void setFile(InputStream file) {
-        this.file = file;
-    }
-
-    public InputStream getThumbnail() {
-        return thumbnail;
-    }
-
-    public void setThumbnail(InputStream thumbnail) {
-        this.thumbnail = thumbnail;
-    }
-
-    @Override
-    public String toString() {
-        return "SoroushMessage{"
-               + "to='" + to + '\''
-               + ", from='" + from + '\''
-               + ", body='" + body + '\''
-               + ", type=" + type
-               + ", time='" + time + '\''
-               + ", fileName='" + fileName + '\''
-               + ", fileType=" + fileType
-               + ", fileSize=" + fileSize
-               + ", fileUrl='" + fileUrl + '\''
-               + ", thumbnailUrl='" + thumbnailUrl + '\''
-               + ", imageWidth=" + imageWidth
-               + ", imageHeight=" + imageHeight
-               + ", fileDuration=" + fileDuration
-               + ", thumbnailWidth=" + thumbnailWidth
-               + ", thumbnailHeight=" + thumbnailHeight
-               + ", nickName='" + nickName + '\''
-               + ", avatarUrl='" + avatarUrl + '\''
-               + ", phoneNo=" + phoneNo
-               + ", latitude=" + latitude
-               + ", longitude=" + longitude
-               + ", keyboard=" + keyboard
-               + '}';
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof SoroushMessage)) {
-            return false;
-        }
-        SoroushMessage that = (SoroushMessage) o;
-        return Objects.equals(getTo(), that.getTo())
-                && Objects.equals(getFrom(), that.getFrom())
-                && Objects.equals(getBody(), that.getBody())
-                && getType() == that.getType()
-                && Objects.equals(getTime(), that.getTime())
-                && Objects.equals(getFileName(), that.getFileName())
-                && getFileType() == that.getFileType()
-                && Objects.equals(getFileSize(), that.getFileSize())
-                && Objects.equals(getFileUrl(), that.getFileUrl())
-                && Objects.equals(getThumbnailUrl(), that.getThumbnailUrl())
-                && Objects.equals(getImageWidth(), that.getImageWidth())
-                && Objects.equals(getImageHeight(), that.getImageHeight())
-                && Objects.equals(getFileDuration(), that.getFileDuration())
-                && Objects.equals(getThumbnailWidth(), that.getThumbnailWidth())
-                && Objects.equals(getThumbnailHeight(), that.getThumbnailHeight())
-                && Objects.equals(getNickName(), that.getNickName())
-                && Objects.equals(getAvatarUrl(), that.getAvatarUrl())
-                && Objects.equals(getPhoneNo(), that.getPhoneNo())
-                && Objects.equals(getLatitude(), that.getLatitude())
-                && Objects.equals(getLongitude(), that.getLongitude())
-                && Objects.equals(getKeyboard(), that.getKeyboard());
-    }
-
-    @Override
-    public SoroushMessage clone() throws CloneNotSupportedException {
-        return new SoroushMessage(
-                to,
-                from,
-                body,
-                type,
-                time,
-                fileName,
-                fileType,
-                fileSize,
-                fileUrl,
-                thumbnailUrl,
-                imageWidth,
-                imageHeight,
-                fileDuration,
-                thumbnailWidth,
-                thumbnailHeight,
-                nickName,
-                avatarUrl,
-                phoneNo,
-                latitude,
-                longitude,
-                (keyboard == null)
-                        ? null
-                        : keyboard.stream().map(it -> it == null ? null : new ArrayList<>(it)).collect(Collectors.toList()));
-    }
-
-    @Override
-    public int hashCode() {
-
-        return Objects.hash(getTo(), getFrom(), getBody(), getType(), getTime(), getFileName(), getFileType(),
-                getFileSize(), getFileUrl(), getThumbnailUrl(), getImageWidth(), getImageHeight(), getFileDuration(),
-                getThumbnailWidth(), getThumbnailHeight(), getNickName(), getAvatarUrl(), getPhoneNo(), getLatitude(),
-                getLongitude(), getKeyboard());
-    }
-}
diff --git a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/models/response/SendMessageResponse.java b/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/models/response/SendMessageResponse.java
deleted file mode 100644
index 335f69b..0000000
--- a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/models/response/SendMessageResponse.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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.soroushbot.models.response;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class SendMessageResponse extends SoroushResponse {
-}
diff --git a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/models/response/SoroushResponse.java b/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/models/response/SoroushResponse.java
deleted file mode 100644
index 52bc906..0000000
--- a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/models/response/SoroushResponse.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * 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.soroushbot.models.response;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class SoroushResponse {
-    Integer resultCode;
-    String resultMessage;
-
-    public SoroushResponse() {
-    }
-
-    public SoroushResponse(Integer resultCode, String resultMessage) {
-
-        this.resultCode = resultCode;
-        this.resultMessage = resultMessage;
-    }
-
-    public Integer getResultCode() {
-        return resultCode;
-    }
-
-    public void setResultCode(Integer resultCode) {
-        this.resultCode = resultCode;
-    }
-
-    public String getResultMessage() {
-        return resultMessage;
-    }
-
-    public void setResultMessage(String resultMessage) {
-        this.resultMessage = resultMessage;
-    }
-
-    @Override
-    public String toString() {
-        return "SoroushResponse{"
-               + "resultCode=" + resultCode
-               + ", resultMessage='" + resultMessage + '\''
-               + '}';
-    }
-}
diff --git a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/models/response/UploadFileResponse.java b/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/models/response/UploadFileResponse.java
deleted file mode 100644
index 601b860..0000000
--- a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/models/response/UploadFileResponse.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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.soroushbot.models.response;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class UploadFileResponse extends SoroushResponse {
-    String fileUrl;
-
-    public UploadFileResponse(Integer resultCode, String resultMessage, String fileUrl) {
-        super(resultCode, resultMessage);
-        this.fileUrl = fileUrl;
-    }
-
-    public UploadFileResponse() {
-    }
-
-    public String getFileUrl() {
-        return fileUrl;
-    }
-
-    public void setFileUrl(String fileUrl) {
-        this.fileUrl = fileUrl;
-    }
-}
diff --git a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/service/SoroushService.java b/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/service/SoroushService.java
deleted file mode 100644
index ab757ef..0000000
--- a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/service/SoroushService.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * 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.soroushbot.service;
-
-import java.io.IOException;
-
-import javax.ws.rs.client.ClientBuilder;
-import javax.ws.rs.client.WebTarget;
-import javax.ws.rs.core.Response;
-
-import org.apache.camel.component.soroushbot.models.SoroushAction;
-import org.apache.camel.component.soroushbot.models.SoroushMessage;
-import org.apache.camel.component.soroushbot.models.response.SoroushResponse;
-import org.apache.camel.component.soroushbot.utils.SoroushException;
-import org.glassfish.jersey.client.ClientProperties;
-import org.glassfish.jersey.media.multipart.MultiPartFeature;
-
-/**
- * singleton class that allows interacting with the Soroush server to exchange messages.
- */
-public final class SoroushService {
-    private static final String URL = "https://bot.sapp.ir";
-    private static SoroushService soroushService;
-    /**
-     * allow Soroush server to be mocked for testing, during testing soroush service will be connected to the
-     * alternativeUrl if provided
-     */
-    private String alternativeUrl;
-
-    private SoroushService() {
-    }
-
-    /**
-     * @return soroush server instance.
-     */
-    public static SoroushService get() {
-        if (soroushService != null) {
-            return soroushService;
-        }
-        synchronized (SoroushService.class) {
-            if (soroushService != null) {
-                return soroushService;
-            }
-            soroushService = new SoroushService();
-            return soroushService;
-        }
-    }
-
-    /**
-     * create fully qualified URL, given the token, endpoint and fileId if needed.
-     *
-     * @param  token
-     * @param  type
-     * @param  fileId
-     * @return
-     */
-    public String generateUrl(String token, SoroushAction type, String fileId) {
-        return getCurrentUrl() + "/" + token + "/" + type.value() + (fileId != null ? "/" + fileId : "");
-    }
-
-    private String getCurrentUrl() {
-        if (alternativeUrl != null) {
-            return alternativeUrl;
-        }
-        return URL;
-    }
-
-    /**
-     * create {@link WebTarget } for uploading file to server
-     *
-     * @param  token
-     * @param  timeOut
-     * @return
-     */
-    public WebTarget createUploadFileTarget(String token, Integer timeOut) {
-        return ClientBuilder.newBuilder()
-                .property(ClientProperties.CONNECT_TIMEOUT, timeOut)
-                .register(MultiPartFeature.class).build()
-                .target(generateUrl(token, SoroushAction.uploadFile, null));
-    }
-
-    /**
-     * create {@link WebTarget } for sending message to server
-     *
-     * @param  token
-     * @param  timeOut
-     * @return
-     */
-
-    public WebTarget createSendMessageTarget(String token, Integer timeOut) {
-        return ClientBuilder.newBuilder()
-                .property(ClientProperties.CONNECT_TIMEOUT, timeOut).build()
-                .target(generateUrl(token, SoroushAction.sendMessage, null));
-    }
-
-    /**
-     * create {@link WebTarget } for downloading file from server
-     *
-     * @param  token
-     * @param  fileId
-     * @param  timeOut
-     * @return
-     */
-
-    public WebTarget createDownloadFileTarget(String token, String fileId, Integer timeOut) {
-        return ClientBuilder.newBuilder()
-                .property(ClientProperties.CONNECT_TIMEOUT, timeOut).build()
-                .target(generateUrl(token, SoroushAction.downloadFile, fileId));
-    }
-
-    /**
-     * check if the response is successfully sent to soroush, by default it assumes that the response type is
-     * SoroushResponse
-     *
-     * @param  response         the response
-     * @param  soroushMessage   the message that we are checking its success, only for logging purpose
-     * @return                  SoroushResponse
-     * @throws IOException      if can not connect to soroush server
-     * @throws SoroushException if soroush reject the response
-     */
-    public SoroushResponse assertSuccessful(Response response, SoroushMessage soroushMessage)
-            throws IOException, SoroushException {
-        return assertSuccessful(response, SoroushResponse.class, soroushMessage);
-    }
-
-    /**
-     * throw IOException if the exception is instance of SoroushException it indicates that the soroush does not accept
-     * the message and therefore resending the request will never be succeed
-     *
-     * @param  <T>              the class that we expect the response should be of this type
-     * @param  response         the response
-     * @param  responseType     expecting response type from soroush
-     * @param  soroushMessage   the message that we are checking its success, only for logging purpose
-     * @throws IOException      if sending message to soroush server is not successful
-     * @throws SoroushException if soroush reject the response with an error code
-     */
-    public <T> T assertSuccessful(Response response, Class<T> responseType, SoroushMessage soroushMessage)
-            throws IOException, SoroushException {
-        int status = response.getStatus();
-        if (status == 503 || status == 429 || status == 301) {
-            String message = response.readEntity(String.class);
-            throw new IOException("code: " + status + " message:" + message);
-        }
-        if (status >= 300) {
-            throw new SoroushException(soroushMessage, null, status, response.readEntity(String.class));
-        }
-        if (SoroushResponse.class.isAssignableFrom(responseType)) {
-            Class<? extends SoroushResponse> soroushResponseType = responseType.asSubclass(SoroushResponse.class);
-            SoroushResponse soroushResponse = response.readEntity(soroushResponseType);
-            if (soroushResponse.getResultCode() != 200) {
-                String body = soroushResponse.toString();
-                throw new SoroushException(soroushMessage, soroushResponse, status, body);
-            }
-            return (T) soroushResponse;
-        } else {
-            return response.readEntity(responseType);
-        }
-    }
-
-    /**
-     * set {@code alternativeUrl} that should be used for testing
-     *
-     * @param alternativeUrl
-     */
-    public void setAlternativeUrl(String alternativeUrl) {
-        this.alternativeUrl = alternativeUrl;
-    }
-}
diff --git a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/utils/CongestionException.java b/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/utils/CongestionException.java
deleted file mode 100644
index 858cece..0000000
--- a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/utils/CongestionException.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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.soroushbot.utils;
-
-import org.apache.camel.component.soroushbot.models.SoroushMessage;
-
-public class CongestionException extends RuntimeException {
-    private final SoroushMessage soroushMessage;
-
-    public CongestionException(Throwable cause, SoroushMessage soroushMessage) {
-        super(cause);
-        this.soroushMessage = soroushMessage;
-    }
-
-    public SoroushMessage getSoroushMessage() {
-        return soroushMessage;
-    }
-
-    @Override
-    public String getLocalizedMessage() {
-        return "MaximumConnectionRetryReachedException{"
-               + "soroushMessage=" + soroushMessage
-               + ", message=" + getMessage()
-               + "} ";
-    }
-}
diff --git a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/utils/ExponentialBackOffStrategy.java b/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/utils/ExponentialBackOffStrategy.java
deleted file mode 100644
index 648885a..0000000
--- a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/utils/ExponentialBackOffStrategy.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * 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.soroushbot.utils;
-
-import org.apache.camel.support.task.budget.backoff.BackOffStrategy;
-
-public class ExponentialBackOffStrategy implements BackOffStrategy {
-    private final long baseRetryTimeOut;
-    private final long coefficient;
-
-    public ExponentialBackOffStrategy(Long baseRetryTimeOut, Long coefficient) {
-        this.baseRetryTimeOut = baseRetryTimeOut;
-        this.coefficient = coefficient;
-    }
-
-    @Override
-    public long calculateInterval(int iteration) {
-        //the first and second request do not need wait
-        if (iteration > 2) {
-            long interval = (long) (baseRetryTimeOut * Math.pow(coefficient, iteration - 2));
-
-            return interval;
-        }
-
-        return 0;
-    }
-}
diff --git a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/utils/FixedBackOffStrategy.java b/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/utils/FixedBackOffStrategy.java
deleted file mode 100644
index 9ef5c18..0000000
--- a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/utils/FixedBackOffStrategy.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * 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.soroushbot.utils;
-
-import org.apache.camel.support.task.budget.backoff.BackOffStrategy;
-
-public class FixedBackOffStrategy implements BackOffStrategy {
-    private final long backOffTime;
-    private final long maxRetryWaitingTime;
-
-    public FixedBackOffStrategy(Long backOffTime, Long maxRetryWaitingTime) {
-        this.backOffTime = backOffTime;
-        this.maxRetryWaitingTime = maxRetryWaitingTime;
-    }
-
-    @Override
-    public long calculateInterval(int iteration) {
-        return Math.min(maxRetryWaitingTime, backOffTime);
-    }
-}
diff --git a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/utils/LinearBackOffStrategy.java b/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/utils/LinearBackOffStrategy.java
deleted file mode 100644
index 3bf2913..0000000
--- a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/utils/LinearBackOffStrategy.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * 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.soroushbot.utils;
-
-import org.apache.camel.support.task.budget.backoff.BackOffStrategy;
-
-public class LinearBackOffStrategy implements BackOffStrategy {
-    private final long retryWaitingTime;
-    private final long increment;
-
-    public LinearBackOffStrategy(Long retryWaitingTime, Long increment) {
-        this.retryWaitingTime = retryWaitingTime;
-        this.increment = increment;
-    }
-
-    @Override
-    public long calculateInterval(int iteration) {
-        //the first and second request do not need wait
-        if (iteration > 2) {
-            return retryWaitingTime + increment * (iteration - 2);
-        }
-
-        return 0;
-    }
-}
diff --git a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/utils/MaximumConnectionRetryReachedException.java b/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/utils/MaximumConnectionRetryReachedException.java
deleted file mode 100644
index 5d283aa..0000000
--- a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/utils/MaximumConnectionRetryReachedException.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * 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.soroushbot.utils;
-
-import org.apache.camel.component.soroushbot.models.SoroushMessage;
-
-public class MaximumConnectionRetryReachedException extends RuntimeException {
-    final SoroushMessage soroushMessage;
-
-    public MaximumConnectionRetryReachedException(String message, SoroushMessage soroushMessage) {
-        super(message);
-        this.soroushMessage = soroushMessage;
-    }
-
-    public MaximumConnectionRetryReachedException(String message, Throwable cause, SoroushMessage soroushMessage) {
-        super(message, cause);
-        this.soroushMessage = soroushMessage;
-    }
-
-    @Override
-    public String getLocalizedMessage() {
-        return "MaximumConnectionRetryReachedException{"
-               + "soroushMessage=" + soroushMessage
-               + ", message=" + getMessage()
-               + "} ";
-    }
-}
diff --git a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/utils/MultiQueueWithTopicThreadPool.java b/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/utils/MultiQueueWithTopicThreadPool.java
deleted file mode 100644
index 1c4b51b..0000000
--- a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/utils/MultiQueueWithTopicThreadPool.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * 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.soroushbot.utils;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.RejectedExecutionException;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * a simple thread pool that send each job to a thread based on the jobs topic,
- */
-public class MultiQueueWithTopicThreadPool {
-    private static Logger log = LoggerFactory.getLogger(MultiQueueWithTopicThreadPool.class);
-    private boolean shutdown; //default is false
-    private int poolSize;
-    private List<PoolWorker> workers = new ArrayList<>();
-
-    public MultiQueueWithTopicThreadPool(int poolSize, int capacity, String namePrefix) {
-        log.debug("creating MultiQueueWithTopicThreadPool with size {} and capacity of each queue is set to {}",
-                poolSize, capacity);
-
-        this.poolSize = poolSize;
-        //create a pool of thread and start them
-        for (int i = 0; i < poolSize; i++) {
-            PoolWorker e = new PoolWorker(capacity);
-            workers.add(e);
-            e.start();
-            e.setName(namePrefix + " #" + i);
-        }
-    }
-
-    /**
-     * add the runnable into corresponding queue and it when it reach to the head of queue the queue is decided based on
-     * {@code topic}. if topic is instance of Integer, it uses (topic%poolSize) to determine corresponding queue
-     * otherwise it uses (topic.hashCode()%poolsize) do determine corresponding queue.
-     *
-     * @param  topic                 tasks are organized between threads based on this parameter
-     * @param  runnable              the task that should be executed
-     * @throws IllegalStateException if the {@code runnable} cannot be added at this time due to queue capacity
-     *                               restrictions
-     */
-    public void execute(Object topic, Runnable runnable) throws IllegalStateException {
-        if (shutdown) {
-            throw new RejectedExecutionException("pool has been shutdown");
-        }
-        int selectedQueue;
-        if (topic instanceof Integer) {
-            selectedQueue = ((Integer) topic) % poolSize;
-        } else {
-            selectedQueue = topic.hashCode() % poolSize;
-        }
-        PoolWorker poolWorker = workers.get(selectedQueue);
-        synchronized (poolWorker) {
-            poolWorker.enqueue(runnable);
-        }
-    }
-
-    public void shutdown() {
-        shutdown = true;
-    }
-}
-
-/**
- * Each PoolWorker is a thread that when it is idle, it pick the head from its and execute it.
- */
-class PoolWorker extends Thread {
-    private static Logger log = LoggerFactory.getLogger(PoolWorker.class);
-    final LinkedBlockingQueue<Runnable> queue;
-
-    public PoolWorker(int capacity) {
-        // if capacity <=0 then the queue capacity should be {@link Integer#MAX_VALUE}
-        if (capacity > 0) {
-            queue = new LinkedBlockingQueue<>(capacity);
-        } else {
-            queue = new LinkedBlockingQueue<>();
-        }
-    }
-
-    /**
-     * ad new runnable to queue and notify corresponding thread to execute newly added runnable if the thread is idle.
-     *
-     * @param r a runnable to execute by this threadPool
-     */
-    public void enqueue(Runnable r) {
-        synchronized (queue) {
-            queue.add(r);
-            queue.notify();
-        }
-    }
-
-    @Override
-    public void run() {
-        while (true) {
-            Runnable task;
-            synchronized (queue) {
-                // while queue is empty wait for queue to become populated
-                while (queue.isEmpty()) {
-                    try {
-                        queue.wait();
-                    } catch (InterruptedException e) {
-                        log.error("An interrupt occurred while queue is waiting: {}", e.getMessage());
-                        //interrupt current thread to prevent the interrupt being swallowed.
-                        Thread.currentThread().interrupt();
-                    }
-                }
-                //poll next task as we know it is exists in the queue
-                task = queue.poll();
-                //double check!
-                if (task == null) {
-                    continue;
-                }
-            }
-            try {
-                task.run();
-            } catch (RuntimeException e) {
-                //catch RuntimeException that may thrown in the task
-                log.error("Thread pool is interrupted due to an issue: {}", e.getMessage());
-            }
-
-        }
-    }
-}
diff --git a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/utils/SoroushException.java b/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/utils/SoroushException.java
deleted file mode 100644
index ecc5a6c..0000000
--- a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/utils/SoroushException.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * 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.soroushbot.utils;
-
-import org.apache.camel.component.soroushbot.models.SoroushMessage;
-import org.apache.camel.component.soroushbot.models.response.SoroushResponse;
-
-/**
- * Exception representation of response from Soroush server.
- */
-public class SoroushException extends Exception {
-    final SoroushMessage soroushMessage;
-    final SoroushResponse soroushResponse;
-    final Integer status;
-    final String responseBody;
-
-    public SoroushException(SoroushMessage soroushMessage, SoroushResponse soroushResponse, Integer status,
-                            String responseBody) {
-        super(responseBody);
-        this.soroushMessage = soroushMessage;
-        this.soroushResponse = soroushResponse;
-        this.status = status;
-        this.responseBody = responseBody;
-    }
-
-    @Override
-    public String getLocalizedMessage() {
-        return "SoroushException{"
-               + "soroushMessage=" + soroushMessage
-               + "soroushResponse=" + soroushResponse
-               + ", status=" + status
-               + ", responseBody='" + responseBody + '\''
-               + ", message='" + getMessage() + '\''
-               + "} ";
-    }
-
-}
diff --git a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/utils/StringUtils.java b/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/utils/StringUtils.java
deleted file mode 100644
index 4954dad..0000000
--- a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/utils/StringUtils.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * 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.soroushbot.utils;
-
-public final class StringUtils {
-    protected StringUtils() {
-    }
-
-    /**
-     * create ordinal value for each number. like 1st, 2nd, 3rd, 4th ...
-     *
-     * @param  number
-     * @return        the ordinal value of {@code number}
-     */
-    public static String ordinal(int number) {
-        return number % 100 == 11 || number % 100 == 12 || number % 100 == 13
-                ? number + "th"
-                : number + new String[] { "th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th" }[number % 10];
-    }
-}
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/IOUtils.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/IOUtils.java
deleted file mode 100644
index 03df716..0000000
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/IOUtils.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * 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.soroushbot;
-
-import java.io.EOFException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Arrays;
-
-public final class IOUtils {
-    private IOUtils() {
-    }
-
-    public static byte[] readFully(InputStream var0, int var1, boolean var2) throws IOException {
-        byte[] var3 = new byte[0];
-        if (var1 == -1) {
-            var1 = 2147483647;
-        }
-
-        int var6;
-        for (int var4 = 0; var4 < var1; var4 += var6) {
-            int var5;
-            if (var4 >= var3.length) {
-                var5 = Math.min(var1 - var4, var3.length + 1024);
-                if (var3.length < var4 + var5) {
-                    var3 = Arrays.copyOf(var3, var4 + var5);
-                }
-            } else {
-                var5 = var3.length - var4;
-            }
-
-            var6 = var0.read(var3, var4, var5);
-            if (var6 < 0) {
-                if (var2 && var1 != 2147483647) {
-                    throw new EOFException("Detect premature EOF");
-                }
-
-                if (var3.length != var4) {
-                    var3 = Arrays.copyOf(var3, var4);
-                }
-                break;
-            }
-        }
-
-        return var3;
-    }
-}
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerAutoDownloadFileTest.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerAutoDownloadFileTest.java
deleted file mode 100644
index d613401..0000000
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerAutoDownloadFileTest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * 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.soroushbot.component;
-
-import java.util.List;
-
-import org.apache.camel.Exchange;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.models.SoroushAction;
-import org.apache.camel.component.soroushbot.models.SoroushMessage;
-import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-@Disabled("Flaky test")
-public class ConsumerAutoDownloadFileTest extends SoroushBotTestSupport {
-    @Override
-    public RouteBuilder createRouteBuilder() {
-        return new RouteBuilder() {
-            @Override
-            public void configure() throws Exception {
-                from("soroush://" + SoroushAction.getMessage + "?authorizationToken=4 File&autoDownload=true")
-                        .to("mock:soroush");
-            }
-        };
-    }
-
-    @Test
-    public void checkIfAutoDownloadFiles() throws InterruptedException {
-        MockEndpoint mockEndpoint = getMockEndpoint("mock:soroush");
-        mockEndpoint.setExpectedCount(4);
-        mockEndpoint.assertIsSatisfied();
-        List<Exchange> exchanges = mockEndpoint.getExchanges();
-        assertEquals(4, exchanges.size());
-        exchanges.forEach(exchange -> {
-            SoroushMessage body = exchange.getIn().getBody(SoroushMessage.class);
-            assertTrue(body.getFile() == null ^ body.getFileUrl() != null,
-                    "if fileUrl is not null file may not be null and visa versa");
-            assertTrue(body.getThumbnail() == null ^ body.getThumbnailUrl() != null,
-                    "if and only if thumbnail url is null thumbnail may be null");
-        });
-
-    }
-}
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerAutoReconnectAfterIdleTimeoutTest.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerAutoReconnectAfterIdleTimeoutTest.java
deleted file mode 100644
index a75484b..0000000
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerAutoReconnectAfterIdleTimeoutTest.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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.soroushbot.component;
-
-import org.apache.camel.RoutesBuilder;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.models.SoroushAction;
-import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
-
-@Disabled("Flaky test")
-public class ConsumerAutoReconnectAfterIdleTimeoutTest extends SoroushBotTestSupport {
-
-    @Override
-    protected RoutesBuilder createRouteBuilder() throws Exception {
-        return new RouteBuilder() {
-            @Override
-            public void configure() throws Exception {
-                from("soroush://" + SoroushAction.getMessage
-                     + "/7 delay 100?reconnectIdleConnectionTimeout=200&maxConnectionRetry=0")
-                             .to("mock:result");
-            }
-        };
-    }
-
-    @Test
-    public void test() throws InterruptedException {
-        //checking is take place in createRouteBuilder
-        MockEndpoint mockEndpoint = getMockEndpoint("mock:result");
-        // at least 7*3 + x message should received since we know are not sure about x we expect it to be 1
-        // the pattern is 7 message in 700ms and then at most 400ms wait so it must be at least 22 if it reaches 4th group of message
-        // manually reconnect should not effect connection retry count
-        mockEndpoint.setMinimumExpectedMessageCount(22);
-        mockEndpoint.setResultWaitTime(4000);
-        mockEndpoint.assertIsSatisfied();
-
-    }
-}
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerCamelConcurrentTest.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerCamelConcurrentTest.java
deleted file mode 100644
index 22e1ab5..0000000
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerCamelConcurrentTest.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * 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.soroushbot.component;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.camel.RoutesBuilder;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.models.SoroushAction;
-import org.apache.camel.component.soroushbot.models.SoroushMessage;
-import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
-import org.apache.logging.log4j.LogManager;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-@Disabled("Flaky test")
-public class ConsumerCamelConcurrentTest extends SoroushBotTestSupport {
-    final List<String> fromOrder = new ArrayList<>();
-
-    @Override
-    protected RoutesBuilder createRouteBuilder() throws Exception {
-        return new RouteBuilder() {
-            @Override
-            public void configure() throws Exception {
-                from("soroush://" + SoroushAction.getMessage + "/10").threads().poolSize(4).process(exchange -> {
-                    SoroushMessage message = exchange.getIn().getBody(SoroushMessage.class);
-                    String from = message.getFrom();
-                    //message from u0 (0,4,8) should be processed at the end
-                    if (from.equals("u0")) {
-                        Thread.sleep(1000);
-                    }
-                    synchronized (fromOrder) {
-                        fromOrder.add(from);
-                    }
-                }).to("mock:MultithreadConsumerTest");
-            }
-        };
-    }
-
-    @Test
-    public void checkEachUserGoesToSingleThread() throws InterruptedException {
-        //checking is take place in createRouteBuilder
-        MockEndpoint mockEndpoint = getMockEndpoint("mock:MultithreadConsumerTest");
-        mockEndpoint.expectedMessageCount(10);
-        mockEndpoint.assertIsSatisfied();
-        LogManager.getLogger().info(fromOrder.toString());
-        assertEquals(10, fromOrder.size());
-        assertEquals("u0", fromOrder.get(7));
-        assertEquals("u0", fromOrder.get(8));
-        assertEquals("u0", fromOrder.get(9));
-    }
-}
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerExceptionHandledWithErrorHandlerTest.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerExceptionHandledWithErrorHandlerTest.java
deleted file mode 100644
index a3d015f..0000000
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerExceptionHandledWithErrorHandlerTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * 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.soroushbot.component;
-
-import org.apache.camel.Exchange;
-import org.apache.camel.RoutesBuilder;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.models.SoroushAction;
-import org.apache.camel.component.soroushbot.models.SoroushMessage;
-import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
-import org.apache.camel.component.soroushbot.utils.CongestionException;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
-
-@Disabled("Flaky test")
-public class ConsumerExceptionHandledWithErrorHandlerTest extends SoroushBotTestSupport {
-    @Override
-    protected RoutesBuilder createRouteBuilder() {
-        return new RouteBuilder() {
-            @Override
-            public void configure() {
-                onException(CongestionException.class).process(exchange -> {
-                    SoroushMessage originalMessage = exchange.getProperty("OriginalMessage", SoroushMessage.class);
-                    if (originalMessage == null || exchange.getIn().getBody(SoroushMessage.class) != null) {
-                        exchange.setProperty(Exchange.ROUTE_STOP, true);
-                    }
-                }).handled(true).to("mock:exceptionRoute");
-                from("soroush://" + SoroushAction.getMessage
-                     + "/7?concurrentConsumers=2&queueCapacityPerThread=1&bridgeErrorHandler=true")
-                             .process(exchange -> Thread.sleep(1000))
-                             .to("mock:mainRoute");
-
-            }
-        };
-    }
-
-    @Test
-    public void checkIfMessageGoesToExceptionRoute() throws InterruptedException {
-        MockEndpoint exceptionEndpoint = getMockEndpoint("mock:exceptionRoute");
-        MockEndpoint mainEndPoint = getMockEndpoint("mock:mainRoute");
-        exceptionEndpoint.setExpectedCount(3);
-        mainEndPoint.setExpectedCount(4);
-        exceptionEndpoint.assertIsSatisfied();
-        mainEndPoint.assertIsSatisfied();
-    }
-}
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerMultiThreadTest.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerMultiThreadTest.java
deleted file mode 100644
index 80620ee..0000000
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerMultiThreadTest.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * 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.soroushbot.component;
-
-import org.apache.camel.RoutesBuilder;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.models.SoroushAction;
-import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
-
-@Disabled("Flaky test")
-public class ConsumerMultiThreadTest extends SoroushBotTestSupport {
-
-    @Test
-    public void supportForConcurrentThreadTest() throws InterruptedException {
-        MockEndpoint mockEndpoint = getMockEndpoint("mock:supportForConcurrentThreadTest");
-        mockEndpoint.setExpectedMessageCount(5);
-        mockEndpoint.setAssertPeriod(1500);
-        mockEndpoint.assertIsSatisfied();
-    }
-
-    @Override
-    protected RoutesBuilder createRouteBuilder() throws Exception {
-        return new RouteBuilder() {
-            @Override
-            public void configure() throws Exception {
-                from("soroush://" + SoroushAction.getMessage + "/5")
-                        .threads(5).process(exchange -> {
-                            Thread.sleep(1000);
-                        }).to("mock:supportForConcurrentThreadTest");
-            }
-        };
-    }
-}
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerNativeConcurrentTest.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerNativeConcurrentTest.java
deleted file mode 100644
index bef9f3d..0000000
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerNativeConcurrentTest.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * 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.soroushbot.component;
-
-import java.util.HashSet;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.apache.camel.RoutesBuilder;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.models.SoroushAction;
-import org.apache.camel.component.soroushbot.models.SoroushMessage;
-import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
-import org.apache.logging.log4j.LogManager;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-@Disabled("Flaky test")
-public class ConsumerNativeConcurrentTest extends SoroushBotTestSupport {
-    ConcurrentHashMap<String, Thread> userToThread;
-    AtomicInteger badThread = new AtomicInteger();
-
-    @Override
-    protected RoutesBuilder createRouteBuilder() throws Exception {
-        userToThread = new ConcurrentHashMap<>();
-        return new RouteBuilder() {
-            @Override
-            public void configure() throws Exception {
-                from("soroush://" + SoroushAction.getMessage + "/10?concurrentConsumers=3&maxConnectionRetry=0")
-                        .process(exchange -> {
-                            String from = exchange.getIn().getBody(SoroushMessage.class).getFrom();
-                            Thread currentThread = Thread.currentThread();
-                            Thread previousThread = userToThread.putIfAbsent(from, currentThread);
-                            if (previousThread != null) {
-                                if (previousThread != currentThread) {
-                                    badThread.addAndGet(1);
-                                }
-                            }
-                        }).to("mock:MultithreadConsumerTest");
-            }
-        };
-    }
-
-    @Test
-    public void checkEachUserGoesToSingleThread() throws InterruptedException {
-        //checking is take place in createRouteBuilder
-        MockEndpoint mockEndpoint = getMockEndpoint("mock:MultithreadConsumerTest");
-        mockEndpoint.expectedMessageCount(10);
-        mockEndpoint.assertIsSatisfied();
-        LogManager.getLogger().info(userToThread.size());
-        LogManager.getLogger().info(userToThread.values());
-        assertEquals(0, badThread.get(), "previous and current thread must be equal");
-        assertTrue(new HashSet<>(userToThread.values()).size() > 1,
-                "there must be more than 1 thread in $userToThread unless this test is not useful");
-    }
-}
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerQueueCapacityPerThreadTest.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerQueueCapacityPerThreadTest.java
deleted file mode 100644
index d55a2c6..0000000
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerQueueCapacityPerThreadTest.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * 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.soroushbot.component;
-
-import org.apache.camel.RoutesBuilder;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.models.SoroushAction;
-import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
-
-@Disabled("Flaky test")
-public class ConsumerQueueCapacityPerThreadTest extends SoroushBotTestSupport {
-    @Override
-    protected RoutesBuilder createRouteBuilder() throws Exception {
-        return new RouteBuilder() {
-            @Override
-            public void configure() throws Exception {
-                from("soroush:" + SoroushAction.getMessage + "/150?queueCapacityPerThread=1&concurrentConsumers=2")
-                        .process(exchange -> {
-                            Thread.sleep(1000);
-                        }).to("mock:ConsumerQueueCapacityPerThread");
-            }
-        };
-    }
-
-    @Test
-    public void checkOnly4ExchangeReceiveToTheEnd() throws InterruptedException {
-        MockEndpoint mockEndpoint = getMockEndpoint("mock:ConsumerQueueCapacityPerThread");
-        mockEndpoint.expectedMessageCount(6);
-        mockEndpoint.setAssertPeriod(4000);
-        mockEndpoint.assertIsSatisfied();
-    }
-}
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerRetryOnConnectionFailureTest.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerRetryOnConnectionFailureTest.java
deleted file mode 100644
index b80db03..0000000
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerRetryOnConnectionFailureTest.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * 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.soroushbot.component;
-
-import org.apache.camel.RoutesBuilder;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.models.SoroushAction;
-import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
-
-@Disabled("Flaky test")
-public class ConsumerRetryOnConnectionFailureTest extends SoroushBotTestSupport {
-    @Override
-    protected RoutesBuilder createRouteBuilder() throws Exception {
-        return new RouteBuilder() {
-            @Override
-            public void configure() throws Exception {
-                from("soroush://" + SoroushAction.getMessage + "/5 CLOSE?maxConnectionRetry=1")
-                        .to("mock:ConsumerRetryOnConnectionFailure");
-            }
-        };
-    }
-
-    @Test
-    public void checkIfConsumerReceive15message() throws InterruptedException {
-        MockEndpoint mockEndpoint = getMockEndpoint("mock:ConsumerRetryOnConnectionFailure");
-        mockEndpoint.expectedMessageCount(15);
-        mockEndpoint.assertIsSatisfied();
-    }
-}
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerTest.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerTest.java
deleted file mode 100644
index 7917b78..0000000
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * 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.soroushbot.component;
-
-import org.apache.camel.RoutesBuilder;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.models.SoroushAction;
-import org.apache.camel.component.soroushbot.models.SoroushMessage;
-import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
-import org.apache.logging.log4j.LogManager;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-@Disabled("Flaky test")
-public class ConsumerTest extends SoroushBotTestSupport {
-
-    private int messageCount;
-    private int successMessageCount;
-
-    @Test
-    public void generalTest() throws Exception {
-        MockEndpoint mockEndpoint = getMockEndpoint("mock:generalTest");
-        mockEndpoint.setExpectedMessageCount(5);
-        mockEndpoint.assertIsSatisfied();
-        assertEquals(5, successMessageCount, "total number of successful message is equal to 5");
-    }
-
-    @Override
-    protected RoutesBuilder createRouteBuilder() throws Exception {
-        return new RouteBuilder() {
-            @Override
-            public void configure() throws Exception {
-                from("soroush://" + SoroushAction.getMessage + "/5")
-                        .process(exchange -> {
-                            LogManager.getLogger().info("get a message");
-                            if (exchange.getIn().getBody(SoroushMessage.class).getBody()
-                                    .contains(messageCount + "")) {
-                                successMessageCount++;
-                            }
-                            messageCount++;
-                        }).to("mock:generalTest");
-            }
-        };
-    }
-}
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ExponentialBackOffProducerConnectionRetryTest.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ExponentialBackOffProducerConnectionRetryTest.java
deleted file mode 100644
index 7ed7634..0000000
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ExponentialBackOffProducerConnectionRetryTest.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * 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.soroushbot.component;
-
-import org.apache.camel.EndpointInject;
-import org.apache.camel.RoutesBuilder;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.models.MinorType;
-import org.apache.camel.component.soroushbot.models.SoroushAction;
-import org.apache.camel.component.soroushbot.models.SoroushMessage;
-import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
-import org.apache.camel.component.soroushbot.support.SoroushBotWS;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-public class ExponentialBackOffProducerConnectionRetryTest extends SoroushBotTestSupport {
-
-    @EndpointInject("direct:soroush")
-    org.apache.camel.Endpoint endpoint;
-
-    @Override
-    @BeforeEach
-    public void setUp() throws Exception {
-        super.setUp();
-        SoroushBotWS.clear();
-    }
-
-    @Override
-    protected RoutesBuilder createRouteBuilder() throws Exception {
-        return new RouteBuilder() {
-            @Override
-            public void configure() throws Exception {
-                from("direct:soroush").to("soroush://" + SoroushAction.sendMessage + "/retry 5?maxConnectionRetry=5"
-                                          + "&retryWaitingTime=500&retryExponentialCoefficient=2&backOffStrategy=exponential")
-                        .to("mock:afterAllRetry")
-                        .to("mock:beforeAllRetry");
-            }
-        };
-    }
-
-    @Test
-    public void retryOnFailure() throws Exception {
-        SoroushMessage body = new SoroushMessage();
-        body.setType(MinorType.TEXT);
-        body.setFrom("b1");
-        body.setTo("u1");
-        //send message in other thread
-        new Thread(() -> context().createProducerTemplate().sendBody(endpoint, body)).start();
-        MockEndpoint beforeAllRetry = getMockEndpoint("mock:beforeAllRetry");
-        //cause this thread to sleep .5+1+2+4 second. even in this time,no message should be sent
-        beforeAllRetry.setAssertPeriod(7000);
-        beforeAllRetry.setExpectedCount(0);
-        beforeAllRetry.assertIsSatisfied();
-        MockEndpoint afterAllRetry = getMockEndpoint("mock:afterAllRetry");
-        afterAllRetry.setExpectedMessageCount(1);
-        //cause this thread to sleep an addition of 1 second, during this time,the message must be sent to the server
-        afterAllRetry.setAssertPeriod(1000);
-        afterAllRetry.assertIsSatisfied();
-        assertEquals(SoroushBotWS.getReceivedMessages().get(0), body, "message sent successfully");
-    }
-}
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/FixedBackOffProducerConnectionRetryTest.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/FixedBackOffProducerConnectionRetryTest.java
deleted file mode 100644
index 46b41e7..0000000
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/FixedBackOffProducerConnectionRetryTest.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * 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.soroushbot.component;
-
-import org.apache.camel.EndpointInject;
-import org.apache.camel.RoutesBuilder;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.models.MinorType;
-import org.apache.camel.component.soroushbot.models.SoroushAction;
-import org.apache.camel.component.soroushbot.models.SoroushMessage;
-import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
-import org.apache.camel.component.soroushbot.support.SoroushBotWS;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-public class FixedBackOffProducerConnectionRetryTest extends SoroushBotTestSupport {
-
-    @EndpointInject("direct:soroush")
-    org.apache.camel.Endpoint endpoint;
-
-    @Override
-    @BeforeEach
-    public void setUp() throws Exception {
-        super.setUp();
-        SoroushBotWS.clear();
-    }
-
-    @Override
-    protected RoutesBuilder createRouteBuilder() throws Exception {
-        return new RouteBuilder() {
-            @Override
-            public void configure() throws Exception {
-                from("direct:soroush").to("soroush://" + SoroushAction.sendMessage + "/retry 5?maxConnectionRetry=5"
-                                          + "&retryWaitingTime=500&backOffStrategy=fixed")
-                        .to("mock:afterAllRetry")
-                        .to("mock:beforeAllRetry");
-            }
-        };
-    }
-
-    @Test
-    public void retryOnFailure() throws Exception {
-        Thread.sleep(1000);
-        SoroushMessage body = new SoroushMessage();
-        body.setType(MinorType.TEXT);
-        body.setFrom("b1");
-        body.setTo("u1");
-        //send message in other thread
-        new Thread(() -> context().createProducerTemplate().sendBody(endpoint, body)).start();
-        MockEndpoint beforeAllRetry = getMockEndpoint("mock:beforeAllRetry");
-        //cause this thread to sleep 4*.5 second. even in this time,no message should be sent
-        beforeAllRetry.setAssertPeriod(1700);
-        beforeAllRetry.setExpectedCount(0);
-        beforeAllRetry.assertIsSatisfied();
-        MockEndpoint afterAllRetry = getMockEndpoint("mock:afterAllRetry");
-        afterAllRetry.setExpectedMessageCount(1);
-        //cause this thread to sleep an addition of .6 second, during this time,the message must be sent to the server
-        afterAllRetry.setAssertPeriod(600);
-        afterAllRetry.assertIsSatisfied();
-        assertEquals(SoroushBotWS.getReceivedMessages().get(0), body, "message sent successfully");
-    }
-}
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/HandleExceptionWithErrorHandlerTest.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/HandleExceptionWithErrorHandlerTest.java
deleted file mode 100644
index 5ebfe0a..0000000
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/HandleExceptionWithErrorHandlerTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * 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.soroushbot.component;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-
-import org.apache.camel.RoutesBuilder;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.models.SoroushAction;
-import org.apache.camel.component.soroushbot.models.SoroushMessage;
-import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertFalse;
-
-@Disabled("Flaky test")
-public class HandleExceptionWithErrorHandlerTest extends SoroushBotTestSupport {
-    @Override
-    protected RoutesBuilder createRouteBuilder() {
-        return new RouteBuilder() {
-            @Override
-            public void configure() {
-                onException(FileNotFoundException.class).to("mock:exceptionRoute");
-                from("soroush://" + SoroushAction.getMessage + "/5?concurrentConsumers=2")
-                        .process(exchange -> {
-                            SoroushMessage body = exchange.getIn().getBody(SoroushMessage.class);
-                            File file = new File("badFile-ShouldNotExits");
-                            assertFalse(file.exists(), "file should not exists for this test");
-                            body.setFile(file);
-                            body.setTo(body.getFrom());
-                        })
-                        .to("soroush://" + SoroushAction.sendMessage + "/token")
-                        .to("mock:mainRoute");
-
-            }
-        };
-    }
-
-    @Test
-    public void checkIfMessageGoesToExceptionRoute() throws InterruptedException {
-        MockEndpoint exceptionEndpoint = getMockEndpoint("mock:exceptionRoute");
-        MockEndpoint mainEndPoint = getMockEndpoint("mock:mainRoute");
-        exceptionEndpoint.setExpectedCount(5);
-        mainEndPoint.setExpectedCount(0);
-        exceptionEndpoint.assertIsSatisfied();
-        mainEndPoint.assertIsSatisfied();
-    }
-}
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/LinearBackOffProducerConnectionRetryTest.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/LinearBackOffProducerConnectionRetryTest.java
deleted file mode 100644
index 859c3fd..0000000
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/LinearBackOffProducerConnectionRetryTest.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * 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.soroushbot.component;
-
-import org.apache.camel.EndpointInject;
-import org.apache.camel.RoutesBuilder;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.models.MinorType;
-import org.apache.camel.component.soroushbot.models.SoroushAction;
-import org.apache.camel.component.soroushbot.models.SoroushMessage;
-import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
-import org.apache.camel.component.soroushbot.support.SoroushBotWS;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-public class LinearBackOffProducerConnectionRetryTest extends SoroushBotTestSupport {
-
-    @EndpointInject("direct:soroush")
-    org.apache.camel.Endpoint endpoint;
-
-    @Override
-    @BeforeEach
-    public void setUp() throws Exception {
-        super.setUp();
-        SoroushBotWS.clear();
-    }
-
-    @Override
-    protected RoutesBuilder createRouteBuilder() throws Exception {
-        return new RouteBuilder() {
-            @Override
-            public void configure() throws Exception {
-                from("direct:soroush").to("soroush://" + SoroushAction.sendMessage + "/retry 5?maxConnectionRetry=5"
-                                          + "&retryWaitingTime=500&retryLinearIncrement=1000&backOffStrategy=linear")
-                        .to("mock:afterAllRetry")
-                        .to("mock:beforeAllRetry");
-            }
-        };
-    }
-
-    @Test
-    public void retryOnFailure() throws Exception {
-        Thread.sleep(1000);
-        SoroushMessage body = new SoroushMessage();
-        body.setType(MinorType.TEXT);
-        body.setFrom("b1");
-        body.setTo("u1");
-        //send message in other thread
-        new Thread(() -> context().createProducerTemplate().sendBody(endpoint, body)).start();
-        MockEndpoint beforeAllRetry = getMockEndpoint("mock:beforeAllRetry");
-        //cause this thread to sleep .5+1.5+2.5+3.5 second. even in this time,no message should be sent
-        beforeAllRetry.setAssertPeriod(7000);
-        beforeAllRetry.setExpectedCount(0);
-        beforeAllRetry.assertIsSatisfied();
-        MockEndpoint afterAllRetry = getMockEndpoint("mock:afterAllRetry");
-        afterAllRetry.setExpectedMessageCount(1);
-        //cause this thread to sleep an addition of 1 second, during this time,the message must be sent to the server
-        afterAllRetry.setAssertPeriod(2000);
-        afterAllRetry.assertIsSatisfied();
-        assertEquals(SoroushBotWS.getReceivedMessages().get(0), body, "message sent successfully");
-    }
-}
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/MaxRetryWaitingTimeProducerConnectionRetryTest.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/MaxRetryWaitingTimeProducerConnectionRetryTest.java
deleted file mode 100644
index 911943f..0000000
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/MaxRetryWaitingTimeProducerConnectionRetryTest.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * 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.soroushbot.component;
-
-import org.apache.camel.EndpointInject;
-import org.apache.camel.RoutesBuilder;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.models.MinorType;
-import org.apache.camel.component.soroushbot.models.SoroushAction;
-import org.apache.camel.component.soroushbot.models.SoroushMessage;
-import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
-import org.apache.camel.component.soroushbot.support.SoroushBotWS;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-public class MaxRetryWaitingTimeProducerConnectionRetryTest extends SoroushBotTestSupport {
-
-    @EndpointInject("direct:soroush")
-    org.apache.camel.Endpoint endpoint;
-
-    @Override
-    @BeforeEach
-    public void setUp() throws Exception {
-        super.setUp();
-        SoroushBotWS.clear();
-    }
-
-    @Override
-    protected RoutesBuilder createRouteBuilder() throws Exception {
-        return new RouteBuilder() {
-            @Override
-            public void configure() throws Exception {
-                from("direct:soroush").to("soroush://" + SoroushAction.sendMessage + "/retry 5?maxConnectionRetry=5"
-                                          + "&retryWaitingTime=500&retryExponentialCoefficient=2&backOffStrategy=exponential&maxRetryWaitingTime=2500")
-                        .to("mock:afterAllRetry")
-                        .to("mock:beforeAllRetry");
-            }
-        };
-    }
-
-    @Test
-    public void retryOnFailure() throws Exception {
-        SoroushMessage body = new SoroushMessage();
-        body.setType(MinorType.TEXT);
-        body.setFrom("b1");
-        body.setTo("u1");
-        //send message in other thread
-        new Thread(() -> context().createProducerTemplate().sendBody(endpoint, body)).start();
-        MockEndpoint beforeAllRetry = getMockEndpoint("mock:beforeAllRetry");
-        //cause this thread to sleep .5+1+2+2.5 second. even in this time,no message should be sent
-        beforeAllRetry.setAssertPeriod(5500);
-        beforeAllRetry.setExpectedCount(0);
-        beforeAllRetry.assertIsSatisfied();
-        MockEndpoint afterAllRetry = getMockEndpoint("mock:afterAllRetry");
-        afterAllRetry.setExpectedMessageCount(1);
-        //cause this thread to sleep an addition of 1 second, during this time,the message must be sent to the server
-        afterAllRetry.setAssertPeriod(1000);
-        afterAllRetry.assertIsSatisfied();
-        assertEquals(SoroushBotWS.getReceivedMessages().get(0), body, "message sent successfully");
-    }
-}
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerAutoUploadFileIsFalseTest.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerAutoUploadFileIsFalseTest.java
deleted file mode 100644
index 5f04889..0000000
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerAutoUploadFileIsFalseTest.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * 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.soroushbot.component;
-
-import java.io.ByteArrayInputStream;
-import java.util.Map;
-
-import org.apache.camel.EndpointInject;
-import org.apache.camel.RoutesBuilder;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.models.MinorType;
-import org.apache.camel.component.soroushbot.models.SoroushAction;
-import org.apache.camel.component.soroushbot.models.SoroushMessage;
-import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
-import org.apache.camel.component.soroushbot.support.SoroushBotWS;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNull;
-
-public class ProducerAutoUploadFileIsFalseTest extends SoroushBotTestSupport {
-
-    @EndpointInject("direct:soroush")
-    org.apache.camel.Endpoint endpoint;
-
-    @Override
-    @BeforeEach
-    public void setUp() throws Exception {
-        super.setUp();
-        SoroushBotWS.clear();
-    }
-
-    @Override
-    protected RoutesBuilder createRouteBuilder() throws Exception {
-        return new RouteBuilder() {
-            @Override
-            public void configure() throws Exception {
-                from("direct:soroush").to("soroush://" + SoroushAction.sendMessage + "/token?autoUploadFile=false")
-                        .process(exchange -> {
-                            SoroushMessage body = exchange.getIn().getBody(SoroushMessage.class);
-                            if (body.getFileUrl() != null) {
-                                throw new AssertionError("file url is null");
-                            }
-                            if (body.getThumbnailUrl() != null) {
-                                throw new AssertionError("thumb url is null");
-                            }
-                        })
-                        .to("mock:soroush");
-            }
-        };
-    }
-
-    @Test
-    public void autoUploadTest() throws Exception {
-        SoroushMessage body = new SoroushMessage();
-        body.setType(MinorType.TEXT);
-        body.setFrom("b1");
-        body.setTo("u1");
-        String fileContent = "hello";
-        String thumbContent = "world";
-        body.setFile(new ByteArrayInputStream(fileContent.getBytes()));
-        body.setThumbnail(new ByteArrayInputStream(thumbContent.getBytes()));
-        context().createProducerTemplate().sendBody(endpoint, body);
-        MockEndpoint mockEndpoint = getMockEndpoint("mock:soroush");
-        mockEndpoint.setExpectedMessageCount(1);
-        mockEndpoint.assertIsSatisfied();
-        assertEquals(SoroushBotWS.getReceivedMessages().get(0), body, "message sent successfully");
-        SoroushMessage mockedMessage = mockEndpoint.getExchanges().get(0).getIn().getBody(SoroushMessage.class);
-        Map<String, String> fileIdToContent = SoroushBotWS.getFileIdToContent();
-        assertEquals(0, fileIdToContent.size(), "file uploaded successfully");
-        assertNull(mockedMessage.getFileUrl());
-        assertNull(mockedMessage.getThumbnailUrl());
-    }
-}
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerAutoUploadFileTest.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerAutoUploadFileTest.java
deleted file mode 100644
index 486405b..0000000
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerAutoUploadFileTest.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * 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.soroushbot.component;
-
-import java.io.ByteArrayInputStream;
-import java.util.Map;
-
-import org.apache.camel.EndpointInject;
-import org.apache.camel.RoutesBuilder;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.models.MinorType;
-import org.apache.camel.component.soroushbot.models.SoroushAction;
-import org.apache.camel.component.soroushbot.models.SoroushMessage;
-import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
-import org.apache.camel.component.soroushbot.support.SoroushBotWS;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-@Disabled("CAMEL-13629 failing test")
-public class ProducerAutoUploadFileTest extends SoroushBotTestSupport {
-
-    @EndpointInject("direct:soroush")
-    org.apache.camel.Endpoint endpoint;
-
-    @Override
-    @BeforeEach
-    public void setUp() throws Exception {
-        super.setUp();
-        SoroushBotWS.clear();
-    }
-
-    @Override
-    protected RoutesBuilder createRouteBuilder() throws Exception {
-        return new RouteBuilder() {
-            @Override
-            public void configure() throws Exception {
-                from("direct:soroush").to("soroush://" + SoroushAction.sendMessage + "/token")
-                        .process(exchange -> {
-                            SoroushMessage body = exchange.getIn().getBody(SoroushMessage.class);
-                            if (body.getFileUrl() == null) {
-                                throw new AssertionError("file url is null");
-                            }
-                            if (body.getThumbnailUrl() == null) {
-                                throw new AssertionError("thumb url is null");
-                            }
-                        })
-                        .to("mock:soroush");
-            }
-        };
-    }
-
-    @Test
-    public void autoUploadTest() throws Exception {
-        SoroushMessage body = new SoroushMessage();
-        body.setType(MinorType.TEXT);
-        body.setFrom("b1");
-        body.setTo("u1");
-        String fileContent = "hello";
-        String thumbContent = "world";
-        body.setFile(new ByteArrayInputStream(fileContent.getBytes()));
-        body.setThumbnail(new ByteArrayInputStream(thumbContent.getBytes()));
-        context().createProducerTemplate().sendBody(endpoint, body);
-        MockEndpoint mockEndpoint = getMockEndpoint("mock:soroush");
-        mockEndpoint.setExpectedMessageCount(1);
-        mockEndpoint.assertIsSatisfied();
-        assertEquals(SoroushBotWS.getReceivedMessages().get(0), body, "message sent successfully");
-        SoroushMessage mockedMessage = mockEndpoint.getExchanges().get(0).getIn().getBody(SoroushMessage.class);
-        Map<String, String> fileIdToContent = SoroushBotWS.getFileIdToContent();
-        assertEquals(2, fileIdToContent.size(), "file uploaded successfully");
-        assertEquals(fileIdToContent.get(mockedMessage.getFileUrl()), fileContent);
-        assertEquals(fileIdToContent.get(mockedMessage.getThumbnailUrl()), thumbContent);
-    }
-}
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerConnectionRetryTest.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerConnectionRetryTest.java
deleted file mode 100644
index 4fc88f2..0000000
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerConnectionRetryTest.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * 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.soroushbot.component;
-
-import org.apache.camel.EndpointInject;
-import org.apache.camel.RoutesBuilder;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.models.MinorType;
-import org.apache.camel.component.soroushbot.models.SoroushAction;
-import org.apache.camel.component.soroushbot.models.SoroushMessage;
-import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
-import org.apache.camel.component.soroushbot.support.SoroushBotWS;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-public class ProducerConnectionRetryTest extends SoroushBotTestSupport {
-
-    @EndpointInject("direct:soroush")
-    org.apache.camel.Endpoint endpoint;
-
-    @Override
-    @BeforeEach
-    public void setUp() throws Exception {
-        super.setUp();
-        SoroushBotWS.clear();
-    }
-
-    @Override
-    protected RoutesBuilder createRouteBuilder() throws Exception {
-        return new RouteBuilder() {
-            @Override
-            public void configure() throws Exception {
-                from("direct:soroush").to("soroush://" + SoroushAction.sendMessage + "/retry 2?maxConnectionRetry=2")
-                        .to("mock:soroush");
-            }
-        };
-    }
-
-    @Test
-    public void retryOnFailure() throws Exception {
-        SoroushMessage body = new SoroushMessage();
-        body.setType(MinorType.TEXT);
-        body.setFrom("b1");
-        body.setTo("u1");
-        context().createProducerTemplate().sendBody(endpoint, body);
-        MockEndpoint mockEndpoint = getMockEndpoint("mock:soroush");
-        mockEndpoint.setExpectedMessageCount(1);
-        mockEndpoint.assertIsSatisfied();
-        assertEquals(SoroushBotWS.getReceivedMessages().get(0), body, "message sent successfully");
-    }
-}
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerDownloadFileTest.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerDownloadFileTest.java
deleted file mode 100644
index 78ce8ba..0000000
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerDownloadFileTest.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * 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.soroushbot.component;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-import org.apache.camel.EndpointInject;
-import org.apache.camel.RoutesBuilder;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.IOUtils;
-import org.apache.camel.component.soroushbot.models.MinorType;
-import org.apache.camel.component.soroushbot.models.SoroushAction;
-import org.apache.camel.component.soroushbot.models.SoroushMessage;
-import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
-import org.apache.camel.component.soroushbot.support.SoroushBotWS;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-@Disabled("CAMEL-13629 failing test")
-public class ProducerDownloadFileTest extends SoroushBotTestSupport {
-
-    @EndpointInject("direct:soroush")
-    org.apache.camel.Endpoint endpoint;
-
-    @Override
-    @BeforeEach
-    public void setUp() throws Exception {
-        super.setUp();
-        SoroushBotWS.clear();
-    }
-
-    @Override
-    protected RoutesBuilder createRouteBuilder() throws Exception {
-        return new RouteBuilder() {
-            @Override
-            public void configure() throws Exception {
-                from("direct:soroush").to("soroush://" + SoroushAction.sendMessage + "/token")
-                        .process(exchange -> {
-                            SoroushMessage body = exchange.getIn().getBody(SoroushMessage.class);
-                            body.setFile((InputStream) null);
-                            body.setThumbnail((InputStream) null);
-                        })
-                        .to("soroush://" + SoroushAction.downloadFile + "/token")
-                        .to("mock:soroush");
-            }
-        };
-    }
-
-    @Test
-    public void checkDownloadFile() throws InterruptedException, IOException {
-        SoroushMessage body = new SoroushMessage();
-        body.setType(MinorType.TEXT);
-        body.setFrom("b1");
-        body.setTo("u1");
-        String fileContent = "hello";
-        String thumbContent = "world";
-        body.setFile(new ByteArrayInputStream(fileContent.getBytes()));
-        body.setThumbnail(new ByteArrayInputStream(thumbContent.getBytes()));
-        context().createProducerTemplate().sendBody(endpoint, body);
-        MockEndpoint mockEndpoint = getMockEndpoint("mock:soroush");
-        mockEndpoint.setExpectedMessageCount(1);
-        mockEndpoint.assertIsSatisfied();
-        SoroushMessage mockedMessage = mockEndpoint.getExchanges().get(0).getIn().getBody(SoroushMessage.class);
-        assertEquals(new String(IOUtils.readFully(mockedMessage.getFile(), 1000, false)), fileContent,
-                "download file successfully");
-        assertEquals(new String(IOUtils.readFully(mockedMessage.getThumbnail(), 1000, false)), thumbContent,
-                "download thumbnail successfully");
-    }
-
-}
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerDownloadFileWithoutThumbnailTest.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerDownloadFileWithoutThumbnailTest.java
deleted file mode 100644
index 87f941c..0000000
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerDownloadFileWithoutThumbnailTest.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * 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.soroushbot.component;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-import org.apache.camel.EndpointInject;
-import org.apache.camel.RoutesBuilder;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.IOUtils;
-import org.apache.camel.component.soroushbot.models.MinorType;
-import org.apache.camel.component.soroushbot.models.SoroushAction;
-import org.apache.camel.component.soroushbot.models.SoroushMessage;
-import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
-import org.apache.camel.component.soroushbot.support.SoroushBotWS;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNull;
-
-@Disabled("CAMEL-13629 failing test")
-public class ProducerDownloadFileWithoutThumbnailTest extends SoroushBotTestSupport {
-
-    @EndpointInject("direct:soroush")
-    org.apache.camel.Endpoint endpoint;
-
-    @Override
-    @BeforeEach
-    public void setUp() throws Exception {
-        super.setUp();
-        SoroushBotWS.clear();
-    }
-
-    @Override
-    protected RoutesBuilder createRouteBuilder() throws Exception {
-        return new RouteBuilder() {
-            @Override
-            public void configure() throws Exception {
-                from("direct:soroush").to("soroush://" + SoroushAction.sendMessage + "/token")
-                        .process(exchange -> {
-                            SoroushMessage body = exchange.getIn().getBody(SoroushMessage.class);
-                            body.setFile((InputStream) null);
-                            body.setThumbnail((InputStream) null);
-                        })
-                        .to("soroush://" + SoroushAction.downloadFile + "/token?downloadThumbnail=false")
-                        .to("mock:soroush");
-            }
-        };
-    }
-
-    @Test
-    public void checkDownloadFile() throws InterruptedException, IOException {
-        SoroushMessage body = new SoroushMessage();
-        body.setType(MinorType.TEXT);
-        body.setFrom("b1");
-        body.setTo("u1");
-        String fileContent = "hello";
-        String thumbContent = "world";
-        body.setFile(new ByteArrayInputStream(fileContent.getBytes()));
-        body.setThumbnail(new ByteArrayInputStream(thumbContent.getBytes()));
-        context().createProducerTemplate().sendBody(endpoint, body);
-        MockEndpoint mockEndpoint = getMockEndpoint("mock:soroush");
-        mockEndpoint.setExpectedMessageCount(1);
-        mockEndpoint.assertIsSatisfied();
-        SoroushMessage mockedMessage = mockEndpoint.getExchanges().get(0).getIn().getBody(SoroushMessage.class);
-        assertEquals(new String(IOUtils.readFully(mockedMessage.getFile(), 1000, false)), fileContent,
-                "download file successfully");
-        assertNull(mockedMessage.getThumbnail(), "download thumbnail successfully");
-    }
-
-}
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerMaxConnectionRetryReachedTest.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerMaxConnectionRetryReachedTest.java
deleted file mode 100644
index f3562ac..0000000
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerMaxConnectionRetryReachedTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * 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.soroushbot.component;
-
-import org.apache.camel.CamelExecutionException;
-import org.apache.camel.EndpointInject;
-import org.apache.camel.RoutesBuilder;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.models.MinorType;
-import org.apache.camel.component.soroushbot.models.SoroushAction;
-import org.apache.camel.component.soroushbot.models.SoroushMessage;
-import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
-import org.apache.camel.component.soroushbot.support.SoroushBotWS;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-public class ProducerMaxConnectionRetryReachedTest extends SoroushBotTestSupport {
-
-    @EndpointInject("direct:soroush")
-    org.apache.camel.Endpoint endpoint;
-
-    @Override
-    @BeforeEach
-    public void setUp() throws Exception {
-        super.setUp();
-        SoroushBotWS.clear();
-    }
-
-    @Override
-    protected RoutesBuilder createRouteBuilder() throws Exception {
-        return new RouteBuilder() {
-            @Override
-            public void configure() throws Exception {
-                from("direct:soroush").to("soroush://" + SoroushAction.sendMessage + "/retry 3?maxConnectionRetry=2")
-                        .to("mock:soroush");
-            }
-        };
-    }
-
-    @Test
-    public void retryOnFailure() throws Exception {
-        SoroushMessage body = new SoroushMessage();
-        body.setType(MinorType.TEXT);
-        body.setFrom("b1");
-        body.setTo("u1");
-        boolean exceptionOccur = false;
-        try {
-            context().createProducerTemplate().sendBody(endpoint, body);
-        } catch (CamelExecutionException ex) {
-            exceptionOccur = true;
-        }
-        assertTrue(exceptionOccur, "an exception happend due to maximumConnetion try reached!");
-        MockEndpoint mockEndpoint = getMockEndpoint("mock:soroush");
-        mockEndpoint.setAssertPeriod(1000);
-        mockEndpoint.setExpectedMessageCount(0);
-        mockEndpoint.assertIsSatisfied();
-        assertEquals(0, SoroushBotWS.getReceivedMessages().size(), "message did not send");
-    }
-}
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerTest.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerTest.java
deleted file mode 100644
index 0cf8cb6..0000000
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerTest.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * 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.soroushbot.component;
-
-import org.apache.camel.EndpointInject;
-import org.apache.camel.RoutesBuilder;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.models.MinorType;
-import org.apache.camel.component.soroushbot.models.SoroushAction;
-import org.apache.camel.component.soroushbot.models.SoroushMessage;
-import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
-import org.apache.camel.component.soroushbot.support.SoroushBotWS;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-public class ProducerTest extends SoroushBotTestSupport {
-
-    @EndpointInject("direct:soroush")
-    org.apache.camel.Endpoint endpoint;
-
-    @Override
-    @BeforeEach
-    public void setUp() throws Exception {
-        super.setUp();
-        SoroushBotWS.clear();
-    }
-
-    @Override
-    protected RoutesBuilder createRouteBuilder() throws Exception {
-        return new RouteBuilder() {
-            @Override
-            public void configure() throws Exception {
-                from("direct:soroush").to("soroush://" + SoroushAction.sendMessage + "/token")
-                        .to("mock:soroush");
-            }
-        };
-    }
-
-    @Test
-    public void generalTest() throws Exception {
-        SoroushMessage body = new SoroushMessage();
-        body.setType(MinorType.TEXT);
-        body.setFrom("b1");
-        body.setTo("u1");
-        context().createProducerTemplate().sendBody(endpoint, body);
-        MockEndpoint mockEndpoint = getMockEndpoint("mock:soroush");
-        mockEndpoint.setExpectedMessageCount(1);
-        mockEndpoint.assertIsSatisfied();
-        assertEquals(SoroushBotWS.getReceivedMessages().get(0), body, "message sent successfully");
-    }
-}
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerUploadFileTest.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerUploadFileTest.java
deleted file mode 100644
index 0114051..0000000
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerUploadFileTest.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * 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.soroushbot.component;
-
-import java.io.ByteArrayInputStream;
-import java.util.Map;
-
-import org.apache.camel.EndpointInject;
-import org.apache.camel.RoutesBuilder;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.models.MinorType;
-import org.apache.camel.component.soroushbot.models.SoroushAction;
-import org.apache.camel.component.soroushbot.models.SoroushMessage;
-import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
-import org.apache.camel.component.soroushbot.support.SoroushBotWS;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-public class ProducerUploadFileTest extends SoroushBotTestSupport {
-
-    @EndpointInject("direct:soroush")
-    org.apache.camel.Endpoint endpoint;
-
-    @Override
-    @BeforeEach
-    public void setUp() throws Exception {
-        super.setUp();
-        SoroushBotWS.clear();
-    }
-
-    @Override
-    protected RoutesBuilder createRouteBuilder() throws Exception {
-        return new RouteBuilder() {
-            @Override
-            public void configure() throws Exception {
-                from("direct:soroush").to("soroush://" + SoroushAction.uploadFile + "/token")
-                        .process(exchange -> {
-                            SoroushMessage body = exchange.getIn().getBody(SoroushMessage.class);
-                            if (body.getFileUrl() == null) {
-                                throw new AssertionError("file url is null");
-                            }
-                            if (body.getThumbnailUrl() == null) {
-                                throw new AssertionError("thumb url is null");
-                            }
-                        })
-                        .to("mock:soroush");
-            }
-        };
-    }
-
-    @Test
-    public void autoUploadTest() throws Exception {
-        SoroushMessage body = new SoroushMessage();
-        body.setType(MinorType.TEXT);
-        body.setFrom("b1");
-        body.setTo("u1");
-        String fileContent = "hello";
-        String thumbContent = "world";
-        body.setFile(new ByteArrayInputStream(fileContent.getBytes()));
-        body.setThumbnail(new ByteArrayInputStream(thumbContent.getBytes()));
-        context().createProducerTemplate().sendBody(endpoint, body);
-        MockEndpoint mockEndpoint = getMockEndpoint("mock:soroush");
-        mockEndpoint.setExpectedMessageCount(1);
-        mockEndpoint.assertIsSatisfied();
-        assertEquals(0, SoroushBotWS.getReceivedMessages().size(), "no message sent.");
-        SoroushMessage mockedMessage = mockEndpoint.getExchanges().get(0).getIn().getBody(SoroushMessage.class);
-        Map<String, String> fileIdToContent = SoroushBotWS.getFileIdToContent();
-        assertEquals(2, fileIdToContent.size(), "file uploaded successfully");
-        assertEquals(fileIdToContent.get(mockedMessage.getFileUrl()), fileContent);
-        assertEquals(fileIdToContent.get(mockedMessage.getThumbnailUrl()), thumbContent);
-    }
-
-}
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/service/SoroushServiceIT.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/service/SoroushServiceIT.java
deleted file mode 100644
index 7ead4c2..0000000
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/service/SoroushServiceIT.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * 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.soroushbot.service;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-import javax.ws.rs.client.Client;
-import javax.ws.rs.client.ClientBuilder;
-import javax.ws.rs.client.Entity;
-import javax.ws.rs.client.WebTarget;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-import org.apache.camel.component.soroushbot.IOUtils;
-import org.apache.camel.component.soroushbot.models.MinorType;
-import org.apache.camel.component.soroushbot.models.SoroushAction;
-import org.apache.camel.component.soroushbot.models.SoroushMessage;
-import org.apache.camel.component.soroushbot.models.response.UploadFileResponse;
-import org.apache.camel.component.soroushbot.utils.SoroushException;
-import org.glassfish.jersey.client.ClientProperties;
-import org.glassfish.jersey.media.multipart.MultiPart;
-import org.glassfish.jersey.media.multipart.file.StreamDataBodyPart;
-import org.glassfish.jersey.media.sse.EventInput;
-import org.glassfish.jersey.media.sse.InboundEvent;
-import org.glassfish.jersey.media.sse.SseFeature;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
-import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariables;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertNull;
-
-/**
- * check if soroush BOT Api work as expected
- */
-@EnabledIfEnvironmentVariables({
-        @EnabledIfEnvironmentVariable(named = "soroushBotAuthorizationToken", matches = ".*",
-                                      disabledReason = "Bot authorization token is required"),
-        @EnabledIfEnvironmentVariable(named = "soroushBotReceiverId", matches = ".*",
-                                      disabledReason = "Bot receiver ID is required")
-})
-
-public class SoroushServiceIT {
-    static String authorizationToken;
-    static String receiverId;
-    private static SoroushService soroushService;
-
-    @BeforeAll
-    public static void setUp() {
-        authorizationToken = System.getenv("soroushBotAuthorizationToken");
-        receiverId = System.getenv("soroushBotReceiverId");
-
-        soroushService = SoroushService.get();
-        soroushService.setAlternativeUrl(null);
-    }
-
-    /**
-     * try to connect to soroush. if any problem occurs an exception will throw and this test will fail.
-     */
-    @Test
-    public void connectToGetMessageEndPoint() {
-        Client client = ClientBuilder.newBuilder().register(SseFeature.class).build();
-        client.property(ClientProperties.CONNECT_TIMEOUT, 2000);
-        WebTarget target = client.target(soroushService.generateUrl(authorizationToken, SoroushAction.getMessage, null));
-        EventInput eventInput = target.request().get(EventInput.class);
-        eventInput.setChunkType(MediaType.SERVER_SENT_EVENTS);
-        assertFalse(eventInput.isClosed());
-    }
-
-    @Test
-    public void canNotReadMessageDueToWrongAuthorizationToken() {
-        Client client = ClientBuilder.newBuilder().register(SseFeature.class).build();
-        client.property(ClientProperties.CONNECT_TIMEOUT, 2000);
-        WebTarget target
-                = client.target(soroushService.generateUrl("bad_string" + authorizationToken, SoroushAction.getMessage, null));
-        EventInput eventInput = target.request().get(EventInput.class);
-        eventInput.setChunkType(MediaType.SERVER_SENT_EVENTS);
-        assertFalse(eventInput.isClosed());
-        InboundEvent read = eventInput.read();
-        assertNull(read);
-    }
-
-    @Test
-    public void sendMessageToAPerson() throws IOException, SoroushException {
-        WebTarget target = soroushService.createSendMessageTarget(authorizationToken, 2000);
-        SoroushMessage message = new SoroushMessage();
-        message.setBody("content");
-        message.setTo(receiverId);
-        message.setType(MinorType.TEXT);
-        Response response = target.request(MediaType.APPLICATION_JSON_TYPE).post(Entity.json(message));
-        soroushService.assertSuccessful(response, null);
-
-    }
-
-    @Test
-    public void uploadAndDownloadFile() throws IOException, SoroushException {
-        WebTarget target = soroushService.createUploadFileTarget(authorizationToken, 2000);
-        MultiPart multipart = new MultiPart();
-        multipart.setMediaType(MediaType.MULTIPART_FORM_DATA_TYPE);
-        String fileData = "data";
-        multipart.bodyPart(new StreamDataBodyPart(
-                "file", new ByteArrayInputStream(fileData.getBytes()), null, MediaType.APPLICATION_OCTET_STREAM_TYPE));
-        Response response = target.request(MediaType.APPLICATION_JSON_TYPE)
-                .post(Entity.entity(multipart, multipart.getMediaType()));
-        UploadFileResponse uploadFileResponse = soroushService.assertSuccessful(response, UploadFileResponse.class, null);
-        assertNotNull(uploadFileResponse.getFileUrl());
-
-        WebTarget downloadFileTarget
-                = soroushService.createDownloadFileTarget(authorizationToken, uploadFileResponse.getFileUrl(), 2000);
-        Response downloadResponse = downloadFileTarget.request().get();
-        String remoteData = new String(IOUtils.readFully(downloadResponse.readEntity(InputStream.class), -1, false));
-        assertEquals(fileData, remoteData, "file contents are identical");
-
-    }
-}
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/support/SoroushBotApplication.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/support/SoroushBotApplication.java
deleted file mode 100644
index b737fcf..0000000
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/support/SoroushBotApplication.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * 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.soroushbot.support;
-
-import javax.ws.rs.ApplicationPath;
-
-import org.glassfish.jersey.jackson.JacksonFeature;
-import org.glassfish.jersey.media.multipart.MultiPartFeature;
-import org.glassfish.jersey.media.sse.SseFeature;
-import org.glassfish.jersey.server.ResourceConfig;
-
-@ApplicationPath("/")
-public class SoroushBotApplication extends ResourceConfig {
-    public SoroushBotApplication() {
-        //register sse event for
-        register(SseFeature.class);
-        register(JacksonFeature.class);
-        register(MultiPartFeature.class);
-    }
-}
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/support/SoroushBotTestSupport.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/support/SoroushBotTestSupport.java
deleted file mode 100644
index c6fa0f7..0000000
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/support/SoroushBotTestSupport.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * 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.soroushbot.support;
-
-import org.apache.camel.component.soroushbot.service.SoroushService;
-import org.apache.camel.test.junit5.CamelTestSupport;
-import org.apache.logging.log4j.LogManager;
-import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.BeforeAll;
-
-/**
- * A support test class for Soroush Bot tests.
- */
-public class SoroushBotTestSupport extends CamelTestSupport {
-
-    private static SoroushMockServer soroushMockServer;
-
-    @BeforeAll
-    public static void init() throws Exception {
-        if (soroushMockServer == null) {
-            soroushMockServer = new SoroushMockServer();
-            soroushMockServer.start();
-        }
-        int port = soroushMockServer.getPort();
-        SoroushService.get().setAlternativeUrl("http://localhost:" + port);
-        LogManager.getLogger().info("soroushMockServer is up on port " + port);
-    }
-
-    @AfterAll
-    public static void afterClass() {
-        SoroushService.get().setAlternativeUrl(null);
-    }
-}
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/support/SoroushBotWS.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/support/SoroushBotWS.java
deleted file mode 100644
index 3e6697c..0000000
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/support/SoroushBotWS.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * 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.soroushbot.support;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.security.SecureRandom;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Scanner;
-import java.util.UUID;
-import java.util.concurrent.ConcurrentHashMap;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.StreamingOutput;
-import javax.ws.rs.sse.SseEventSink;
-
-import org.apache.camel.component.soroushbot.IOUtils;
-import org.apache.camel.component.soroushbot.models.SoroushMessage;
-import org.apache.camel.component.soroushbot.models.response.SoroushResponse;
-import org.apache.camel.component.soroushbot.models.response.UploadFileResponse;
-import org.apache.logging.log4j.LogManager;
-import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
-import org.glassfish.jersey.media.multipart.FormDataParam;
-import org.glassfish.jersey.media.sse.OutboundEvent;
-
-@Path("/")
-@Produces(MediaType.APPLICATION_JSON)
-public class SoroushBotWS {
-    static SecureRandom random = new SecureRandom();
-    static Map<String, Integer> tokenCount = new ConcurrentHashMap<>();
-    static List<SoroushMessage> receivedMessages = new ArrayList<>();
-    static Map<String, String> fileIdToContent = new ConcurrentHashMap<>();
-    List<String> userIds = new ArrayList<>();
-    String botId = "botId";
-
-    public SoroushBotWS() {
-        //users of system
-        for (int i = 0; i < 4; i++) {
-            userIds.add("u" + i);
-        }
-    }
-
-    public static List<SoroushMessage> getReceivedMessages() {
-        return receivedMessages;
-    }
-
-    public static Map<String, String> getFileIdToContent() {
-        return fileIdToContent;
-    }
-
-    public static void clear() {
-        receivedMessages.clear();
-        fileIdToContent.clear();
-        tokenCount.clear();
-    }
-
-    @GET
-    @Path("{token}/getMessage")
-    @Produces(MediaType.SERVER_SENT_EVENTS)
-    public void getMessage(@PathParam("token") String token, @Context SseEventSink sink) {
-        int messageCount = getNumberOfMessage(token);
-        int delay = getMessageDelay(token);
-        LogManager.getLogger().info("new connection for getting " + messageCount + " message");
-        final boolean withFile = token.toLowerCase().contains("file");
-        //        final EventOutput eventOutput = new EventOutput();
-        new Thread(() -> {
-            try {
-                for (int i = 0; i < messageCount; i++) {
-                    final OutboundEvent.Builder eventBuilder
-                            = new OutboundEvent.Builder();
-                    eventBuilder.id(UUID.randomUUID().toString());
-                    eventBuilder.data(SoroushMessage.class, getSoroushMessage(i, withFile));
-                    eventBuilder.mediaType(MediaType.APPLICATION_JSON_TYPE);
-                    final OutboundEvent event = eventBuilder.build();
-                    if (!sink.isClosed()) {
-                        sink.send(event);
-                    }
-                    //                    eventOutput.write(event);
-                    Thread.sleep(delay);
-                }
-                if (token.toLowerCase().contains("close")) {
-                    sink.close();
-                }
-            } catch (InterruptedException e) {
-                // ignore
-            }
-        }).start();
-    }
-
-    private int getMessageDelay(String token) {
-        Scanner s = new Scanner(token);
-        while (s.hasNext()) {
-            if ("delay".equalsIgnoreCase(s.next())) {
-                if (s.hasNextInt()) {
-                    return s.nextInt();
-                }
-            }
-        }
-        return 10;
-    }
-
-    @POST
-    @Path("{token}/sendMessage")
-    public Response sendMessage(SoroushMessage soroushMessage, @PathParam("token") String token) {
-        String tokenLower = token.toLowerCase();
-        Scanner s = new Scanner(tokenLower);
-        if (s.next().equals("retry")) {
-            int retryCount = s.nextInt();
-            Integer currentCount = tokenCount.getOrDefault(tokenLower, 0);
-            if (currentCount < retryCount) {
-                tokenCount.put(tokenLower, currentCount + 1);
-                return Response.status(Response.Status.SERVICE_UNAVAILABLE).build();
-            }
-
-        }
-        receivedMessages.add(soroushMessage);
-        return Response.ok(new SoroushResponse(200, "OK")).build();
-    }
-
-    @POST
-    @Path("{token}/uploadFile")
-    @Consumes(MediaType.MULTIPART_FORM_DATA)
-    public Response uploadFile(
-            @PathParam("token") String token,
-            @FormDataParam("file") InputStream fileInputStream,
-            @FormDataParam("file") FormDataContentDisposition fileMetaData)
-            throws IOException {
-        String key = Integer.toString(random.nextInt());
-        fileIdToContent.put(key, new String(IOUtils.readFully(fileInputStream, -1, false)));
-        return Response.ok(new UploadFileResponse(200, "OK", key)).build();
-    }
-
-    @GET
-    @Path("{token}/downloadFile/{key}")
-    @Produces(MediaType.APPLICATION_OCTET_STREAM)
-    public Response downloadFile(@PathParam("token") String token, @PathParam("key") String key) {
-        String content = fileIdToContent.get(key);
-        if (content == null) {
-            return Response.status(404).build();
-        }
-        StreamingOutput fileStream = new StreamingOutput() {
-            @Override
-            public void write(java.io.OutputStream output) throws IOException, WebApplicationException {
-                try {
-                    output.write(content.getBytes());
-                    output.flush();
-                    output.close();
-                } catch (Exception e) {
-                    throw new WebApplicationException("File Not Found !!");
-                }
-            }
-        };
-        return Response
-                .ok(fileStream, MediaType.APPLICATION_OCTET_STREAM)
-                .header("content-disposition", "attachment; filename = file")
-                .build();
-    }
-
-    private int getNumberOfMessage(String token) {
-        token = token.replaceAll("[^0-9]", " ");
-        Scanner s = new Scanner(token);
-        if (s.hasNextInt()) {
-            return s.nextInt();
-        }
-        return 10;
-    }
-
-    private SoroushMessage getSoroushMessage(int i, boolean withFile) {
-        SoroushMessage message = new SoroushMessage();
-        message.setFrom(userIds.get(i % 4));
-        message.setTo(botId);
-        message.setBody("message body " + i);
-        if (withFile && i % 4 != 0) {
-            String key = Integer.toString(random.nextInt());
-            fileIdToContent.put(key, Integer.toString(random.nextInt()));
-            message.setFileUrl(key);
-            if (i % 2 != 0) {
-                String thumbnailKey = Integer.toString(random.nextInt());
-                fileIdToContent.put(thumbnailKey, Integer.toString(random.nextInt()));
-                message.setFileUrl(thumbnailKey);
-            }
-        }
-        return message;
-    }
-}
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/support/SoroushMockServer.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/support/SoroushMockServer.java
deleted file mode 100644
index fe32c30..0000000
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/support/SoroushMockServer.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * 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.soroushbot.support;
-
-import org.apache.camel.test.AvailablePortFinder;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.servlet.ServletContextHandler;
-import org.eclipse.jetty.servlet.ServletHolder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class SoroushMockServer extends Thread {
-    private static final Logger LOG = LoggerFactory.getLogger(SoroushMockServer.class);
-
-    private Server jettyServer;
-    private Integer port = AvailablePortFinder.getNextAvailable();
-
-    @Override
-    public void start() {
-        ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
-        context.setContextPath("/");
-
-        if (port == null) {
-            port = 0;
-        }
-        jettyServer = new Server(port);
-
-        jettyServer.setHandler(context);
-
-        ServletHolder jerseyServlet = context.addServlet(
-                org.glassfish.jersey.servlet.ServletContainer.class, "/*");
-        jerseyServlet.setInitOrder(0);
-
-        // Tells the Jersey Servlet which REST service/class to load.
-        jerseyServlet.setInitParameter(
-                "jersey.config.server.provider.classnames",
-                SoroushBotWS.class.getCanonicalName());
-        jerseyServlet.setInitParameter("javax.ws.rs.Application", SoroushBotApplication.class.getCanonicalName());
-        if (!jettyServer.isStarted()) {
-            try {
-                jettyServer.start();
-                port = jettyServer.getURI().getPort();
-            } catch (Exception e) {
-                LOG.warn("Failed to start the Jetty server: {}", e.getMessage(), e);
-            }
-        }
-    }
-
-    public Integer getPort() {
-        return port;
-    }
-
-    public void setPort(Integer port) {
-        this.port = port;
-    }
-}
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/utils/MultiQueueWithTopicThreadPoolTest.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/utils/MultiQueueWithTopicThreadPoolTest.java
deleted file mode 100644
index c360e7b..0000000
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/utils/MultiQueueWithTopicThreadPoolTest.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * 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.soroushbot.utils;
-
-import java.util.concurrent.LinkedBlockingQueue;
-
-import org.junit.jupiter.api.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import static org.junit.jupiter.api.Assertions.assertArrayEquals;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-
-public class MultiQueueWithTopicThreadPoolTest {
-    private static final Logger LOG = LoggerFactory.getLogger(MultiQueueWithTopicThreadPoolTest.class);
-
-    @Test
-    public void singleThreadSuccessful() throws InterruptedException {
-        LinkedBlockingQueue<Integer> finalResultsOrder = new LinkedBlockingQueue<>();
-        int capacity = 10;
-        Integer[] results = new Integer[capacity];
-        for (int i = 0; i < capacity; i++) {
-            results[i] = i;
-        }
-        MultiQueueWithTopicThreadPool pool = new MultiQueueWithTopicThreadPool(1, capacity, "test");
-        for (int i = 0; i < capacity; i++) {
-            int finalI = i;
-            pool.execute(i % 2, () -> {
-                try {
-                    Thread.sleep((capacity - finalI) * 100);
-                    finalResultsOrder.add(finalI);
-                } catch (InterruptedException e) {
-                    LOG.warn("Interrupted while running the test", e);
-                }
-            });
-        }
-        Thread.sleep(capacity * (capacity + 2) * 100 / 2); // wait enough time for all task to be done
-        assertArrayEquals(results, finalResultsOrder.toArray(), "order of thread that executed is not what is expected");
-    }
-
-    @Test
-    public void singleThreadPoolSizeExceeded() {
-        assertThrows(IllegalStateException.class, () -> {
-            int capacity = 10;
-            MultiQueueWithTopicThreadPool pool = new MultiQueueWithTopicThreadPool(1, capacity, "test");
-            for (int i = 0; i < capacity + 2; i++) {
-                pool.execute(i % 3, () -> {
-                    try {
-                        Thread.sleep(100);
-                    } catch (InterruptedException e) {
-                        LOG.warn("Interrupted while running the test", e);
-                    }
-                });
-            }
-        });
-    }
-
-    @Test
-    public void multiThreadEndOrderSuccessful() throws InterruptedException {
-        LinkedBlockingQueue<Integer> finalResultsOrder = new LinkedBlockingQueue<>();
-        int totalJobs = 9;
-        Integer[] results = new Integer[totalJobs];
-        for (int i = 0; i < totalJobs / 3; i++) {
-            /**
-             * 0 1 2 3 4 5 6 7 8 0 3 6 1 4 7 2 5 8 <- start order should be this
-             */
-            results[i] = i * 3;
-            results[i + 3] = 3 * i + 1;
-            results[i + 6] = 3 * i + 2;
-        }
-        MultiQueueWithTopicThreadPool pool = new MultiQueueWithTopicThreadPool(3, totalJobs, "test");
-        for (int i = 0; i < totalJobs; i++) {
-            int finalI = i;
-            pool.execute(i % 3, () -> {
-                try {
-                    int mod3 = finalI % 3;
-                    Thread.sleep((mod3 == 0 ? 1 : mod3 == 1 ? 4 : 13) * 10);
-                    finalResultsOrder.add(finalI);
-                } catch (InterruptedException e) {
-                    LOG.warn("Interrupted while running the test", e);
-                }
-            });
-        }
-        Thread.sleep(130 * 3 + 500); // wait enough time for all task to be done
-        assertArrayEquals(results, finalResultsOrder.toArray(),
-                "order of thread that executed is not what is expected");
-    }
-
-    @Test
-    public void multiThreadStartOrderSuccessful() throws InterruptedException {
-        LinkedBlockingQueue<Integer> finalResultsOrder = new LinkedBlockingQueue<>();
-        int totalJobs = 9;
-        Integer[] expectedResults = new Integer[totalJobs];
-        expectedResults[3] = 3;
-        expectedResults[4] = 6;
-        expectedResults[5] = 4;
-        expectedResults[6] = 7;
-        expectedResults[7] = 5;
-        expectedResults[8] = 8;
-        MultiQueueWithTopicThreadPool pool = new MultiQueueWithTopicThreadPool(3, totalJobs, "test");
-        for (int i = 0; i < totalJobs; i++) {
-            int finalI = i;
-            pool.execute(i % 3, () -> {
-                try {
-                    int mod3 = finalI % 3;
-                    finalResultsOrder.add(finalI);
-                    Thread.sleep((mod3 == 0 ? 1 : mod3 == 1 ? 4 : 13) * 10);
-                } catch (InterruptedException e) {
-                    LOG.warn("Interrupted while running the test", e);
-                }
-            });
-        }
-        Thread.sleep(130 * 3 + 100); // wait enough time for all task to be done
-        Object[] finalResultsOrderList = finalResultsOrder.toArray();
-        //order of first three job is not fully determined so we set them to null
-        finalResultsOrderList[0] = finalResultsOrderList[1] = finalResultsOrderList[2] = null;
-        assertArrayEquals(expectedResults, finalResultsOrderList,
-                "order of thread that executed is not what is expected");
-    }
-
-    @Test
-    public void multiThreadPoolSizeExceeded() throws InterruptedException {
-        assertThrows(IllegalStateException.class, () -> {
-            LinkedBlockingQueue<Integer> finalResultsOrder = new LinkedBlockingQueue<>();
-            int capacity = 3;
-            int poolSize = 3;
-            MultiQueueWithTopicThreadPool pool = new MultiQueueWithTopicThreadPool(poolSize, capacity, "test");
-            for (int i = 0; i < (capacity + 1) * poolSize + 1; i++) {
-                pool.execute(i % poolSize, () -> {
-                    try {
-                        Thread.sleep(100);
-                    } catch (InterruptedException e) {
-                        LOG.warn("Interrupted while running the test", e);
-                    }
-                });
-            }
-            Thread.sleep(100);
-        });
-    }
-}
diff --git a/components/camel-soroush/src/test/resources/log4j2.properties b/components/camel-soroush/src/test/resources/log4j2.properties
deleted file mode 100644
index 14a3cf6..0000000
--- a/components/camel-soroush/src/test/resources/log4j2.properties
+++ /dev/null
@@ -1,27 +0,0 @@
-## ---------------------------------------------------------------------------
-## 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.
-## ---------------------------------------------------------------------------
-appender.file.type = File
-appender.file.name = file
-appender.file.fileName = target/camel-soroush-test.log
-appender.file.layout.type = PatternLayout
-appender.file.layout.pattern = %d [%-15.15t] %-5p %-30.30c{1} - %m%n
-appender.out.type = Console
-appender.out.name = out
-appender.out.layout.type = PatternLayout
-appender.out.layout.pattern = %d [%-15.15t] %-5p %-30.30c{1} - %m%n
-rootLogger.level = INFO
-rootLogger.appenderRef.file.ref = file
\ No newline at end of file
diff --git a/components/pom.xml b/components/pom.xml
index c3fd69a..fb8f3f8 100644
--- a/components/pom.xml
+++ b/components/pom.xml
@@ -296,7 +296,6 @@
         <module>camel-snmp</module>
         <module>camel-soap</module>
         <module>camel-solr</module>
-        <module>camel-soroush</module>
         <module>camel-spark</module>
         <module>camel-splunk</module>
         <module>camel-splunk-hec</module>
diff --git a/core/camel-main/src/generated/resources/org/apache/camel/main/components.properties b/core/camel-main/src/generated/resources/org/apache/camel/main/components.properties
index 694cd8d..a6110fd 100644
--- a/core/camel-main/src/generated/resources/org/apache/camel/main/components.properties
+++ b/core/camel-main/src/generated/resources/org/apache/camel/main/components.properties
@@ -294,7 +294,6 @@ snmp
 solr
 solrCloud
 solrs
-soroush
 spark
 splunk
 splunk-hec
diff --git a/docs/components/modules/ROOT/examples/json/soroush.json b/docs/components/modules/ROOT/examples/json/soroush.json
deleted file mode 120000
index e5f0505..0000000
--- a/docs/components/modules/ROOT/examples/json/soroush.json
+++ /dev/null
@@ -1 +0,0 @@
-../../../../../../components/camel-soroush/src/generated/resources/org/apache/camel/component/soroushbot/component/soroush.json
\ No newline at end of file
diff --git a/docs/components/modules/ROOT/nav.adoc b/docs/components/modules/ROOT/nav.adoc
index 711cb7b..11906ab 100644
--- a/docs/components/modules/ROOT/nav.adoc
+++ b/docs/components/modules/ROOT/nav.adoc
@@ -296,7 +296,6 @@
 ** xref:smpp-component.adoc[SMPP]
 ** xref:snmp-component.adoc[SNMP]
 ** xref:solr-component.adoc[Solr]
-** xref:soroush-component.adoc[Soroush]
 ** xref:spark-component.adoc[Spark]
 ** xref:splunk-component.adoc[Splunk]
 ** xref:splunk-hec-component.adoc[Splunk HEC]
diff --git a/docs/components/modules/ROOT/pages/soroush-component.adoc b/docs/components/modules/ROOT/pages/soroush-component.adoc
deleted file mode 120000
index a911948..0000000
--- a/docs/components/modules/ROOT/pages/soroush-component.adoc
+++ /dev/null
@@ -1 +0,0 @@
-../../../../../components/camel-soroush/src/main/docs/soroush-component.adoc
\ No newline at end of file
diff --git a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java
index 691e47b..bb62055 100644
--- a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java
+++ b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java
@@ -3997,20 +3997,6 @@ public interface ComponentsBuilderFactory {
         return org.apache.camel.builder.component.dsl.SolrsComponentBuilderFactory.solrs();
     }
     /**
-     * Soroush (camel-soroush)
-     * Send and receive messages as a Soroush chat bot.
-     * 
-     * Category: chat
-     * Since: 3.0
-     * Maven coordinates: org.apache.camel:camel-soroush
-     * 
-     * @return the dsl builder
-     */
-    @Deprecated
-    static org.apache.camel.builder.component.dsl.SoroushComponentBuilderFactory.SoroushComponentBuilder soroush() {
-        return org.apache.camel.builder.component.dsl.SoroushComponentBuilderFactory.soroush();
-    }
-    /**
      * Spark (camel-spark)
      * Send RDD or DataFrame jobs to Apache Spark clusters.
      * 
diff --git a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/SoroushComponentBuilderFactory.java b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/SoroushComponentBuilderFactory.java
deleted file mode 100644
index f115a47..0000000
--- a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/SoroushComponentBuilderFactory.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * 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.builder.component.dsl;
-
-import javax.annotation.Generated;
-import org.apache.camel.Component;
-import org.apache.camel.builder.component.AbstractComponentBuilder;
-import org.apache.camel.builder.component.ComponentBuilder;
-import org.apache.camel.component.soroushbot.component.SoroushBotComponent;
-
-/**
- * Send and receive messages as a Soroush chat bot.
- * 
- * Generated by camel-package-maven-plugin - do not edit this file!
- */
-@Generated("org.apache.camel.maven.packaging.ComponentDslMojo")
-public interface SoroushComponentBuilderFactory {
-
-    /**
-     * Soroush (camel-soroush)
-     * Send and receive messages as a Soroush chat bot.
-     * 
-     * Category: chat
-     * Since: 3.0
-     * Maven coordinates: org.apache.camel:camel-soroush
-     * 
-     * @return the dsl builder
-     */
-    @Deprecated
-    static SoroushComponentBuilder soroush() {
-        return new SoroushComponentBuilderImpl();
-    }
-
-    /**
-     * Builder for the Soroush component.
-     */
-    interface SoroushComponentBuilder
-            extends
-                ComponentBuilder<SoroushBotComponent> {
-        /**
-         * Allows for bridging the consumer to the Camel routing Error Handler,
-         * which mean any exceptions occurred while the consumer is trying to
-         * pickup incoming messages, or the likes, will now be processed as a
-         * message and handled by the routing Error Handler. By default the
-         * consumer will use the org.apache.camel.spi.ExceptionHandler to deal
-         * with exceptions, that will be logged at WARN or ERROR level and
-         * ignored.
-         * 
-         * The option is a: &lt;code&gt;boolean&lt;/code&gt; type.
-         * 
-         * Default: false
-         * Group: consumer
-         * 
-         * @param bridgeErrorHandler the value to set
-         * @return the dsl builder
-         */
-        default SoroushComponentBuilder bridgeErrorHandler(
-                boolean bridgeErrorHandler) {
-            doSetProperty("bridgeErrorHandler", bridgeErrorHandler);
-            return this;
-        }
-        /**
-         * 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 fail during
-         * starting and cause the route to fail being started. By deferring this
-         * startup to be lazy then the startup failure can be handled during
-         * routing messages via Camel's routing error handlers. Beware that when
-         * the first message is processed then creating and starting the
-         * producer may take a little time and prolong the total processing time
-         * of the processing.
-         * 
-         * The option is a: &lt;code&gt;boolean&lt;/code&gt; type.
-         * 
-         * Default: false
-         * Group: producer
-         * 
-         * @param lazyStartProducer the value to set
-         * @return the dsl builder
-         */
-        default SoroushComponentBuilder lazyStartProducer(
-                boolean lazyStartProducer) {
-            doSetProperty("lazyStartProducer", lazyStartProducer);
-            return this;
-        }
-        /**
-         * Whether autowiring is enabled. This is used for automatic autowiring
-         * options (the option must be marked as autowired) by looking up in the
-         * registry to find if there is a single instance of matching type,
-         * which then gets configured on the component. This can be used for
-         * automatic configuring JDBC data sources, JMS connection factories,
-         * AWS Clients, etc.
-         * 
-         * The option is a: &lt;code&gt;boolean&lt;/code&gt; type.
-         * 
-         * Default: true
-         * Group: advanced
-         * 
-         * @param autowiredEnabled the value to set
-         * @return the dsl builder
-         */
-        default SoroushComponentBuilder autowiredEnabled(
-                boolean autowiredEnabled) {
-            doSetProperty("autowiredEnabled", autowiredEnabled);
-            return this;
-        }
-        /**
-         * The default Soroush authorization token to be used when the
-         * information is not provided in the endpoints.
-         * 
-         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
-         * 
-         * Group: global
-         * 
-         * @param authorizationToken the value to set
-         * @return the dsl builder
-         */
-        default SoroushComponentBuilder authorizationToken(
-                java.lang.String authorizationToken) {
-            doSetProperty("authorizationToken", authorizationToken);
-            return this;
-        }
-    }
-
-    class SoroushComponentBuilderImpl
-            extends
-                AbstractComponentBuilder<SoroushBotComponent>
-            implements
-                SoroushComponentBuilder {
-        @Override
-        protected SoroushBotComponent buildConcreteComponent() {
-            return new SoroushBotComponent();
-        }
-        @Override
-        protected boolean setPropertyOnComponent(
-                Component component,
-                String name,
-                Object value) {
-            switch (name) {
-            case "bridgeErrorHandler": ((SoroushBotComponent) component).setBridgeErrorHandler((boolean) value); return true;
-            case "lazyStartProducer": ((SoroushBotComponent) component).setLazyStartProducer((boolean) value); return true;
-            case "autowiredEnabled": ((SoroushBotComponent) component).setAutowiredEnabled((boolean) value); return true;
-            case "authorizationToken": ((SoroushBotComponent) component).setAuthorizationToken((java.lang.String) value); return true;
-            default: return false;
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/dsl/camel-componentdsl/src/generated/resources/metadata.json b/dsl/camel-componentdsl/src/generated/resources/metadata.json
index 54138c9..0c4dd94 100644
--- a/dsl/camel-componentdsl/src/generated/resources/metadata.json
+++ b/dsl/camel-componentdsl/src/generated/resources/metadata.json
@@ -6571,28 +6571,6 @@
     "producerOnly": true,
     "lenientProperties": false
   },
-  "SoroushComponentBuilderFactory": {
-    "kind": "component",
-    "name": "soroush",
-    "title": "Soroush",
-    "description": "Send and receive messages as a Soroush chat bot.",
-    "deprecated": true,
-    "firstVersion": "3.0",
-    "label": "chat",
-    "javaType": "org.apache.camel.component.soroushbot.component.SoroushBotComponent",
-    "supportLevel": "Stable",
-    "groupId": "org.apache.camel",
-    "artifactId": "camel-soroush",
-    "version": "3.17.0-SNAPSHOT",
-    "scheme": "soroush",
-    "extendsScheme": "",
-    "syntax": "soroush:action",
-    "async": false,
-    "api": false,
-    "consumerOnly": false,
-    "producerOnly": false,
-    "lenientProperties": false
-  },
   "SparkComponentBuilderFactory": {
     "kind": "component",
     "name": "spark",
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/EndpointConsumerDeserializersResolver.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/EndpointConsumerDeserializersResolver.java
index 79a8cd3..8de81f1 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/EndpointConsumerDeserializersResolver.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/EndpointConsumerDeserializersResolver.java
@@ -189,7 +189,6 @@ public final class EndpointConsumerDeserializersResolver implements YamlDeserial
             case "smtp":
             case "smtps":
             case "snmp":
-            case "soroush":
             case "splunk":
             case "spring-event":
             case "spring-integration":
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/EndpointProducerDeserializersResolver.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/EndpointProducerDeserializersResolver.java
index 7bfd5c8..0c70bd7 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/EndpointProducerDeserializersResolver.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/EndpointProducerDeserializersResolver.java
@@ -285,7 +285,6 @@ public final class EndpointProducerDeserializersResolver implements YamlDeserial
             case "solr":
             case "solrCloud":
             case "solrs":
-            case "soroush":
             case "spark":
             case "splunk":
             case "splunk-hec":
diff --git a/parent/pom.xml b/parent/pom.xml
index 03167a8..3da651c 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -306,7 +306,6 @@
         <jcommander-version>1.72</jcommander-version>
         <jcr-version>2.0</jcr-version>
         <jedis-client-version>3.7.1</jedis-client-version>
-        <jersey-version>2.35</jersey-version>
         <jetcd-version>0.5.11</jetcd-version>
         <jetty9-version>9.4.45.v20220203</jetty9-version>
         <jetty-version>${jetty9-version}</jetty-version>
@@ -2416,11 +2415,6 @@
 			</dependency>
 			<dependency>
 				<groupId>org.apache.camel</groupId>
-				<artifactId>camel-soroush</artifactId>
-				<version>${project.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.apache.camel</groupId>
 				<artifactId>camel-spark</artifactId>
 				<version>${project.version}</version>
 			</dependency>