anchor.diff:  is a good fit to better know the subtleties of implementing a change data capture integration application.
   The dynamic nature of change event body fields, high level replication steps as well as security considerations could be of interest.
   
  -== Examples
  -
  -=== Uploading a document to a ContentWorkspace
  -
  -Create the ContentVersion in Java, using a Processor instance:
  -
  -[source,java]
  -----
  -public class ContentProcessor implements Processor {
  -    public void process(Exchange exchange) throws Exception {
  -        Message message = exchange.getIn();
  -
  -        ContentVersion cv = new ContentVersion();
  -        ContentWorkspace cw = getWorkspace(exchange);
  -        cv.setFirstPublishLocationId(cw.getId());
  -        cv.setTitle("test document");
  -        cv.setPathOnClient("test_doc.html");
  -        byte[] document = message.getBody(byte[].class);
  -        ObjectMapper mapper = new ObjectMapper();
  -        String enc = mapper.convertValue(document, String.class);
  -        cv.setVersionDataUrl(enc);
  -        message.setBody(cv);
  -    }
  -
  -    protected ContentWorkspace getWorkSpace(Exchange exchange) {
  -        // Look up the content workspace somehow, maybe use enrich() to add it to a
  -        // header that can be extracted here
  -        ....
  -    }
  -} 
  -----
  -
  -Give the output from the processor to the Salesforce component:
  -
  -[source,java]
  -----
  -from("file:///home/camel/library")
  -    .to(new ContentProcessor())     // convert bytes from the file into a ContentVersion SObject 
  -                                    // for the salesforce component
  -    .to("salesforce:createSObject"); 
  -----
   
   == Using Salesforce Limits API
   
  
positive.code: accountSObject.getFieldsToNull().add("Site");
  ----
  
  == Generating SOQL query strings
  
  `org.apache.camel.component.salesforce.api.utils.QueryHelper` contains helper
  
negative.code:         .setBody(constant("Used up Salesforce API limits, leaving 10% for critical routes"))
      .endChoice()
  ----
  
  == Invoking Apex REST endpoints
  
  You can https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_rest_intro.htm[expose your Apex class and methods]
  so that external applications can access your code and your application through the REST architecture.
  
  The URI format for invoking Apex REST is:
  
  ----
  salesforce:apexCall[/yourApexRestUrl][?options]
  ----
  
  You can supply the apexUrl either in the endpoint (see above), or as the `apexUrl` option as listed in the table below.
  In either case the Apex URL can contain placeholders in the format of `{headerName}`. E.g., for the Apex URL `MyApexClass/{id}`,
  the value of the header named `id` will be used to replace the placeholder.
  
  |===
  | Parameter | Type | Description| Default| Required
  
  | request body | `Map<String, Object>` if `GET`, otherwise `String` or `InputStream`| In the case of a `GET`, the body (`Map` instance)
  is transformed into query parameters. For other HTTP methods, the body is used for the HTTP body. | |
  | `apexUrl` | `String` | The portion of the endpoint URL after `https://instance.salesforce.com/services/apexrest/`, e.g., 'MyApexClass/' | |
  | `apexMethod` | `String` | The HTTP method (e.g. `GET`, `POST`) to use. | `GET` |
  | `rawPayload` | `Boolean` | If true, Camel will not serialize the request or response bodies. | false |
  | Header: `apexQueryParam.[paramName]` | Object | Headers that override apex parameters passed in the endpoint. | false |
  | `sObjectName` | `String` | Name of sObject (e.g. `Merchandise__c`) used to deserialize the response | false |
  | `sObjectClass` | `String` | Fully qualified class name used to deserialize the response | false |
  |===
  
  
  
  == Working with approvals
  
  