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

[camel-quarkus] branch master updated: Unable to use Salesforce DTOs in native mode

This is an automated email from the ASF dual-hosted git repository.

jamesnetherton pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git


The following commit(s) were added to refs/heads/master by this push:
     new b2e9f07  Unable to use Salesforce DTOs in native mode
b2e9f07 is described below

commit b2e9f077e4fb98baf271375d7ac11c9437639e97
Author: James Netherton <ja...@gmail.com>
AuthorDate: Thu Mar 4 10:21:52 2021 +0000

    Unable to use Salesforce DTOs in native mode
    
    Fixes #2312
---
 extensions/salesforce/deployment/pom.xml           |   8 +
 .../salesforce/deployment/SalesforceProcessor.java |  53 +-
 extensions/salesforce/runtime/pom.xml              |   8 +
 integration-tests/salesforce/README.adoc           |  18 +
 integration-tests/salesforce/pom.xml               |  35 +
 .../component/salesforce/SalesforceResource.java   | 123 +++
 .../component/salesforce/SalesforceRoutes.java}    |  24 +-
 .../component/salesforce/generated/Account.java    | 983 +++++++++++++++++++++
 .../generated/Account_AccountSourceEnum.java       |  65 ++
 .../salesforce/generated/Account_ActiveEnum.java   |  56 ++
 .../Account_BillingGeocodeAccuracyEnum.java        |  83 ++
 .../generated/Account_CleanStatusEnum.java         |  74 ++
 .../generated/Account_CustomerPriorityEnum.java    |  59 ++
 .../salesforce/generated/Account_IndustryEnum.java | 146 +++
 .../generated/Account_MyMultiselectEnum.java       |  59 ++
 .../generated/Account_OwnershipEnum.java           |  62 ++
 .../salesforce/generated/Account_RatingEnum.java   |  59 ++
 .../salesforce/generated/Account_SLAEnum.java      |  62 ++
 .../Account_ShippingGeocodeAccuracyEnum.java       |  83 ++
 .../salesforce/generated/Account_TypeEnum.java     |  71 ++
 .../generated/Account_UpsellOpportunityEnum.java   |  59 ++
 .../salesforce/generated/QueryRecordsAccount.java  |  42 +
 .../component/salesforce/SalesforceTest.java       |  94 +-
 poms/build-parent-it/pom.xml                       |   5 +
 24 files changed, 2282 insertions(+), 49 deletions(-)

diff --git a/extensions/salesforce/deployment/pom.xml b/extensions/salesforce/deployment/pom.xml
index 2457d02..54df5a4 100644
--- a/extensions/salesforce/deployment/pom.xml
+++ b/extensions/salesforce/deployment/pom.xml
@@ -30,6 +30,14 @@
 
     <dependencies>
         <dependency>
+            <groupId>io.quarkus</groupId>
+            <artifactId>quarkus-jackson-deployment</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.quarkus</groupId>
+            <artifactId>quarkus-jaxb-deployment</artifactId>
+        </dependency>
+        <dependency>
             <groupId>org.apache.camel.quarkus</groupId>
             <artifactId>camel-quarkus-core-deployment</artifactId>
         </dependency>
diff --git a/extensions/salesforce/deployment/src/main/java/org/apache/camel/quarkus/component/salesforce/deployment/SalesforceProcessor.java b/extensions/salesforce/deployment/src/main/java/org/apache/camel/quarkus/component/salesforce/deployment/SalesforceProcessor.java
index b266abc..5017515 100644
--- a/extensions/salesforce/deployment/src/main/java/org/apache/camel/quarkus/component/salesforce/deployment/SalesforceProcessor.java
+++ b/extensions/salesforce/deployment/src/main/java/org/apache/camel/quarkus/component/salesforce/deployment/SalesforceProcessor.java
@@ -16,37 +16,17 @@
  */
 package org.apache.camel.quarkus.component.salesforce.deployment;
 
-import java.util.Arrays;
-import java.util.List;
-
 import io.quarkus.deployment.annotations.BuildProducer;
 import io.quarkus.deployment.annotations.BuildStep;
+import io.quarkus.deployment.builditem.CombinedIndexBuildItem;
 import io.quarkus.deployment.builditem.ExtensionSslNativeSupportBuildItem;
 import io.quarkus.deployment.builditem.FeatureBuildItem;
 import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
-import org.apache.camel.component.salesforce.internal.dto.LoginError;
-import org.apache.camel.component.salesforce.internal.dto.LoginToken;
-import org.apache.camel.component.salesforce.internal.dto.NotifyForFieldsEnum;
-import org.apache.camel.component.salesforce.internal.dto.NotifyForOperationsEnum;
-import org.apache.camel.component.salesforce.internal.dto.PushTopic;
-import org.apache.camel.component.salesforce.internal.dto.QueryRecordsPushTopic;
-import org.apache.camel.component.salesforce.internal.dto.RestChoices;
-import org.apache.camel.component.salesforce.internal.dto.RestErrors;
-import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.ProtocolHandlers;
+import org.apache.camel.component.salesforce.api.dto.AbstractDTOBase;
+import org.jboss.jandex.DotName;
+import org.jboss.jandex.IndexView;
 
 class SalesforceProcessor {
-    private static final List<Class<?>> SALESFORCE_REFLECTIVE_CLASSES = Arrays.asList(
-            HttpClient.class,
-            LoginToken.class,
-            LoginError.class,
-            NotifyForFieldsEnum.class,
-            NotifyForOperationsEnum.class,
-            PushTopic.class,
-            QueryRecordsPushTopic.class,
-            RestChoices.class,
-            RestErrors.class,
-            ProtocolHandlers.class);
 
     private static final String FEATURE = "camel-salesforce";
 
@@ -61,10 +41,25 @@ class SalesforceProcessor {
     }
 
     @BuildStep
-    void registerForReflection(BuildProducer<ReflectiveClassBuildItem> reflectiveClass) {
-        for (Class<?> type : SALESFORCE_REFLECTIVE_CLASSES) {
-            reflectiveClass.produce(
-                    new ReflectiveClassBuildItem(true, true, type));
-        }
+    void registerForReflection(CombinedIndexBuildItem combinedIndex, BuildProducer<ReflectiveClassBuildItem> reflectiveClass) {
+        IndexView index = combinedIndex.getIndex();
+
+        // Register everything extending AbstractDTOBase for reflection
+        DotName dtoBaseName = DotName.createSimple(AbstractDTOBase.class.getName());
+        String[] dtoClasses = index.getAllKnownSubclasses(dtoBaseName)
+                .stream()
+                .map(classInfo -> classInfo.name().toString())
+                .toArray(String[]::new);
+
+        reflectiveClass.produce(new ReflectiveClassBuildItem(true, false, dtoClasses));
+
+        // Register internal DTO classes for reflection
+        String[] internalDtoClasses = index.getKnownClasses()
+                .stream()
+                .map(classInfo -> classInfo.name().toString())
+                .filter(className -> className.startsWith("org.apache.camel.component.salesforce.internal.dto"))
+                .toArray(String[]::new);
+
+        reflectiveClass.produce(new ReflectiveClassBuildItem(true, false, internalDtoClasses));
     }
 }
diff --git a/extensions/salesforce/runtime/pom.xml b/extensions/salesforce/runtime/pom.xml
index 0998dec..89b6981 100644
--- a/extensions/salesforce/runtime/pom.xml
+++ b/extensions/salesforce/runtime/pom.xml
@@ -47,6 +47,14 @@
 
     <dependencies>
         <dependency>
+            <groupId>io.quarkus</groupId>
+            <artifactId>quarkus-jackson</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.quarkus</groupId>
+            <artifactId>quarkus-jaxb</artifactId>
+        </dependency>
+        <dependency>
             <groupId>org.apache.camel.quarkus</groupId>
             <artifactId>camel-quarkus-core</artifactId>
         </dependency>
diff --git a/integration-tests/salesforce/README.adoc b/integration-tests/salesforce/README.adoc
new file mode 100644
index 0000000..69fb1d7
--- /dev/null
+++ b/integration-tests/salesforce/README.adoc
@@ -0,0 +1,18 @@
+== Camel Quarkus Salesforce Integration Tests
+
+To run the `camel-quarkus-salesforce` integration tests against the real API, you must first create a Salesforce developer account https://developer.salesforce.com/.
+
+Next create a new 'Connected App' from the app manager page. You may need to adjust the OAuth policy settings for
+`Permitted Users` and also `IP Relaxation` rules, depending on your needs. Also enable Change Data Capture for the 'Account' entity by visiting the Integrations -> Change Data Capture page.
+
+You can find the app OAuth settings by choosing the 'view' option from the app manager page. Then set the following environment variables.
+
+[source,shell]
+----
+export SALESFORCE_CLIENTID=your-salesforce-client-id
+export SALESFORCE_CLIENTSECRET=your-salesforce-client-secret
+export SALESFORCE_USERNAME=your-salesforce-username
+export SALESFORCE_PASSWORD=your-salesforce-password
+----
+
+To regenerate the Salesforce DTO classes, run `mvn clean generate-sources -Pgenerate-salesforce-dtos`.
\ No newline at end of file
diff --git a/integration-tests/salesforce/pom.xml b/integration-tests/salesforce/pom.xml
index 98b963d..0a627b7 100644
--- a/integration-tests/salesforce/pom.xml
+++ b/integration-tests/salesforce/pom.xml
@@ -39,6 +39,10 @@
             <artifactId>camel-quarkus-salesforce</artifactId>
         </dependency>
         <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-seda-deployment</artifactId>
+        </dependency>
+        <dependency>
             <groupId>io.quarkus</groupId>
             <artifactId>quarkus-resteasy-jsonb</artifactId>
         </dependency>
@@ -55,6 +59,7 @@
             <scope>test</scope>
         </dependency>
 
+
         <!-- The following dependencies guarantee that this module is built after them. You can update them by running `mvn process-resources -Pformat -N` from the source tree root directory -->
         <dependency>
             <groupId>org.apache.camel.quarkus</groupId>
@@ -113,6 +118,36 @@
                 </plugins>
             </build>
         </profile>
+        <profile>
+            <id>generate-salesforce-dtos</id>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.camel.maven</groupId>
+                        <artifactId>camel-salesforce-maven-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <goals>
+                                    <goal>generate</goal>
+                                </goals>
+                                <configuration>
+                                    <clientId>${env.SALESFORCE_CLIENTID}</clientId>
+                                    <clientSecret>${env.SALESFORCE_CLIENTSECRET}</clientSecret>
+                                    <userName>${env.SALESFORCE_USERNAME}</userName>
+                                    <password>${env.SALESFORCE_PASSWORD}</password>
+                                    <loginUrl>https://login.salesforce.com</loginUrl>
+                                    <packageName>org.apache.camel.quarkus.component.salesforce.generated</packageName>
+                                    <outputDirectory>src/main/java</outputDirectory>
+                                    <includes>
+                                        <include>Account</include>
+                                    </includes>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
     </profiles>
 
 </project>
diff --git a/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/SalesforceResource.java b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/SalesforceResource.java
index 381074e..f20f1aa 100644
--- a/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/SalesforceResource.java
+++ b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/SalesforceResource.java
@@ -16,15 +16,35 @@
  */
 package org.apache.camel.quarkus.component.salesforce;
 
+import java.util.Locale;
+import java.util.Map;
+
 import javax.inject.Inject;
+import javax.json.Json;
+import javax.json.JsonObject;
+import javax.json.JsonObjectBuilder;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
 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.QueryParam;
 import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
 
+import org.apache.camel.CamelContext;
+import org.apache.camel.ConsumerTemplate;
 import org.apache.camel.FluentProducerTemplate;
 import org.apache.camel.component.salesforce.SalesforceEndpointConfig;
+import org.apache.camel.component.salesforce.api.dto.CreateSObjectResult;
+import org.apache.camel.component.salesforce.api.dto.bulk.ContentType;
+import org.apache.camel.component.salesforce.api.dto.bulk.JobInfo;
+import org.apache.camel.component.salesforce.api.dto.bulk.OperationEnum;
+import org.apache.camel.quarkus.component.salesforce.generated.Account;
+import org.apache.camel.quarkus.component.salesforce.generated.QueryRecordsAccount;
+import org.apache.camel.spi.RouteController;
 
 @Path("/salesforce")
 public class SalesforceResource {
@@ -32,6 +52,12 @@ public class SalesforceResource {
     @Inject
     FluentProducerTemplate template;
 
+    @Inject
+    ConsumerTemplate consumerTemplate;
+
+    @Inject
+    CamelContext context;
+
     @Path("/document/{id}")
     @GET
     @Produces(MediaType.APPLICATION_JSON)
@@ -42,4 +68,101 @@ public class SalesforceResource {
                 .to("salesforce:getSObjectWithId?rawPayload=true")
                 .request();
     }
+
+    @Path("/account")
+    @GET
+    @Produces(MediaType.APPLICATION_JSON)
+    public Account getAccount() {
+        QueryRecordsAccount request = template
+                .toF("salesforce:query?sObjectQuery=SELECT Id,AccountNumber from Account LIMIT 1&sObjectClass=%s",
+                        QueryRecordsAccount.class.getName())
+                .request(QueryRecordsAccount.class);
+        return request.getRecords().get(0);
+    }
+
+    @Path("/account")
+    @POST
+    @Consumes(MediaType.TEXT_PLAIN)
+    @Produces(MediaType.APPLICATION_JSON)
+    public String createAccount(String accountName) {
+        final Account account = new Account();
+        account.setName(accountName);
+
+        CreateSObjectResult result = template.to("salesforce:createSObject?sObjectName=Account")
+                .withBody(account)
+                .request(CreateSObjectResult.class);
+
+        return result.getId();
+    }
+
+    @Path("/account/{id}")
+    @DELETE
+    public Response deleteAccount(@PathParam("id") String accountId) {
+        final Account account = new Account();
+        account.setId(accountId);
+
+        template.to("salesforce:deleteSObject")
+                .withBody(account)
+                .send();
+
+        return Response.noContent().build();
+    }
+
+    @Path("/bulk")
+    @POST
+    @Produces(MediaType.APPLICATION_JSON)
+    public JsonObject createJob() {
+        JobInfo jobInfo = createJobInfo();
+        jobInfo.setOperation(OperationEnum.INSERT);
+
+        JobInfo result = template.to("salesforce:createJob").withBody(jobInfo).request(JobInfo.class);
+        return jobInfoToJsonObject(result);
+    }
+
+    @Path("/bulk")
+    @DELETE
+    @Produces(MediaType.APPLICATION_JSON)
+    public JsonObject abortJob(@QueryParam("jobId") String jobId) {
+        JobInfo jobInfo = createJobInfo();
+        jobInfo.setId(jobId);
+
+        JobInfo result = template.to("salesforce:abortJob").withBody(jobInfo).request(JobInfo.class);
+        return jobInfoToJsonObject(result);
+    }
+
+    @Path("/cdc/{action}")
+    @POST
+    public Response modifyCdcConsumerState(@PathParam("action") String action) throws Exception {
+        RouteController controller = context.getRouteController();
+        if (action.equals("start")) {
+            controller.startRoute("cdc");
+        } else if (action.equals("stop")) {
+            controller.stopRoute("cdc");
+        } else {
+            throw new IllegalArgumentException("Unknown action: " + action);
+        }
+        return Response.ok().build();
+    }
+
+    @Path("/cdc")
+    @GET
+    @Produces(MediaType.APPLICATION_JSON)
+    public Map<String, Object> getCdcEvents() {
+        Map map = consumerTemplate.receiveBody("seda:events", 10000, Map.class);
+        return map;
+    }
+
+    private JobInfo createJobInfo() {
+        JobInfo jobInfo = new JobInfo();
+        jobInfo.setObject(Account.class.getSimpleName());
+        jobInfo.setContentType(ContentType.CSV);
+        return jobInfo;
+    }
+
+    private JsonObject jobInfoToJsonObject(JobInfo jobInfo) {
+        JsonObjectBuilder objectBuilder = Json.createObjectBuilder();
+        objectBuilder.add("id", jobInfo.getId());
+        objectBuilder.add("state", jobInfo.getState().value().toUpperCase(Locale.US));
+        return objectBuilder.build();
+    }
 }
diff --git a/integration-tests/salesforce/src/test/java/org/apache/camel/quarkus/component/salesforce/SalesforceTest.java b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/SalesforceRoutes.java
similarity index 52%
copy from integration-tests/salesforce/src/test/java/org/apache/camel/quarkus/component/salesforce/SalesforceTest.java
copy to integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/SalesforceRoutes.java
index 5f5b086..016fbab 100644
--- a/integration-tests/salesforce/src/test/java/org/apache/camel/quarkus/component/salesforce/SalesforceTest.java
+++ b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/SalesforceRoutes.java
@@ -16,25 +16,13 @@
  */
 package org.apache.camel.quarkus.component.salesforce;
 
-import io.quarkus.test.junit.QuarkusTest;
-import io.restassured.RestAssured;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
+import org.apache.camel.builder.RouteBuilder;
 
-import static org.hamcrest.core.Is.is;
+public class SalesforceRoutes extends RouteBuilder {
 
-@EnabledIfEnvironmentVariable(named = "SALESFORCE_USERNAME", matches = ".+")
-@EnabledIfEnvironmentVariable(named = "SALESFORCE_PASSWORD", matches = ".+")
-@EnabledIfEnvironmentVariable(named = "SALESFORCE_CLIENTID", matches = ".+")
-@EnabledIfEnvironmentVariable(named = "SALESFORCE_CLIENTSECRET", matches = ".+")
-@QuarkusTest
-class SalesforceTest {
-
-    @Test
-    public void testSalesforceComponent() {
-        RestAssured.get("/salesforce/document/test")
-                .then()
-                .statusCode(200)
-                .body("attributes.type", is("Document"));
+    @Override
+    public void configure() throws Exception {
+        from("salesforce:/data/AccountChangeEvent?replayId=-1").routeId("cdc").autoStartup(false)
+                .to("seda:events");
     }
 }
diff --git a/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account.java b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account.java
new file mode 100644
index 0000000..8c4c7a7
--- /dev/null
+++ b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account.java
@@ -0,0 +1,983 @@
+/*
+ * 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.quarkus.component.salesforce.generated;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.annotation.Generated;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+import com.thoughtworks.xstream.annotations.XStreamConverter;
+import org.apache.camel.component.salesforce.api.MultiSelectPicklistConverter;
+import org.apache.camel.component.salesforce.api.MultiSelectPicklistDeserializer;
+import org.apache.camel.component.salesforce.api.MultiSelectPicklistSerializer;
+import org.apache.camel.component.salesforce.api.PicklistEnumConverter;
+import org.apache.camel.component.salesforce.api.dto.AbstractDescribedSObjectBase;
+import org.apache.camel.component.salesforce.api.dto.SObjectDescription;
+import org.apache.camel.component.salesforce.api.dto.SObjectDescriptionUrls;
+import org.apache.camel.component.salesforce.api.dto.SObjectField;
+
+/**
+ * Salesforce DTO for SObject Account
+ */
+@Generated("org.apache.camel.maven.CamelSalesforceMojo")
+@XStreamAlias("Account")
+public class Account extends AbstractDescribedSObjectBase {
+
+    public Account() {
+        getAttributes().setType("Account");
+    }
+
+    private static final SObjectDescription DESCRIPTION = createSObjectDescription();
+
+    private String MasterRecordId;
+
+    @JsonProperty("MasterRecordId")
+    public String getMasterRecordId() {
+        return this.MasterRecordId;
+    }
+
+    @JsonProperty("MasterRecordId")
+    public void setMasterRecordId(String MasterRecordId) {
+        this.MasterRecordId = MasterRecordId;
+    }
+
+    @XStreamAlias("MasterRecord")
+    private Account MasterRecord;
+
+    @JsonProperty("MasterRecord")
+    public Account getMasterRecord() {
+        return this.MasterRecord;
+    }
+
+    @JsonProperty("MasterRecord")
+    public void setMasterRecord(Account MasterRecord) {
+        this.MasterRecord = MasterRecord;
+    }
+
+    @XStreamConverter(PicklistEnumConverter.class)
+    private Account_TypeEnum Type;
+
+    @JsonProperty("Type")
+    public Account_TypeEnum getType() {
+        return this.Type;
+    }
+
+    @JsonProperty("Type")
+    public void setType(Account_TypeEnum Type) {
+        this.Type = Type;
+    }
+
+    private String ParentId;
+
+    @JsonProperty("ParentId")
+    public String getParentId() {
+        return this.ParentId;
+    }
+
+    @JsonProperty("ParentId")
+    public void setParentId(String ParentId) {
+        this.ParentId = ParentId;
+    }
+
+    @XStreamAlias("Parent")
+    private Account Parent;
+
+    @JsonProperty("Parent")
+    public Account getParent() {
+        return this.Parent;
+    }
+
+    @JsonProperty("Parent")
+    public void setParent(Account Parent) {
+        this.Parent = Parent;
+    }
+
+    private String BillingStreet;
+
+    @JsonProperty("BillingStreet")
+    public String getBillingStreet() {
+        return this.BillingStreet;
+    }
+
+    @JsonProperty("BillingStreet")
+    public void setBillingStreet(String BillingStreet) {
+        this.BillingStreet = BillingStreet;
+    }
+
+    private String BillingCity;
+
+    @JsonProperty("BillingCity")
+    public String getBillingCity() {
+        return this.BillingCity;
+    }
+
+    @JsonProperty("BillingCity")
+    public void setBillingCity(String BillingCity) {
+        this.BillingCity = BillingCity;
+    }
+
+    private String BillingState;
+
+    @JsonProperty("BillingState")
+    public String getBillingState() {
+        return this.BillingState;
+    }
+
+    @JsonProperty("BillingState")
+    public void setBillingState(String BillingState) {
+        this.BillingState = BillingState;
+    }
+
+    private String BillingPostalCode;
+
+    @JsonProperty("BillingPostalCode")
+    public String getBillingPostalCode() {
+        return this.BillingPostalCode;
+    }
+
+    @JsonProperty("BillingPostalCode")
+    public void setBillingPostalCode(String BillingPostalCode) {
+        this.BillingPostalCode = BillingPostalCode;
+    }
+
+    private String BillingCountry;
+
+    @JsonProperty("BillingCountry")
+    public String getBillingCountry() {
+        return this.BillingCountry;
+    }
+
+    @JsonProperty("BillingCountry")
+    public void setBillingCountry(String BillingCountry) {
+        this.BillingCountry = BillingCountry;
+    }
+
+    private Double BillingLatitude;
+
+    @JsonProperty("BillingLatitude")
+    public Double getBillingLatitude() {
+        return this.BillingLatitude;
+    }
+
+    @JsonProperty("BillingLatitude")
+    public void setBillingLatitude(Double BillingLatitude) {
+        this.BillingLatitude = BillingLatitude;
+    }
+
+    private Double BillingLongitude;
+
+    @JsonProperty("BillingLongitude")
+    public Double getBillingLongitude() {
+        return this.BillingLongitude;
+    }
+
+    @JsonProperty("BillingLongitude")
+    public void setBillingLongitude(Double BillingLongitude) {
+        this.BillingLongitude = BillingLongitude;
+    }
+
+    @XStreamConverter(PicklistEnumConverter.class)
+    private Account_BillingGeocodeAccuracyEnum BillingGeocodeAccuracy;
+
+    @JsonProperty("BillingGeocodeAccuracy")
+    public Account_BillingGeocodeAccuracyEnum getBillingGeocodeAccuracy() {
+        return this.BillingGeocodeAccuracy;
+    }
+
+    @JsonProperty("BillingGeocodeAccuracy")
+    public void setBillingGeocodeAccuracy(Account_BillingGeocodeAccuracyEnum BillingGeocodeAccuracy) {
+        this.BillingGeocodeAccuracy = BillingGeocodeAccuracy;
+    }
+
+    private org.apache.camel.component.salesforce.api.dto.Address BillingAddress;
+
+    @JsonProperty("BillingAddress")
+    public org.apache.camel.component.salesforce.api.dto.Address getBillingAddress() {
+        return this.BillingAddress;
+    }
+
+    @JsonProperty("BillingAddress")
+    public void setBillingAddress(org.apache.camel.component.salesforce.api.dto.Address BillingAddress) {
+        this.BillingAddress = BillingAddress;
+    }
+
+    private String ShippingStreet;
+
+    @JsonProperty("ShippingStreet")
+    public String getShippingStreet() {
+        return this.ShippingStreet;
+    }
+
+    @JsonProperty("ShippingStreet")
+    public void setShippingStreet(String ShippingStreet) {
+        this.ShippingStreet = ShippingStreet;
+    }
+
+    private String ShippingCity;
+
+    @JsonProperty("ShippingCity")
+    public String getShippingCity() {
+        return this.ShippingCity;
+    }
+
+    @JsonProperty("ShippingCity")
+    public void setShippingCity(String ShippingCity) {
+        this.ShippingCity = ShippingCity;
+    }
+
+    private String ShippingState;
+
+    @JsonProperty("ShippingState")
+    public String getShippingState() {
+        return this.ShippingState;
+    }
+
+    @JsonProperty("ShippingState")
+    public void setShippingState(String ShippingState) {
+        this.ShippingState = ShippingState;
+    }
+
+    private String ShippingPostalCode;
+
+    @JsonProperty("ShippingPostalCode")
+    public String getShippingPostalCode() {
+        return this.ShippingPostalCode;
+    }
+
+    @JsonProperty("ShippingPostalCode")
+    public void setShippingPostalCode(String ShippingPostalCode) {
+        this.ShippingPostalCode = ShippingPostalCode;
+    }
+
+    private String ShippingCountry;
+
+    @JsonProperty("ShippingCountry")
+    public String getShippingCountry() {
+        return this.ShippingCountry;
+    }
+
+    @JsonProperty("ShippingCountry")
+    public void setShippingCountry(String ShippingCountry) {
+        this.ShippingCountry = ShippingCountry;
+    }
+
+    private Double ShippingLatitude;
+
+    @JsonProperty("ShippingLatitude")
+    public Double getShippingLatitude() {
+        return this.ShippingLatitude;
+    }
+
+    @JsonProperty("ShippingLatitude")
+    public void setShippingLatitude(Double ShippingLatitude) {
+        this.ShippingLatitude = ShippingLatitude;
+    }
+
+    private Double ShippingLongitude;
+
+    @JsonProperty("ShippingLongitude")
+    public Double getShippingLongitude() {
+        return this.ShippingLongitude;
+    }
+
+    @JsonProperty("ShippingLongitude")
+    public void setShippingLongitude(Double ShippingLongitude) {
+        this.ShippingLongitude = ShippingLongitude;
+    }
+
+    @XStreamConverter(PicklistEnumConverter.class)
+    private Account_ShippingGeocodeAccuracyEnum ShippingGeocodeAccuracy;
+
+    @JsonProperty("ShippingGeocodeAccuracy")
+    public Account_ShippingGeocodeAccuracyEnum getShippingGeocodeAccuracy() {
+        return this.ShippingGeocodeAccuracy;
+    }
+
+    @JsonProperty("ShippingGeocodeAccuracy")
+    public void setShippingGeocodeAccuracy(Account_ShippingGeocodeAccuracyEnum ShippingGeocodeAccuracy) {
+        this.ShippingGeocodeAccuracy = ShippingGeocodeAccuracy;
+    }
+
+    private org.apache.camel.component.salesforce.api.dto.Address ShippingAddress;
+
+    @JsonProperty("ShippingAddress")
+    public org.apache.camel.component.salesforce.api.dto.Address getShippingAddress() {
+        return this.ShippingAddress;
+    }
+
+    @JsonProperty("ShippingAddress")
+    public void setShippingAddress(org.apache.camel.component.salesforce.api.dto.Address ShippingAddress) {
+        this.ShippingAddress = ShippingAddress;
+    }
+
+    private String Phone;
+
+    @JsonProperty("Phone")
+    public String getPhone() {
+        return this.Phone;
+    }
+
+    @JsonProperty("Phone")
+    public void setPhone(String Phone) {
+        this.Phone = Phone;
+    }
+
+    private String Fax;
+
+    @JsonProperty("Fax")
+    public String getFax() {
+        return this.Fax;
+    }
+
+    @JsonProperty("Fax")
+    public void setFax(String Fax) {
+        this.Fax = Fax;
+    }
+
+    private String AccountNumber;
+
+    @JsonProperty("AccountNumber")
+    public String getAccountNumber() {
+        return this.AccountNumber;
+    }
+
+    @JsonProperty("AccountNumber")
+    public void setAccountNumber(String AccountNumber) {
+        this.AccountNumber = AccountNumber;
+    }
+
+    private String Website;
+
+    @JsonProperty("Website")
+    public String getWebsite() {
+        return this.Website;
+    }
+
+    @JsonProperty("Website")
+    public void setWebsite(String Website) {
+        this.Website = Website;
+    }
+
+    private String PhotoUrl;
+
+    @JsonProperty("PhotoUrl")
+    public String getPhotoUrl() {
+        return this.PhotoUrl;
+    }
+
+    @JsonProperty("PhotoUrl")
+    public void setPhotoUrl(String PhotoUrl) {
+        this.PhotoUrl = PhotoUrl;
+    }
+
+    private String Sic;
+
+    @JsonProperty("Sic")
+    public String getSic() {
+        return this.Sic;
+    }
+
+    @JsonProperty("Sic")
+    public void setSic(String Sic) {
+        this.Sic = Sic;
+    }
+
+    @XStreamConverter(PicklistEnumConverter.class)
+    private Account_IndustryEnum Industry;
+
+    @JsonProperty("Industry")
+    public Account_IndustryEnum getIndustry() {
+        return this.Industry;
+    }
+
+    @JsonProperty("Industry")
+    public void setIndustry(Account_IndustryEnum Industry) {
+        this.Industry = Industry;
+    }
+
+    private Double AnnualRevenue;
+
+    @JsonProperty("AnnualRevenue")
+    public Double getAnnualRevenue() {
+        return this.AnnualRevenue;
+    }
+
+    @JsonProperty("AnnualRevenue")
+    public void setAnnualRevenue(Double AnnualRevenue) {
+        this.AnnualRevenue = AnnualRevenue;
+    }
+
+    private Integer NumberOfEmployees;
+
+    @JsonProperty("NumberOfEmployees")
+    public Integer getNumberOfEmployees() {
+        return this.NumberOfEmployees;
+    }
+
+    @JsonProperty("NumberOfEmployees")
+    public void setNumberOfEmployees(Integer NumberOfEmployees) {
+        this.NumberOfEmployees = NumberOfEmployees;
+    }
+
+    @XStreamConverter(PicklistEnumConverter.class)
+    private Account_OwnershipEnum Ownership;
+
+    @JsonProperty("Ownership")
+    public Account_OwnershipEnum getOwnership() {
+        return this.Ownership;
+    }
+
+    @JsonProperty("Ownership")
+    public void setOwnership(Account_OwnershipEnum Ownership) {
+        this.Ownership = Ownership;
+    }
+
+    private String TickerSymbol;
+
+    @JsonProperty("TickerSymbol")
+    public String getTickerSymbol() {
+        return this.TickerSymbol;
+    }
+
+    @JsonProperty("TickerSymbol")
+    public void setTickerSymbol(String TickerSymbol) {
+        this.TickerSymbol = TickerSymbol;
+    }
+
+    private String Description;
+
+    @JsonProperty("Description")
+    public String getDescription() {
+        return this.Description;
+    }
+
+    @JsonProperty("Description")
+    public void setDescription(String Description) {
+        this.Description = Description;
+    }
+
+    @XStreamConverter(PicklistEnumConverter.class)
+    private Account_RatingEnum Rating;
+
+    @JsonProperty("Rating")
+    public Account_RatingEnum getRating() {
+        return this.Rating;
+    }
+
+    @JsonProperty("Rating")
+    public void setRating(Account_RatingEnum Rating) {
+        this.Rating = Rating;
+    }
+
+    private String Site;
+
+    @JsonProperty("Site")
+    public String getSite() {
+        return this.Site;
+    }
+
+    @JsonProperty("Site")
+    public void setSite(String Site) {
+        this.Site = Site;
+    }
+
+    private String Jigsaw;
+
+    @JsonProperty("Jigsaw")
+    public String getJigsaw() {
+        return this.Jigsaw;
+    }
+
+    @JsonProperty("Jigsaw")
+    public void setJigsaw(String Jigsaw) {
+        this.Jigsaw = Jigsaw;
+    }
+
+    private String JigsawCompanyId;
+
+    @JsonProperty("JigsawCompanyId")
+    public String getJigsawCompanyId() {
+        return this.JigsawCompanyId;
+    }
+
+    @JsonProperty("JigsawCompanyId")
+    public void setJigsawCompanyId(String JigsawCompanyId) {
+        this.JigsawCompanyId = JigsawCompanyId;
+    }
+
+    @XStreamConverter(PicklistEnumConverter.class)
+    private Account_CleanStatusEnum CleanStatus;
+
+    @JsonProperty("CleanStatus")
+    public Account_CleanStatusEnum getCleanStatus() {
+        return this.CleanStatus;
+    }
+
+    @JsonProperty("CleanStatus")
+    public void setCleanStatus(Account_CleanStatusEnum CleanStatus) {
+        this.CleanStatus = CleanStatus;
+    }
+
+    @XStreamConverter(PicklistEnumConverter.class)
+    private Account_AccountSourceEnum AccountSource;
+
+    @JsonProperty("AccountSource")
+    public Account_AccountSourceEnum getAccountSource() {
+        return this.AccountSource;
+    }
+
+    @JsonProperty("AccountSource")
+    public void setAccountSource(Account_AccountSourceEnum AccountSource) {
+        this.AccountSource = AccountSource;
+    }
+
+    private String DunsNumber;
+
+    @JsonProperty("DunsNumber")
+    public String getDunsNumber() {
+        return this.DunsNumber;
+    }
+
+    @JsonProperty("DunsNumber")
+    public void setDunsNumber(String DunsNumber) {
+        this.DunsNumber = DunsNumber;
+    }
+
+    private String Tradestyle;
+
+    @JsonProperty("Tradestyle")
+    public String getTradestyle() {
+        return this.Tradestyle;
+    }
+
+    @JsonProperty("Tradestyle")
+    public void setTradestyle(String Tradestyle) {
+        this.Tradestyle = Tradestyle;
+    }
+
+    private String NaicsCode;
+
+    @JsonProperty("NaicsCode")
+    public String getNaicsCode() {
+        return this.NaicsCode;
+    }
+
+    @JsonProperty("NaicsCode")
+    public void setNaicsCode(String NaicsCode) {
+        this.NaicsCode = NaicsCode;
+    }
+
+    private String NaicsDesc;
+
+    @JsonProperty("NaicsDesc")
+    public String getNaicsDesc() {
+        return this.NaicsDesc;
+    }
+
+    @JsonProperty("NaicsDesc")
+    public void setNaicsDesc(String NaicsDesc) {
+        this.NaicsDesc = NaicsDesc;
+    }
+
+    private String YearStarted;
+
+    @JsonProperty("YearStarted")
+    public String getYearStarted() {
+        return this.YearStarted;
+    }
+
+    @JsonProperty("YearStarted")
+    public void setYearStarted(String YearStarted) {
+        this.YearStarted = YearStarted;
+    }
+
+    private String SicDesc;
+
+    @JsonProperty("SicDesc")
+    public String getSicDesc() {
+        return this.SicDesc;
+    }
+
+    @JsonProperty("SicDesc")
+    public void setSicDesc(String SicDesc) {
+        this.SicDesc = SicDesc;
+    }
+
+    private String DandbCompanyId;
+
+    @JsonProperty("DandbCompanyId")
+    public String getDandbCompanyId() {
+        return this.DandbCompanyId;
+    }
+
+    @JsonProperty("DandbCompanyId")
+    public void setDandbCompanyId(String DandbCompanyId) {
+        this.DandbCompanyId = DandbCompanyId;
+    }
+
+    @XStreamConverter(PicklistEnumConverter.class)
+    private Account_CustomerPriorityEnum CustomerPriority__c;
+
+    @JsonProperty("CustomerPriority__c")
+    public Account_CustomerPriorityEnum getCustomerPriority__c() {
+        return this.CustomerPriority__c;
+    }
+
+    @JsonProperty("CustomerPriority__c")
+    public void setCustomerPriority__c(Account_CustomerPriorityEnum CustomerPriority__c) {
+        this.CustomerPriority__c = CustomerPriority__c;
+    }
+
+    @XStreamConverter(PicklistEnumConverter.class)
+    private Account_SLAEnum SLA__c;
+
+    @JsonProperty("SLA__c")
+    public Account_SLAEnum getSLA__c() {
+        return this.SLA__c;
+    }
+
+    @JsonProperty("SLA__c")
+    public void setSLA__c(Account_SLAEnum SLA__c) {
+        this.SLA__c = SLA__c;
+    }
+
+    @XStreamConverter(PicklistEnumConverter.class)
+    private Account_ActiveEnum Active__c;
+
+    @JsonProperty("Active__c")
+    public Account_ActiveEnum getActive__c() {
+        return this.Active__c;
+    }
+
+    @JsonProperty("Active__c")
+    public void setActive__c(Account_ActiveEnum Active__c) {
+        this.Active__c = Active__c;
+    }
+
+    private Double NumberofLocations__c;
+
+    @JsonProperty("NumberofLocations__c")
+    public Double getNumberofLocations__c() {
+        return this.NumberofLocations__c;
+    }
+
+    @JsonProperty("NumberofLocations__c")
+    public void setNumberofLocations__c(Double NumberofLocations__c) {
+        this.NumberofLocations__c = NumberofLocations__c;
+    }
+
+    @XStreamConverter(PicklistEnumConverter.class)
+    private Account_UpsellOpportunityEnum UpsellOpportunity__c;
+
+    @JsonProperty("UpsellOpportunity__c")
+    public Account_UpsellOpportunityEnum getUpsellOpportunity__c() {
+        return this.UpsellOpportunity__c;
+    }
+
+    @JsonProperty("UpsellOpportunity__c")
+    public void setUpsellOpportunity__c(Account_UpsellOpportunityEnum UpsellOpportunity__c) {
+        this.UpsellOpportunity__c = UpsellOpportunity__c;
+    }
+
+    private String SLASerialNumber__c;
+
+    @JsonProperty("SLASerialNumber__c")
+    public String getSLASerialNumber__c() {
+        return this.SLASerialNumber__c;
+    }
+
+    @JsonProperty("SLASerialNumber__c")
+    public void setSLASerialNumber__c(String SLASerialNumber__c) {
+        this.SLASerialNumber__c = SLASerialNumber__c;
+    }
+
+    private java.time.LocalDate SLAExpirationDate__c;
+
+    @JsonProperty("SLAExpirationDate__c")
+    public java.time.LocalDate getSLAExpirationDate__c() {
+        return this.SLAExpirationDate__c;
+    }
+
+    @JsonProperty("SLAExpirationDate__c")
+    public void setSLAExpirationDate__c(java.time.LocalDate SLAExpirationDate__c) {
+        this.SLAExpirationDate__c = SLAExpirationDate__c;
+    }
+
+    @XStreamConverter(MultiSelectPicklistConverter.class)
+    private Account_MyMultiselectEnum[] MyMultiselect__c;
+
+    @JsonProperty("MyMultiselect__c")
+    @JsonSerialize(using = MultiSelectPicklistSerializer.class)
+    public Account_MyMultiselectEnum[] getMyMultiselect__c() {
+        return this.MyMultiselect__c;
+    }
+
+    @JsonProperty("MyMultiselect__c")
+    @JsonDeserialize(using = MultiSelectPicklistDeserializer.class)
+    public void setMyMultiselect__c(Account_MyMultiselectEnum[] MyMultiselect__c) {
+        this.MyMultiselect__c = MyMultiselect__c;
+    }
+
+    private QueryRecordsAccount ChildAccounts;
+
+    @JsonProperty("ChildAccounts")
+    public QueryRecordsAccount getChildAccounts() {
+        return ChildAccounts;
+    }
+
+    @JsonProperty("ChildAccounts")
+    public void setChildAccounts(QueryRecordsAccount ChildAccounts) {
+        this.ChildAccounts = ChildAccounts;
+    }
+
+    @Override
+    public final SObjectDescription description() {
+        return DESCRIPTION;
+    }
+
+    private static SObjectDescription createSObjectDescription() {
+        final SObjectDescription description = new SObjectDescription();
+
+        final List<SObjectField> fields1 = new ArrayList<>();
+        description.setFields(fields1);
+
+        final SObjectField sObjectField1 = createField("Id", "Account ID", "id", "tns:ID", 18, false, false, false, false,
+                false, false, true);
+        fields1.add(sObjectField1);
+        final SObjectField sObjectField2 = createField("IsDeleted", "Deleted", "boolean", "xsd:boolean", 0, false, false, false,
+                false, false, false, false);
+        fields1.add(sObjectField2);
+        final SObjectField sObjectField3 = createField("MasterRecordId", "Master Record ID", "reference", "tns:ID", 18, false,
+                true, false, false, false, false, false);
+        fields1.add(sObjectField3);
+        final SObjectField sObjectField4 = createField("Name", "Account Name", "string", "xsd:string", 255, false, false, true,
+                false, false, false, false);
+        fields1.add(sObjectField4);
+        final SObjectField sObjectField5 = createField("Type", "Account Type", "picklist", "xsd:string", 255, false, true,
+                false, false, false, false, false);
+        fields1.add(sObjectField5);
+        final SObjectField sObjectField6 = createField("ParentId", "Parent Account ID", "reference", "tns:ID", 18, false, true,
+                false, false, false, false, false);
+        fields1.add(sObjectField6);
+        final SObjectField sObjectField7 = createField("BillingStreet", "Billing Street", "textarea", "xsd:string", 255, false,
+                true, false, false, false, false, false);
+        fields1.add(sObjectField7);
+        final SObjectField sObjectField8 = createField("BillingCity", "Billing City", "string", "xsd:string", 40, false, true,
+                false, false, false, false, false);
+        fields1.add(sObjectField8);
+        final SObjectField sObjectField9 = createField("BillingState", "Billing State/Province", "string", "xsd:string", 80,
+                false, true, false, false, false, false, false);
+        fields1.add(sObjectField9);
+        final SObjectField sObjectField10 = createField("BillingPostalCode", "Billing Zip/Postal Code", "string", "xsd:string",
+                20, false, true, false, false, false, false, false);
+        fields1.add(sObjectField10);
+        final SObjectField sObjectField11 = createField("BillingCountry", "Billing Country", "string", "xsd:string", 80, false,
+                true, false, false, false, false, false);
+        fields1.add(sObjectField11);
+        final SObjectField sObjectField12 = createField("BillingLatitude", "Billing Latitude", "double", "xsd:double", 0, false,
+                true, false, false, false, false, false);
+        fields1.add(sObjectField12);
+        final SObjectField sObjectField13 = createField("BillingLongitude", "Billing Longitude", "double", "xsd:double", 0,
+                false, true, false, false, false, false, false);
+        fields1.add(sObjectField13);
+        final SObjectField sObjectField14 = createField("BillingGeocodeAccuracy", "Billing Geocode Accuracy", "picklist",
+                "xsd:string", 40, false, true, false, false, false, false, false);
+        fields1.add(sObjectField14);
+        final SObjectField sObjectField15 = createField("BillingAddress", "Billing Address", "address", "urn:address", 0, false,
+                true, false, false, false, false, false);
+        fields1.add(sObjectField15);
+        final SObjectField sObjectField16 = createField("ShippingStreet", "Shipping Street", "textarea", "xsd:string", 255,
+                false, true, false, false, false, false, false);
+        fields1.add(sObjectField16);
+        final SObjectField sObjectField17 = createField("ShippingCity", "Shipping City", "string", "xsd:string", 40, false,
+                true, false, false, false, false, false);
+        fields1.add(sObjectField17);
+        final SObjectField sObjectField18 = createField("ShippingState", "Shipping State/Province", "string", "xsd:string", 80,
+                false, true, false, false, false, false, false);
+        fields1.add(sObjectField18);
+        final SObjectField sObjectField19 = createField("ShippingPostalCode", "Shipping Zip/Postal Code", "string",
+                "xsd:string", 20, false, true, false, false, false, false, false);
+        fields1.add(sObjectField19);
+        final SObjectField sObjectField20 = createField("ShippingCountry", "Shipping Country", "string", "xsd:string", 80,
+                false, true, false, false, false, false, false);
+        fields1.add(sObjectField20);
+        final SObjectField sObjectField21 = createField("ShippingLatitude", "Shipping Latitude", "double", "xsd:double", 0,
+                false, true, false, false, false, false, false);
+        fields1.add(sObjectField21);
+        final SObjectField sObjectField22 = createField("ShippingLongitude", "Shipping Longitude", "double", "xsd:double", 0,
+                false, true, false, false, false, false, false);
+        fields1.add(sObjectField22);
+        final SObjectField sObjectField23 = createField("ShippingGeocodeAccuracy", "Shipping Geocode Accuracy", "picklist",
+                "xsd:string", 40, false, true, false, false, false, false, false);
+        fields1.add(sObjectField23);
+        final SObjectField sObjectField24 = createField("ShippingAddress", "Shipping Address", "address", "urn:address", 0,
+                false, true, false, false, false, false, false);
+        fields1.add(sObjectField24);
+        final SObjectField sObjectField25 = createField("Phone", "Account Phone", "phone", "xsd:string", 40, false, true, false,
+                false, false, false, false);
+        fields1.add(sObjectField25);
+        final SObjectField sObjectField26 = createField("Fax", "Account Fax", "phone", "xsd:string", 40, false, true, false,
+                false, false, false, false);
+        fields1.add(sObjectField26);
+        final SObjectField sObjectField27 = createField("AccountNumber", "Account Number", "string", "xsd:string", 40, false,
+                true, false, false, false, false, false);
+        fields1.add(sObjectField27);
+        final SObjectField sObjectField28 = createField("Website", "Website", "url", "xsd:string", 255, false, true, false,
+                false, false, false, false);
+        fields1.add(sObjectField28);
+        final SObjectField sObjectField29 = createField("PhotoUrl", "Photo URL", "url", "xsd:string", 255, false, true, false,
+                false, false, false, false);
+        fields1.add(sObjectField29);
+        final SObjectField sObjectField30 = createField("Sic", "SIC Code", "string", "xsd:string", 20, false, true, false,
+                false, false, false, false);
+        fields1.add(sObjectField30);
+        final SObjectField sObjectField31 = createField("Industry", "Industry", "picklist", "xsd:string", 255, false, true,
+                false, false, false, false, false);
+        fields1.add(sObjectField31);
+        final SObjectField sObjectField32 = createField("AnnualRevenue", "Annual Revenue", "currency", "xsd:double", 0, false,
+                true, false, false, false, false, false);
+        fields1.add(sObjectField32);
+        final SObjectField sObjectField33 = createField("NumberOfEmployees", "Employees", "int", "xsd:int", 0, false, true,
+                false, false, false, false, false);
+        fields1.add(sObjectField33);
+        final SObjectField sObjectField34 = createField("Ownership", "Ownership", "picklist", "xsd:string", 255, false, true,
+                false, false, false, false, false);
+        fields1.add(sObjectField34);
+        final SObjectField sObjectField35 = createField("TickerSymbol", "Ticker Symbol", "string", "xsd:string", 20, false,
+                true, false, false, false, false, false);
+        fields1.add(sObjectField35);
+        final SObjectField sObjectField36 = createField("Description", "Account Description", "textarea", "xsd:string", 32000,
+                false, true, false, false, false, false, false);
+        fields1.add(sObjectField36);
+        final SObjectField sObjectField37 = createField("Rating", "Account Rating", "picklist", "xsd:string", 255, false, true,
+                false, false, false, false, false);
+        fields1.add(sObjectField37);
+        final SObjectField sObjectField38 = createField("Site", "Account Site", "string", "xsd:string", 80, false, true, false,
+                false, false, false, false);
+        fields1.add(sObjectField38);
+        final SObjectField sObjectField39 = createField("OwnerId", "Owner ID", "reference", "tns:ID", 18, false, false, false,
+                false, false, false, false);
+        fields1.add(sObjectField39);
+        final SObjectField sObjectField40 = createField("CreatedDate", "Created Date", "datetime", "xsd:dateTime", 0, false,
+                false, false, false, false, false, false);
+        fields1.add(sObjectField40);
+        final SObjectField sObjectField41 = createField("CreatedById", "Created By ID", "reference", "tns:ID", 18, false, false,
+                false, false, false, false, false);
+        fields1.add(sObjectField41);
+        final SObjectField sObjectField42 = createField("LastModifiedDate", "Last Modified Date", "datetime", "xsd:dateTime", 0,
+                false, false, false, false, false, false, false);
+        fields1.add(sObjectField42);
+        final SObjectField sObjectField43 = createField("LastModifiedById", "Last Modified By ID", "reference", "tns:ID", 18,
+                false, false, false, false, false, false, false);
+        fields1.add(sObjectField43);
+        final SObjectField sObjectField44 = createField("SystemModstamp", "System Modstamp", "datetime", "xsd:dateTime", 0,
+                false, false, false, false, false, false, false);
+        fields1.add(sObjectField44);
+        final SObjectField sObjectField45 = createField("LastActivityDate", "Last Activity", "date", "xsd:date", 0, false, true,
+                false, false, false, false, false);
+        fields1.add(sObjectField45);
+        final SObjectField sObjectField46 = createField("LastViewedDate", "Last Viewed Date", "datetime", "xsd:dateTime", 0,
+                false, true, false, false, false, false, false);
+        fields1.add(sObjectField46);
+        final SObjectField sObjectField47 = createField("LastReferencedDate", "Last Referenced Date", "datetime",
+                "xsd:dateTime", 0, false, true, false, false, false, false, false);
+        fields1.add(sObjectField47);
+        final SObjectField sObjectField48 = createField("Jigsaw", "Data.com Key", "string", "xsd:string", 20, false, true,
+                false, false, false, false, false);
+        fields1.add(sObjectField48);
+        final SObjectField sObjectField49 = createField("JigsawCompanyId", "Jigsaw Company ID", "string", "xsd:string", 20,
+                false, true, false, false, false, false, false);
+        fields1.add(sObjectField49);
+        final SObjectField sObjectField50 = createField("CleanStatus", "Clean Status", "picklist", "xsd:string", 40, false,
+                true, false, false, false, false, false);
+        fields1.add(sObjectField50);
+        final SObjectField sObjectField51 = createField("AccountSource", "Account Source", "picklist", "xsd:string", 255, false,
+                true, false, false, false, false, false);
+        fields1.add(sObjectField51);
+        final SObjectField sObjectField52 = createField("DunsNumber", "D-U-N-S Number", "string", "xsd:string", 9, false, true,
+                false, false, false, false, false);
+        fields1.add(sObjectField52);
+        final SObjectField sObjectField53 = createField("Tradestyle", "Tradestyle", "string", "xsd:string", 255, false, true,
+                false, false, false, false, false);
+        fields1.add(sObjectField53);
+        final SObjectField sObjectField54 = createField("NaicsCode", "NAICS Code", "string", "xsd:string", 8, false, true,
+                false, false, false, false, false);
+        fields1.add(sObjectField54);
+        final SObjectField sObjectField55 = createField("NaicsDesc", "NAICS Description", "string", "xsd:string", 120, false,
+                true, false, false, false, false, false);
+        fields1.add(sObjectField55);
+        final SObjectField sObjectField56 = createField("YearStarted", "Year Started", "string", "xsd:string", 4, false, true,
+                false, false, false, false, false);
+        fields1.add(sObjectField56);
+        final SObjectField sObjectField57 = createField("SicDesc", "SIC Description", "string", "xsd:string", 80, false, true,
+                false, false, false, false, false);
+        fields1.add(sObjectField57);
+        final SObjectField sObjectField58 = createField("DandbCompanyId", "D&B Company ID", "reference", "tns:ID", 18, false,
+                true, false, false, false, false, false);
+        fields1.add(sObjectField58);
+        final SObjectField sObjectField59 = createField("CustomerPriority__c", "Customer Priority", "picklist", "xsd:string",
+                255, false, true, false, false, true, false, false);
+        fields1.add(sObjectField59);
+        final SObjectField sObjectField60 = createField("SLA__c", "SLA", "picklist", "xsd:string", 255, false, true, false,
+                false, true, false, false);
+        fields1.add(sObjectField60);
+        final SObjectField sObjectField61 = createField("Active__c", "Active", "picklist", "xsd:string", 255, false, true,
+                false, false, true, false, false);
+        fields1.add(sObjectField61);
+        final SObjectField sObjectField62 = createField("NumberofLocations__c", "Number of Locations", "double", "xsd:double",
+                0, false, true, false, false, true, false, false);
+        fields1.add(sObjectField62);
+        final SObjectField sObjectField63 = createField("UpsellOpportunity__c", "Upsell Opportunity", "picklist", "xsd:string",
+                255, false, true, false, false, true, false, false);
+        fields1.add(sObjectField63);
+        final SObjectField sObjectField64 = createField("SLASerialNumber__c", "SLA Serial Number", "string", "xsd:string", 10,
+                false, true, false, false, true, false, false);
+        fields1.add(sObjectField64);
+        final SObjectField sObjectField65 = createField("SLAExpirationDate__c", "SLA Expiration Date", "date", "xsd:date", 0,
+                false, true, false, false, true, false, false);
+        fields1.add(sObjectField65);
+        final SObjectField sObjectField66 = createField("MyMultiselect__c", "MyMultiselect", "multipicklist", "xsd:string",
+                4099, false, true, false, false, true, false, false);
+        fields1.add(sObjectField66);
+
+        description.setLabel("Account");
+        description.setLabelPlural("Accounts");
+        description.setName("Account");
+
+        final SObjectDescriptionUrls sObjectDescriptionUrls1 = new SObjectDescriptionUrls();
+        sObjectDescriptionUrls1.setApprovalLayouts("/services/data/v50.0/sobjects/Account/describe/approvalLayouts");
+        sObjectDescriptionUrls1.setCompactLayouts("/services/data/v50.0/sobjects/Account/describe/compactLayouts");
+        sObjectDescriptionUrls1.setDefaultValues("/services/data/v50.0/sobjects/Account/defaultValues?recordTypeId&fields");
+        sObjectDescriptionUrls1.setDescribe("/services/data/v50.0/sobjects/Account/describe");
+        sObjectDescriptionUrls1.setLayouts("/services/data/v50.0/sobjects/Account/describe/layouts");
+        sObjectDescriptionUrls1.setListviews("/services/data/v50.0/sobjects/Account/listviews");
+        sObjectDescriptionUrls1.setQuickActions("/services/data/v50.0/sobjects/Account/quickActions");
+        sObjectDescriptionUrls1.setRowTemplate("/services/data/v50.0/sobjects/Account/{ID}");
+        sObjectDescriptionUrls1.setSobject("/services/data/v50.0/sobjects/Account");
+        sObjectDescriptionUrls1.setUiDetailTemplate("https://eu37.salesforce.com/{ID}");
+        sObjectDescriptionUrls1.setUiEditTemplate("https://eu37.salesforce.com/{ID}/e");
+        sObjectDescriptionUrls1.setUiNewRecord("https://eu37.salesforce.com/001/e");
+        description.setUrls(sObjectDescriptionUrls1);
+
+        return description;
+    }
+}
diff --git a/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account_AccountSourceEnum.java b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account_AccountSourceEnum.java
new file mode 100644
index 0000000..e68db54
--- /dev/null
+++ b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account_AccountSourceEnum.java
@@ -0,0 +1,65 @@
+/*
+ * 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.quarkus.component.salesforce.generated;
+
+import javax.annotation.Generated;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+/**
+ * Salesforce Enumeration DTO for picklist AccountSource
+ */
+@Generated("org.apache.camel.maven.CamelSalesforceMojo")
+public enum Account_AccountSourceEnum {
+
+    // Other
+    OTHER("Other"),
+
+    // Partner Referral
+    PARTNER_REFERRAL("Partner Referral"),
+
+    // Phone Inquiry
+    PHONE_INQUIRY("Phone Inquiry"),
+
+    // Purchased List
+    PURCHASED_LIST("Purchased List"),
+
+    // Web
+    WEB("Web");
+
+    final String value;
+
+    private Account_AccountSourceEnum(String value) {
+        this.value = value;
+    }
+
+    @JsonValue
+    public String value() {
+        return this.value;
+    }
+
+    @JsonCreator
+    public static Account_AccountSourceEnum fromValue(String value) {
+        for (Account_AccountSourceEnum e : Account_AccountSourceEnum.values()) {
+            if (e.value.equals(value)) {
+                return e;
+            }
+        }
+        throw new IllegalArgumentException(value);
+    }
+}
diff --git a/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account_ActiveEnum.java b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account_ActiveEnum.java
new file mode 100644
index 0000000..b4b1a91
--- /dev/null
+++ b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account_ActiveEnum.java
@@ -0,0 +1,56 @@
+/*
+ * 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.quarkus.component.salesforce.generated;
+
+import javax.annotation.Generated;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+/**
+ * Salesforce Enumeration DTO for picklist Active__c
+ */
+@Generated("org.apache.camel.maven.CamelSalesforceMojo")
+public enum Account_ActiveEnum {
+
+    // No
+    NO("No"),
+
+    // Yes
+    YES("Yes");
+
+    final String value;
+
+    private Account_ActiveEnum(String value) {
+        this.value = value;
+    }
+
+    @JsonValue
+    public String value() {
+        return this.value;
+    }
+
+    @JsonCreator
+    public static Account_ActiveEnum fromValue(String value) {
+        for (Account_ActiveEnum e : Account_ActiveEnum.values()) {
+            if (e.value.equals(value)) {
+                return e;
+            }
+        }
+        throw new IllegalArgumentException(value);
+    }
+}
diff --git a/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account_BillingGeocodeAccuracyEnum.java b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account_BillingGeocodeAccuracyEnum.java
new file mode 100644
index 0000000..377bd07
--- /dev/null
+++ b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account_BillingGeocodeAccuracyEnum.java
@@ -0,0 +1,83 @@
+/*
+ * 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.quarkus.component.salesforce.generated;
+
+import javax.annotation.Generated;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+/**
+ * Salesforce Enumeration DTO for picklist BillingGeocodeAccuracy
+ */
+@Generated("org.apache.camel.maven.CamelSalesforceMojo")
+public enum Account_BillingGeocodeAccuracyEnum {
+
+    // Address
+    ADDRESS("Address"),
+
+    // Block
+    BLOCK("Block"),
+
+    // City
+    CITY("City"),
+
+    // County
+    COUNTY("County"),
+
+    // ExtendedZip
+    EXTENDEDZIP("ExtendedZip"),
+
+    // NearAddress
+    NEARADDRESS("NearAddress"),
+
+    // Neighborhood
+    NEIGHBORHOOD("Neighborhood"),
+
+    // State
+    STATE("State"),
+
+    // Street
+    STREET("Street"),
+
+    // Unknown
+    UNKNOWN("Unknown"),
+
+    // Zip
+    ZIP("Zip");
+
+    final String value;
+
+    private Account_BillingGeocodeAccuracyEnum(String value) {
+        this.value = value;
+    }
+
+    @JsonValue
+    public String value() {
+        return this.value;
+    }
+
+    @JsonCreator
+    public static Account_BillingGeocodeAccuracyEnum fromValue(String value) {
+        for (Account_BillingGeocodeAccuracyEnum e : Account_BillingGeocodeAccuracyEnum.values()) {
+            if (e.value.equals(value)) {
+                return e;
+            }
+        }
+        throw new IllegalArgumentException(value);
+    }
+}
diff --git a/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account_CleanStatusEnum.java b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account_CleanStatusEnum.java
new file mode 100644
index 0000000..d4a6c11
--- /dev/null
+++ b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account_CleanStatusEnum.java
@@ -0,0 +1,74 @@
+/*
+ * 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.quarkus.component.salesforce.generated;
+
+import javax.annotation.Generated;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+/**
+ * Salesforce Enumeration DTO for picklist CleanStatus
+ */
+@Generated("org.apache.camel.maven.CamelSalesforceMojo")
+public enum Account_CleanStatusEnum {
+
+    // Acknowledged
+    ACKNOWLEDGED("Acknowledged"),
+
+    // Different
+    DIFFERENT("Different"),
+
+    // Inactive
+    INACTIVE("Inactive"),
+
+    // Matched
+    MATCHED("Matched"),
+
+    // NotFound
+    NOTFOUND("NotFound"),
+
+    // Pending
+    PENDING("Pending"),
+
+    // SelectMatch
+    SELECTMATCH("SelectMatch"),
+
+    // Skipped
+    SKIPPED("Skipped");
+
+    final String value;
+
+    private Account_CleanStatusEnum(String value) {
+        this.value = value;
+    }
+
+    @JsonValue
+    public String value() {
+        return this.value;
+    }
+
+    @JsonCreator
+    public static Account_CleanStatusEnum fromValue(String value) {
+        for (Account_CleanStatusEnum e : Account_CleanStatusEnum.values()) {
+            if (e.value.equals(value)) {
+                return e;
+            }
+        }
+        throw new IllegalArgumentException(value);
+    }
+}
diff --git a/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account_CustomerPriorityEnum.java b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account_CustomerPriorityEnum.java
new file mode 100644
index 0000000..8eb1cae
--- /dev/null
+++ b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account_CustomerPriorityEnum.java
@@ -0,0 +1,59 @@
+/*
+ * 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.quarkus.component.salesforce.generated;
+
+import javax.annotation.Generated;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+/**
+ * Salesforce Enumeration DTO for picklist CustomerPriority__c
+ */
+@Generated("org.apache.camel.maven.CamelSalesforceMojo")
+public enum Account_CustomerPriorityEnum {
+
+    // High
+    HIGH("High"),
+
+    // Low
+    LOW("Low"),
+
+    // Medium
+    MEDIUM("Medium");
+
+    final String value;
+
+    private Account_CustomerPriorityEnum(String value) {
+        this.value = value;
+    }
+
+    @JsonValue
+    public String value() {
+        return this.value;
+    }
+
+    @JsonCreator
+    public static Account_CustomerPriorityEnum fromValue(String value) {
+        for (Account_CustomerPriorityEnum e : Account_CustomerPriorityEnum.values()) {
+            if (e.value.equals(value)) {
+                return e;
+            }
+        }
+        throw new IllegalArgumentException(value);
+    }
+}
diff --git a/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account_IndustryEnum.java b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account_IndustryEnum.java
new file mode 100644
index 0000000..f967fbd
--- /dev/null
+++ b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account_IndustryEnum.java
@@ -0,0 +1,146 @@
+/*
+ * 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.quarkus.component.salesforce.generated;
+
+import javax.annotation.Generated;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+/**
+ * Salesforce Enumeration DTO for picklist Industry
+ */
+@Generated("org.apache.camel.maven.CamelSalesforceMojo")
+public enum Account_IndustryEnum {
+
+    // Agriculture
+    AGRICULTURE("Agriculture"),
+
+    // Apparel
+    APPAREL("Apparel"),
+
+    // Banking
+    BANKING("Banking"),
+
+    // Biotechnology
+    BIOTECHNOLOGY("Biotechnology"),
+
+    // Chemicals
+    CHEMICALS("Chemicals"),
+
+    // Communications
+    COMMUNICATIONS("Communications"),
+
+    // Construction
+    CONSTRUCTION("Construction"),
+
+    // Consulting
+    CONSULTING("Consulting"),
+
+    // Education
+    EDUCATION("Education"),
+
+    // Electronics
+    ELECTRONICS("Electronics"),
+
+    // Energy
+    ENERGY("Energy"),
+
+    // Engineering
+    ENGINEERING("Engineering"),
+
+    // Entertainment
+    ENTERTAINMENT("Entertainment"),
+
+    // Environmental
+    ENVIRONMENTAL("Environmental"),
+
+    // Finance
+    FINANCE("Finance"),
+
+    // Food & Beverage
+    FOOD___BEVERAGE("Food & Beverage"),
+
+    // Government
+    GOVERNMENT("Government"),
+
+    // Healthcare
+    HEALTHCARE("Healthcare"),
+
+    // Hospitality
+    HOSPITALITY("Hospitality"),
+
+    // Insurance
+    INSURANCE("Insurance"),
+
+    // Machinery
+    MACHINERY("Machinery"),
+
+    // Manufacturing
+    MANUFACTURING("Manufacturing"),
+
+    // Media
+    MEDIA("Media"),
+
+    // Not For Profit
+    NOT_FOR_PROFIT("Not For Profit"),
+
+    // Other
+    OTHER("Other"),
+
+    // Recreation
+    RECREATION("Recreation"),
+
+    // Retail
+    RETAIL("Retail"),
+
+    // Shipping
+    SHIPPING("Shipping"),
+
+    // Technology
+    TECHNOLOGY("Technology"),
+
+    // Telecommunications
+    TELECOMMUNICATIONS("Telecommunications"),
+
+    // Transportation
+    TRANSPORTATION("Transportation"),
+
+    // Utilities
+    UTILITIES("Utilities");
+
+    final String value;
+
+    private Account_IndustryEnum(String value) {
+        this.value = value;
+    }
+
+    @JsonValue
+    public String value() {
+        return this.value;
+    }
+
+    @JsonCreator
+    public static Account_IndustryEnum fromValue(String value) {
+        for (Account_IndustryEnum e : Account_IndustryEnum.values()) {
+            if (e.value.equals(value)) {
+                return e;
+            }
+        }
+        throw new IllegalArgumentException(value);
+    }
+}
diff --git a/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account_MyMultiselectEnum.java b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account_MyMultiselectEnum.java
new file mode 100644
index 0000000..7eecfc9
--- /dev/null
+++ b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account_MyMultiselectEnum.java
@@ -0,0 +1,59 @@
+/*
+ * 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.quarkus.component.salesforce.generated;
+
+import javax.annotation.Generated;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+/**
+ * Salesforce Enumeration DTO for picklist MyMultiselect__c
+ */
+@Generated("org.apache.camel.maven.CamelSalesforceMojo")
+public enum Account_MyMultiselectEnum {
+
+    // bar
+    BAR("bar"),
+
+    // cheese
+    CHEESE("cheese"),
+
+    // foo
+    FOO("foo");
+
+    final String value;
+
+    private Account_MyMultiselectEnum(String value) {
+        this.value = value;
+    }
+
+    @JsonValue
+    public String value() {
+        return this.value;
+    }
+
+    @JsonCreator
+    public static Account_MyMultiselectEnum fromValue(String value) {
+        for (Account_MyMultiselectEnum e : Account_MyMultiselectEnum.values()) {
+            if (e.value.equals(value)) {
+                return e;
+            }
+        }
+        throw new IllegalArgumentException(value);
+    }
+}
diff --git a/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account_OwnershipEnum.java b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account_OwnershipEnum.java
new file mode 100644
index 0000000..1a8ae3a
--- /dev/null
+++ b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account_OwnershipEnum.java
@@ -0,0 +1,62 @@
+/*
+ * 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.quarkus.component.salesforce.generated;
+
+import javax.annotation.Generated;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+/**
+ * Salesforce Enumeration DTO for picklist Ownership
+ */
+@Generated("org.apache.camel.maven.CamelSalesforceMojo")
+public enum Account_OwnershipEnum {
+
+    // Other
+    OTHER("Other"),
+
+    // Private
+    PRIVATE("Private"),
+
+    // Public
+    PUBLIC("Public"),
+
+    // Subsidiary
+    SUBSIDIARY("Subsidiary");
+
+    final String value;
+
+    private Account_OwnershipEnum(String value) {
+        this.value = value;
+    }
+
+    @JsonValue
+    public String value() {
+        return this.value;
+    }
+
+    @JsonCreator
+    public static Account_OwnershipEnum fromValue(String value) {
+        for (Account_OwnershipEnum e : Account_OwnershipEnum.values()) {
+            if (e.value.equals(value)) {
+                return e;
+            }
+        }
+        throw new IllegalArgumentException(value);
+    }
+}
diff --git a/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account_RatingEnum.java b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account_RatingEnum.java
new file mode 100644
index 0000000..aad7420
--- /dev/null
+++ b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account_RatingEnum.java
@@ -0,0 +1,59 @@
+/*
+ * 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.quarkus.component.salesforce.generated;
+
+import javax.annotation.Generated;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+/**
+ * Salesforce Enumeration DTO for picklist Rating
+ */
+@Generated("org.apache.camel.maven.CamelSalesforceMojo")
+public enum Account_RatingEnum {
+
+    // Cold
+    COLD("Cold"),
+
+    // Hot
+    HOT("Hot"),
+
+    // Warm
+    WARM("Warm");
+
+    final String value;
+
+    private Account_RatingEnum(String value) {
+        this.value = value;
+    }
+
+    @JsonValue
+    public String value() {
+        return this.value;
+    }
+
+    @JsonCreator
+    public static Account_RatingEnum fromValue(String value) {
+        for (Account_RatingEnum e : Account_RatingEnum.values()) {
+            if (e.value.equals(value)) {
+                return e;
+            }
+        }
+        throw new IllegalArgumentException(value);
+    }
+}
diff --git a/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account_SLAEnum.java b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account_SLAEnum.java
new file mode 100644
index 0000000..fdcdebe
--- /dev/null
+++ b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account_SLAEnum.java
@@ -0,0 +1,62 @@
+/*
+ * 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.quarkus.component.salesforce.generated;
+
+import javax.annotation.Generated;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+/**
+ * Salesforce Enumeration DTO for picklist SLA__c
+ */
+@Generated("org.apache.camel.maven.CamelSalesforceMojo")
+public enum Account_SLAEnum {
+
+    // Bronze
+    BRONZE("Bronze"),
+
+    // Gold
+    GOLD("Gold"),
+
+    // Platinum
+    PLATINUM("Platinum"),
+
+    // Silver
+    SILVER("Silver");
+
+    final String value;
+
+    private Account_SLAEnum(String value) {
+        this.value = value;
+    }
+
+    @JsonValue
+    public String value() {
+        return this.value;
+    }
+
+    @JsonCreator
+    public static Account_SLAEnum fromValue(String value) {
+        for (Account_SLAEnum e : Account_SLAEnum.values()) {
+            if (e.value.equals(value)) {
+                return e;
+            }
+        }
+        throw new IllegalArgumentException(value);
+    }
+}
diff --git a/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account_ShippingGeocodeAccuracyEnum.java b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account_ShippingGeocodeAccuracyEnum.java
new file mode 100644
index 0000000..c8ac7f6
--- /dev/null
+++ b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account_ShippingGeocodeAccuracyEnum.java
@@ -0,0 +1,83 @@
+/*
+ * 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.quarkus.component.salesforce.generated;
+
+import javax.annotation.Generated;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+/**
+ * Salesforce Enumeration DTO for picklist ShippingGeocodeAccuracy
+ */
+@Generated("org.apache.camel.maven.CamelSalesforceMojo")
+public enum Account_ShippingGeocodeAccuracyEnum {
+
+    // Address
+    ADDRESS("Address"),
+
+    // Block
+    BLOCK("Block"),
+
+    // City
+    CITY("City"),
+
+    // County
+    COUNTY("County"),
+
+    // ExtendedZip
+    EXTENDEDZIP("ExtendedZip"),
+
+    // NearAddress
+    NEARADDRESS("NearAddress"),
+
+    // Neighborhood
+    NEIGHBORHOOD("Neighborhood"),
+
+    // State
+    STATE("State"),
+
+    // Street
+    STREET("Street"),
+
+    // Unknown
+    UNKNOWN("Unknown"),
+
+    // Zip
+    ZIP("Zip");
+
+    final String value;
+
+    private Account_ShippingGeocodeAccuracyEnum(String value) {
+        this.value = value;
+    }
+
+    @JsonValue
+    public String value() {
+        return this.value;
+    }
+
+    @JsonCreator
+    public static Account_ShippingGeocodeAccuracyEnum fromValue(String value) {
+        for (Account_ShippingGeocodeAccuracyEnum e : Account_ShippingGeocodeAccuracyEnum.values()) {
+            if (e.value.equals(value)) {
+                return e;
+            }
+        }
+        throw new IllegalArgumentException(value);
+    }
+}
diff --git a/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account_TypeEnum.java b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account_TypeEnum.java
new file mode 100644
index 0000000..34cc5d2
--- /dev/null
+++ b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account_TypeEnum.java
@@ -0,0 +1,71 @@
+/*
+ * 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.quarkus.component.salesforce.generated;
+
+import javax.annotation.Generated;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+/**
+ * Salesforce Enumeration DTO for picklist Type
+ */
+@Generated("org.apache.camel.maven.CamelSalesforceMojo")
+public enum Account_TypeEnum {
+
+    // Channel Partner / Reseller
+    CHANNEL_PARTNER___RESELLER("Channel Partner / Reseller"),
+
+    // Customer - Channel
+    CUSTOMER___CHANNEL("Customer - Channel"),
+
+    // Customer - Direct
+    CUSTOMER___DIRECT("Customer - Direct"),
+
+    // Installation Partner
+    INSTALLATION_PARTNER("Installation Partner"),
+
+    // Other
+    OTHER("Other"),
+
+    // Prospect
+    PROSPECT("Prospect"),
+
+    // Technology Partner
+    TECHNOLOGY_PARTNER("Technology Partner");
+
+    final String value;
+
+    private Account_TypeEnum(String value) {
+        this.value = value;
+    }
+
+    @JsonValue
+    public String value() {
+        return this.value;
+    }
+
+    @JsonCreator
+    public static Account_TypeEnum fromValue(String value) {
+        for (Account_TypeEnum e : Account_TypeEnum.values()) {
+            if (e.value.equals(value)) {
+                return e;
+            }
+        }
+        throw new IllegalArgumentException(value);
+    }
+}
diff --git a/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account_UpsellOpportunityEnum.java b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account_UpsellOpportunityEnum.java
new file mode 100644
index 0000000..b49fc1f
--- /dev/null
+++ b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account_UpsellOpportunityEnum.java
@@ -0,0 +1,59 @@
+/*
+ * 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.quarkus.component.salesforce.generated;
+
+import javax.annotation.Generated;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+/**
+ * Salesforce Enumeration DTO for picklist UpsellOpportunity__c
+ */
+@Generated("org.apache.camel.maven.CamelSalesforceMojo")
+public enum Account_UpsellOpportunityEnum {
+
+    // Maybe
+    MAYBE("Maybe"),
+
+    // No
+    NO("No"),
+
+    // Yes
+    YES("Yes");
+
+    final String value;
+
+    private Account_UpsellOpportunityEnum(String value) {
+        this.value = value;
+    }
+
+    @JsonValue
+    public String value() {
+        return this.value;
+    }
+
+    @JsonCreator
+    public static Account_UpsellOpportunityEnum fromValue(String value) {
+        for (Account_UpsellOpportunityEnum e : Account_UpsellOpportunityEnum.values()) {
+            if (e.value.equals(value)) {
+                return e;
+            }
+        }
+        throw new IllegalArgumentException(value);
+    }
+}
diff --git a/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/QueryRecordsAccount.java b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/QueryRecordsAccount.java
new file mode 100644
index 0000000..78cab0f
--- /dev/null
+++ b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/QueryRecordsAccount.java
@@ -0,0 +1,42 @@
+/*
+ * 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.quarkus.component.salesforce.generated;
+
+import java.util.List;
+
+import javax.annotation.Generated;
+
+import com.thoughtworks.xstream.annotations.XStreamImplicit;
+import org.apache.camel.component.salesforce.api.dto.AbstractQueryRecordsBase;
+
+/**
+ * Salesforce QueryRecords DTO for type Account
+ */
+@Generated("org.apache.camel.maven.CamelSalesforceMojo")
+public class QueryRecordsAccount extends AbstractQueryRecordsBase {
+
+    @XStreamImplicit
+    private List<Account> records;
+
+    public List<Account> getRecords() {
+        return records;
+    }
+
+    public void setRecords(List<Account> records) {
+        this.records = records;
+    }
+}
diff --git a/integration-tests/salesforce/src/test/java/org/apache/camel/quarkus/component/salesforce/SalesforceTest.java b/integration-tests/salesforce/src/test/java/org/apache/camel/quarkus/component/salesforce/SalesforceTest.java
index 5f5b086..1de2906 100644
--- a/integration-tests/salesforce/src/test/java/org/apache/camel/quarkus/component/salesforce/SalesforceTest.java
+++ b/integration-tests/salesforce/src/test/java/org/apache/camel/quarkus/component/salesforce/SalesforceTest.java
@@ -16,12 +16,20 @@
  */
 package org.apache.camel.quarkus.component.salesforce;
 
+import java.util.UUID;
+
 import io.quarkus.test.junit.QuarkusTest;
 import io.restassured.RestAssured;
+import io.restassured.path.json.JsonPath;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
 
-import static org.hamcrest.core.Is.is;
+import static org.hamcrest.Matchers.emptyString;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.core.IsNot.not;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 @EnabledIfEnvironmentVariable(named = "SALESFORCE_USERNAME", matches = ".+")
 @EnabledIfEnvironmentVariable(named = "SALESFORCE_PASSWORD", matches = ".+")
@@ -31,10 +39,92 @@ import static org.hamcrest.core.Is.is;
 class SalesforceTest {
 
     @Test
-    public void testSalesforceComponent() {
+    public void testGetDocumentRaw() {
         RestAssured.get("/salesforce/document/test")
                 .then()
                 .statusCode(200)
                 .body("attributes.type", is("Document"));
     }
+
+    @Test
+    public void testGetAccountDTO() {
+        RestAssured.get("/salesforce/account")
+                .then()
+                .statusCode(200)
+                .body(
+                        "id", not(emptyString()),
+                        "accountNumber", not(emptyString()));
+    }
+
+    @Test
+    public void testBulkJobApi() {
+        // Create bulk job
+        JsonPath jobInfo = RestAssured.given()
+                .post("/salesforce/bulk")
+                .then()
+                .statusCode(200)
+                .extract()
+                .body()
+                .jsonPath();
+
+        String id = jobInfo.getString("id");
+        String state = jobInfo.getString("state");
+        assertNotNull(id);
+        assertTrue(id.length() > 0);
+        assertEquals("OPEN", state);
+
+        // Abort bulk job
+        jobInfo = RestAssured.given()
+                .queryParam("jobId", id)
+                .delete("/salesforce/bulk")
+                .then()
+                .statusCode(200)
+                .extract()
+                .body()
+                .jsonPath();
+
+        state = jobInfo.getString("state");
+        assertEquals("ABORTED", state);
+    }
+
+    @Test
+    public void testChangeDataCaptureEvents() {
+        String accountId = null;
+        try {
+            // Start the Salesforce CDC consumer
+            RestAssured.post("/salesforce/cdc/start")
+                    .then()
+                    .statusCode(200);
+
+            // Create an account
+            String accountName = "Camel Quarkus Account Test: " + UUID.randomUUID().toString();
+            accountId = RestAssured.given()
+                    .body(accountName)
+                    .post("/salesforce/account")
+                    .then()
+                    .statusCode(200)
+                    .extract()
+                    .body()
+                    .asString();
+
+            // Verify we captured the account creation event
+            RestAssured.given()
+                    .get("/salesforce/cdc")
+                    .then()
+                    .statusCode(200)
+                    .body("Name", is(accountName));
+        } finally {
+            // Shut down the CDC consumer
+            RestAssured.post("/salesforce/cdc/stop")
+                    .then()
+                    .statusCode(200);
+
+            // Clean up
+            if (accountId != null) {
+                RestAssured.delete("/salesforce/account/" + accountId)
+                        .then()
+                        .statusCode(204);
+            }
+        }
+    }
 }
diff --git a/poms/build-parent-it/pom.xml b/poms/build-parent-it/pom.xml
index 10bd26a..ec3d40b 100644
--- a/poms/build-parent-it/pom.xml
+++ b/poms/build-parent-it/pom.xml
@@ -67,6 +67,11 @@
                         </execution>
                     </executions>
                 </plugin>
+                <plugin>
+                    <groupId>org.apache.camel.maven</groupId>
+                    <artifactId>camel-salesforce-maven-plugin</artifactId>
+                    <version>${camel.version}</version>
+                </plugin>
             </plugins>
         </pluginManagement>
         <plugins>