You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by zr...@apache.org on 2017/08/29 15:08:24 UTC

[1/2] camel git commit: CAMEL-11667: Support Metadata component extension

Repository: camel
Updated Branches:
  refs/heads/master 26aa4e8f1 -> ce86029bb


http://git-wip-us.apache.org/repos/asf/camel/blob/ce86029b/components/camel-salesforce/camel-salesforce-component/src/test/resources/objectDescription.json
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/test/resources/objectDescription.json b/components/camel-salesforce/camel-salesforce-component/src/test/resources/objectDescription.json
new file mode 100644
index 0000000..0fa7493
--- /dev/null
+++ b/components/camel-salesforce/camel-salesforce-component/src/test/resources/objectDescription.json
@@ -0,0 +1 @@
+{"actionOverrides":[],"activateable":false,"childRelationships":[{"cascadeDelete":true,"childSObject":"ActivityHistory","deprecatedAndHidden":false,"field":"WhatId","junctionIdListName":null,"junctionReferenceTo":[],"relationshipName":"ActivityHistories","restrictedDelete":false},{"cascadeDelete":true,"childSObject":"AttachedContentDocument","deprecatedAndHidden":false,"field":"LinkedEntityId","junctionIdListName":null,"junctionReferenceTo":[],"relationshipName":"AttachedContentDocuments","restrictedDelete":false},{"cascadeDelete":true,"childSObject":"Attachment","deprecatedAndHidden":false,"field":"ParentId","junctionIdListName":null,"junctionReferenceTo":[],"relationshipName":"Attachments","restrictedDelete":false},{"cascadeDelete":true,"childSObject":"CollaborationGroupRecord","deprecatedAndHidden":false,"field":"RecordId","junctionIdListName":null,"junctionReferenceTo":[],"relationshipName":"RecordAssociatedGroups","restrictedDelete":false},{"cascadeDelete":true,"childSObject":"
 CombinedAttachment","deprecatedAndHidden":false,"field":"ParentId","junctionIdListName":null,"junctionReferenceTo":[],"relationshipName":"CombinedAttachments","restrictedDelete":false},{"cascadeDelete":true,"childSObject":"ContentDistribution","deprecatedAndHidden":false,"field":"RelatedRecordId","junctionIdListName":null,"junctionReferenceTo":[],"relationshipName":null,"restrictedDelete":false},{"cascadeDelete":true,"childSObject":"ContentDocumentLink","deprecatedAndHidden":false,"field":"LinkedEntityId","junctionIdListName":null,"junctionReferenceTo":[],"relationshipName":"ContentDocumentLinks","restrictedDelete":false},{"cascadeDelete":false,"childSObject":"ContentVersion","deprecatedAndHidden":false,"field":"FirstPublishLocationId","junctionIdListName":null,"junctionReferenceTo":[],"relationshipName":null,"restrictedDelete":false},{"cascadeDelete":true,"childSObject":"DuplicateRecordItem","deprecatedAndHidden":false,"field":"RecordId","junctionIdListName":null,"junctionReference
 To":[],"relationshipName":"DuplicateRecordItems","restrictedDelete":false},{"cascadeDelete":true,"childSObject":"EntitySubscription","deprecatedAndHidden":false,"field":"ParentId","junctionIdListName":null,"junctionReferenceTo":[],"relationshipName":"FeedSubscriptionsForEntity","restrictedDelete":false},{"cascadeDelete":true,"childSObject":"Event","deprecatedAndHidden":false,"field":"WhatId","junctionIdListName":null,"junctionReferenceTo":[],"relationshipName":"Events","restrictedDelete":false},{"cascadeDelete":false,"childSObject":"FeedComment","deprecatedAndHidden":false,"field":"ParentId","junctionIdListName":null,"junctionReferenceTo":[],"relationshipName":null,"restrictedDelete":false},{"cascadeDelete":true,"childSObject":"FeedItem","deprecatedAndHidden":false,"field":"ParentId","junctionIdListName":null,"junctionReferenceTo":[],"relationshipName":null,"restrictedDelete":false},{"cascadeDelete":false,"childSObject":"Line_Item__c","deprecatedAndHidden":false,"field":"Merchandise
 __c","junctionIdListName":null,"junctionReferenceTo":[],"relationshipName":"Line_Items__r","restrictedDelete":false},{"cascadeDelete":true,"childSObject":"Merchandise__Feed","deprecatedAndHidden":false,"field":"ParentId","junctionIdListName":null,"junctionReferenceTo":[],"relationshipName":"Feeds","restrictedDelete":false},{"cascadeDelete":true,"childSObject":"Note","deprecatedAndHidden":false,"field":"ParentId","junctionIdListName":null,"junctionReferenceTo":[],"relationshipName":"Notes","restrictedDelete":false},{"cascadeDelete":true,"childSObject":"NoteAndAttachment","deprecatedAndHidden":false,"field":"ParentId","junctionIdListName":null,"junctionReferenceTo":[],"relationshipName":"NotesAndAttachments","restrictedDelete":false},{"cascadeDelete":true,"childSObject":"OpenActivity","deprecatedAndHidden":false,"field":"WhatId","junctionIdListName":null,"junctionReferenceTo":[],"relationshipName":"OpenActivities","restrictedDelete":false},{"cascadeDelete":true,"childSObject":"Process
 Instance","deprecatedAndHidden":false,"field":"TargetObjectId","junctionIdListName":null,"junctionReferenceTo":[],"relationshipName":"ProcessInstances","restrictedDelete":false},{"cascadeDelete":false,"childSObject":"ProcessInstanceHistory","deprecatedAndHidden":false,"field":"TargetObjectId","junctionIdListName":null,"junctionReferenceTo":[],"relationshipName":"ProcessSteps","restrictedDelete":false},{"cascadeDelete":true,"childSObject":"Task","deprecatedAndHidden":false,"field":"WhatId","junctionIdListName":null,"junctionReferenceTo":[],"relationshipName":"Tasks","restrictedDelete":false},{"cascadeDelete":true,"childSObject":"TopicAssignment","deprecatedAndHidden":false,"field":"EntityId","junctionIdListName":null,"junctionReferenceTo":[],"relationshipName":"TopicAssignments","restrictedDelete":false}],"compactLayoutable":true,"createable":true,"custom":true,"customSetting":false,"deletable":true,"deprecatedAndHidden":false,"feedEnabled":true,"fields":[{"autoNumber":false,"byteLen
 gth":18,"calculated":false,"calculatedFormula":null,"cascadeDelete":false,"caseSensitive":false,"controllerName":null,"createable":false,"custom":false,"defaultValue":null,"defaultValueFormula":null,"defaultedOnCreate":true,"dependentPicklist":false,"deprecatedAndHidden":false,"digits":0,"displayLocationInDecimal":false,"encrypted":false,"externalId":false,"extraTypeInfo":null,"filterable":true,"filteredLookupInfo":null,"groupable":true,"highScaleNumber":false,"htmlFormatted":false,"idLookup":true,"inlineHelpText":null,"label":"Record ID","length":18,"mask":null,"maskType":null,"name":"Id","nameField":false,"namePointing":false,"nillable":false,"permissionable":false,"picklistValues":[],"precision":0,"queryByDistance":false,"referenceTargetField":null,"referenceTo":[],"relationshipName":null,"relationshipOrder":null,"restrictedDelete":false,"restrictedPicklist":false,"scale":0,"soapType":"tns:ID","sortable":true,"type":"id","unique":false,"updateable":false,"writeRequiresMasterRead"
 :false},{"autoNumber":false,"byteLength":18,"calculated":false,"calculatedFormula":null,"cascadeDelete":false,"caseSensitive":false,"controllerName":null,"createable":true,"custom":false,"defaultValue":null,"defaultValueFormula":null,"defaultedOnCreate":true,"dependentPicklist":false,"deprecatedAndHidden":false,"digits":0,"displayLocationInDecimal":false,"encrypted":false,"externalId":false,"extraTypeInfo":null,"filterable":true,"filteredLookupInfo":null,"groupable":true,"highScaleNumber":false,"htmlFormatted":false,"idLookup":false,"inlineHelpText":null,"label":"Owner ID","length":18,"mask":null,"maskType":null,"name":"OwnerId","nameField":false,"namePointing":true,"nillable":false,"permissionable":false,"picklistValues":[],"precision":0,"queryByDistance":false,"referenceTargetField":null,"referenceTo":["Group","User"],"relationshipName":"Owner","relationshipOrder":null,"restrictedDelete":false,"restrictedPicklist":false,"scale":0,"soapType":"tns:ID","sortable":true,"type":"referen
 ce","unique":false,"updateable":true,"writeRequiresMasterRead":false},{"autoNumber":false,"byteLength":0,"calculated":false,"calculatedFormula":null,"cascadeDelete":false,"caseSensitive":false,"controllerName":null,"createable":false,"custom":false,"defaultValue":null,"defaultValueFormula":null,"defaultedOnCreate":true,"dependentPicklist":false,"deprecatedAndHidden":false,"digits":0,"displayLocationInDecimal":false,"encrypted":false,"externalId":false,"extraTypeInfo":null,"filterable":true,"filteredLookupInfo":null,"groupable":true,"highScaleNumber":false,"htmlFormatted":false,"idLookup":false,"inlineHelpText":null,"label":"Deleted","length":0,"mask":null,"maskType":null,"name":"IsDeleted","nameField":false,"namePointing":false,"nillable":false,"permissionable":false,"picklistValues":[],"precision":0,"queryByDistance":false,"referenceTargetField":null,"referenceTo":[],"relationshipName":null,"relationshipOrder":null,"restrictedDelete":false,"restrictedPicklist":false,"scale":0,"soap
 Type":"xsd:boolean","sortable":true,"type":"boolean","unique":false,"updateable":false,"writeRequiresMasterRead":false},{"autoNumber":false,"byteLength":240,"calculated":false,"calculatedFormula":null,"cascadeDelete":false,"caseSensitive":false,"controllerName":null,"createable":true,"custom":false,"defaultValue":null,"defaultValueFormula":null,"defaultedOnCreate":true,"dependentPicklist":false,"deprecatedAndHidden":false,"digits":0,"displayLocationInDecimal":false,"encrypted":false,"externalId":false,"extraTypeInfo":null,"filterable":true,"filteredLookupInfo":null,"groupable":true,"highScaleNumber":false,"htmlFormatted":false,"idLookup":true,"inlineHelpText":null,"label":"Merchandise Name","length":80,"mask":null,"maskType":null,"name":"Name","nameField":true,"namePointing":false,"nillable":true,"permissionable":false,"picklistValues":[],"precision":0,"queryByDistance":false,"referenceTargetField":null,"referenceTo":[],"relationshipName":null,"relationshipOrder":null,"restrictedDel
 ete":false,"restrictedPicklist":false,"scale":0,"soapType":"xsd:string","sortable":true,"type":"string","unique":false,"updateable":true,"writeRequiresMasterRead":false},{"autoNumber":false,"byteLength":0,"calculated":false,"calculatedFormula":null,"cascadeDelete":false,"caseSensitive":false,"controllerName":null,"createable":false,"custom":false,"defaultValue":null,"defaultValueFormula":null,"defaultedOnCreate":true,"dependentPicklist":false,"deprecatedAndHidden":false,"digits":0,"displayLocationInDecimal":false,"encrypted":false,"externalId":false,"extraTypeInfo":null,"filterable":true,"filteredLookupInfo":null,"groupable":false,"highScaleNumber":false,"htmlFormatted":false,"idLookup":false,"inlineHelpText":null,"label":"Created Date","length":0,"mask":null,"maskType":null,"name":"CreatedDate","nameField":false,"namePointing":false,"nillable":false,"permissionable":false,"picklistValues":[],"precision":0,"queryByDistance":false,"referenceTargetField":null,"referenceTo":[],"relatio
 nshipName":null,"relationshipOrder":null,"restrictedDelete":false,"restrictedPicklist":false,"scale":0,"soapType":"xsd:dateTime","sortable":true,"type":"datetime","unique":false,"updateable":false,"writeRequiresMasterRead":false},{"autoNumber":false,"byteLength":18,"calculated":false,"calculatedFormula":null,"cascadeDelete":false,"caseSensitive":false,"controllerName":null,"createable":false,"custom":false,"defaultValue":null,"defaultValueFormula":null,"defaultedOnCreate":true,"dependentPicklist":false,"deprecatedAndHidden":false,"digits":0,"displayLocationInDecimal":false,"encrypted":false,"externalId":false,"extraTypeInfo":null,"filterable":true,"filteredLookupInfo":null,"groupable":true,"highScaleNumber":false,"htmlFormatted":false,"idLookup":false,"inlineHelpText":null,"label":"Created By ID","length":18,"mask":null,"maskType":null,"name":"CreatedById","nameField":false,"namePointing":false,"nillable":false,"permissionable":false,"picklistValues":[],"precision":0,"queryByDistanc
 e":false,"referenceTargetField":null,"referenceTo":["User"],"relationshipName":"CreatedBy","relationshipOrder":null,"restrictedDelete":false,"restrictedPicklist":false,"scale":0,"soapType":"tns:ID","sortable":true,"type":"reference","unique":false,"updateable":false,"writeRequiresMasterRead":false},{"autoNumber":false,"byteLength":0,"calculated":false,"calculatedFormula":null,"cascadeDelete":false,"caseSensitive":false,"controllerName":null,"createable":false,"custom":false,"defaultValue":null,"defaultValueFormula":null,"defaultedOnCreate":true,"dependentPicklist":false,"deprecatedAndHidden":false,"digits":0,"displayLocationInDecimal":false,"encrypted":false,"externalId":false,"extraTypeInfo":null,"filterable":true,"filteredLookupInfo":null,"groupable":false,"highScaleNumber":false,"htmlFormatted":false,"idLookup":false,"inlineHelpText":null,"label":"Last Modified Date","length":0,"mask":null,"maskType":null,"name":"LastModifiedDate","nameField":false,"namePointing":false,"nillable"
 :false,"permissionable":false,"picklistValues":[],"precision":0,"queryByDistance":false,"referenceTargetField":null,"referenceTo":[],"relationshipName":null,"relationshipOrder":null,"restrictedDelete":false,"restrictedPicklist":false,"scale":0,"soapType":"xsd:dateTime","sortable":true,"type":"datetime","unique":false,"updateable":false,"writeRequiresMasterRead":false},{"autoNumber":false,"byteLength":18,"calculated":false,"calculatedFormula":null,"cascadeDelete":false,"caseSensitive":false,"controllerName":null,"createable":false,"custom":false,"defaultValue":null,"defaultValueFormula":null,"defaultedOnCreate":true,"dependentPicklist":false,"deprecatedAndHidden":false,"digits":0,"displayLocationInDecimal":false,"encrypted":false,"externalId":false,"extraTypeInfo":null,"filterable":true,"filteredLookupInfo":null,"groupable":true,"highScaleNumber":false,"htmlFormatted":false,"idLookup":false,"inlineHelpText":null,"label":"Last Modified By ID","length":18,"mask":null,"maskType":null,"n
 ame":"LastModifiedById","nameField":false,"namePointing":false,"nillable":false,"permissionable":false,"picklistValues":[],"precision":0,"queryByDistance":false,"referenceTargetField":null,"referenceTo":["User"],"relationshipName":"LastModifiedBy","relationshipOrder":null,"restrictedDelete":false,"restrictedPicklist":false,"scale":0,"soapType":"tns:ID","sortable":true,"type":"reference","unique":false,"updateable":false,"writeRequiresMasterRead":false},{"autoNumber":false,"byteLength":0,"calculated":false,"calculatedFormula":null,"cascadeDelete":false,"caseSensitive":false,"controllerName":null,"createable":false,"custom":false,"defaultValue":null,"defaultValueFormula":null,"defaultedOnCreate":true,"dependentPicklist":false,"deprecatedAndHidden":false,"digits":0,"displayLocationInDecimal":false,"encrypted":false,"externalId":false,"extraTypeInfo":null,"filterable":true,"filteredLookupInfo":null,"groupable":false,"highScaleNumber":false,"htmlFormatted":false,"idLookup":false,"inlineH
 elpText":null,"label":"System Modstamp","length":0,"mask":null,"maskType":null,"name":"SystemModstamp","nameField":false,"namePointing":false,"nillable":false,"permissionable":false,"picklistValues":[],"precision":0,"queryByDistance":false,"referenceTargetField":null,"referenceTo":[],"relationshipName":null,"relationshipOrder":null,"restrictedDelete":false,"restrictedPicklist":false,"scale":0,"soapType":"xsd:dateTime","sortable":true,"type":"datetime","unique":false,"updateable":false,"writeRequiresMasterRead":false},{"autoNumber":false,"byteLength":0,"calculated":false,"calculatedFormula":null,"cascadeDelete":false,"caseSensitive":false,"controllerName":null,"createable":false,"custom":false,"defaultValue":null,"defaultValueFormula":null,"defaultedOnCreate":false,"dependentPicklist":false,"deprecatedAndHidden":false,"digits":0,"displayLocationInDecimal":false,"encrypted":false,"externalId":false,"extraTypeInfo":null,"filterable":true,"filteredLookupInfo":null,"groupable":true,"high
 ScaleNumber":false,"htmlFormatted":false,"idLookup":false,"inlineHelpText":null,"label":"Last Activity Date","length":0,"mask":null,"maskType":null,"name":"LastActivityDate","nameField":false,"namePointing":false,"nillable":true,"permissionable":false,"picklistValues":[],"precision":0,"queryByDistance":false,"referenceTargetField":null,"referenceTo":[],"relationshipName":null,"relationshipOrder":null,"restrictedDelete":false,"restrictedPicklist":false,"scale":0,"soapType":"xsd:date","sortable":true,"type":"date","unique":false,"updateable":false,"writeRequiresMasterRead":false},{"autoNumber":false,"byteLength":0,"calculated":false,"calculatedFormula":null,"cascadeDelete":false,"caseSensitive":false,"controllerName":null,"createable":false,"custom":false,"defaultValue":null,"defaultValueFormula":null,"defaultedOnCreate":false,"dependentPicklist":false,"deprecatedAndHidden":false,"digits":0,"displayLocationInDecimal":false,"encrypted":false,"externalId":false,"extraTypeInfo":null,"fil
 terable":true,"filteredLookupInfo":null,"groupable":false,"highScaleNumber":false,"htmlFormatted":false,"idLookup":false,"inlineHelpText":null,"label":"Last Viewed Date","length":0,"mask":null,"maskType":null,"name":"LastViewedDate","nameField":false,"namePointing":false,"nillable":true,"permissionable":false,"picklistValues":[],"precision":0,"queryByDistance":false,"referenceTargetField":null,"referenceTo":[],"relationshipName":null,"relationshipOrder":null,"restrictedDelete":false,"restrictedPicklist":false,"scale":0,"soapType":"xsd:dateTime","sortable":true,"type":"datetime","unique":false,"updateable":false,"writeRequiresMasterRead":false},{"autoNumber":false,"byteLength":0,"calculated":false,"calculatedFormula":null,"cascadeDelete":false,"caseSensitive":false,"controllerName":null,"createable":false,"custom":false,"defaultValue":null,"defaultValueFormula":null,"defaultedOnCreate":false,"dependentPicklist":false,"deprecatedAndHidden":false,"digits":0,"displayLocationInDecimal":f
 alse,"encrypted":false,"externalId":false,"extraTypeInfo":null,"filterable":true,"filteredLookupInfo":null,"groupable":false,"highScaleNumber":false,"htmlFormatted":false,"idLookup":false,"inlineHelpText":null,"label":"Last Referenced Date","length":0,"mask":null,"maskType":null,"name":"LastReferencedDate","nameField":false,"namePointing":false,"nillable":true,"permissionable":false,"picklistValues":[],"precision":0,"queryByDistance":false,"referenceTargetField":null,"referenceTo":[],"relationshipName":null,"relationshipOrder":null,"restrictedDelete":false,"restrictedPicklist":false,"scale":0,"soapType":"xsd:dateTime","sortable":true,"type":"datetime","unique":false,"updateable":false,"writeRequiresMasterRead":false},{"autoNumber":false,"byteLength":300,"calculated":false,"calculatedFormula":null,"cascadeDelete":false,"caseSensitive":false,"controllerName":null,"createable":true,"custom":true,"defaultValue":null,"defaultValueFormula":null,"defaultedOnCreate":false,"dependentPicklist
 ":false,"deprecatedAndHidden":false,"digits":0,"displayLocationInDecimal":false,"encrypted":false,"externalId":false,"extraTypeInfo":null,"filterable":true,"filteredLookupInfo":null,"groupable":true,"highScaleNumber":false,"htmlFormatted":false,"idLookup":false,"inlineHelpText":null,"label":"Description","length":100,"mask":null,"maskType":null,"name":"Description__c","nameField":false,"namePointing":false,"nillable":true,"permissionable":true,"picklistValues":[],"precision":0,"queryByDistance":false,"referenceTargetField":null,"referenceTo":[],"relationshipName":null,"relationshipOrder":null,"restrictedDelete":false,"restrictedPicklist":false,"scale":0,"soapType":"xsd:string","sortable":true,"type":"string","unique":false,"updateable":true,"writeRequiresMasterRead":false},{"autoNumber":false,"byteLength":0,"calculated":false,"calculatedFormula":null,"cascadeDelete":false,"caseSensitive":false,"controllerName":null,"createable":true,"custom":true,"defaultValue":null,"defaultValueFor
 mula":null,"defaultedOnCreate":false,"dependentPicklist":false,"deprecatedAndHidden":false,"digits":0,"displayLocationInDecimal":false,"encrypted":false,"externalId":false,"extraTypeInfo":null,"filterable":true,"filteredLookupInfo":null,"groupable":false,"highScaleNumber":false,"htmlFormatted":false,"idLookup":false,"inlineHelpText":null,"label":"Price","length":0,"mask":null,"maskType":null,"name":"Price__c","nameField":false,"namePointing":false,"nillable":false,"permissionable":false,"picklistValues":[],"precision":18,"queryByDistance":false,"referenceTargetField":null,"referenceTo":[],"relationshipName":null,"relationshipOrder":null,"restrictedDelete":false,"restrictedPicklist":false,"scale":2,"soapType":"xsd:double","sortable":true,"type":"currency","unique":false,"updateable":true,"writeRequiresMasterRead":false},{"autoNumber":false,"byteLength":0,"calculated":false,"calculatedFormula":null,"cascadeDelete":false,"caseSensitive":false,"controllerName":null,"createable":true,"cu
 stom":true,"defaultValue":null,"defaultValueFormula":null,"defaultedOnCreate":false,"dependentPicklist":false,"deprecatedAndHidden":false,"digits":0,"displayLocationInDecimal":false,"encrypted":false,"externalId":false,"extraTypeInfo":null,"filterable":true,"filteredLookupInfo":null,"groupable":false,"highScaleNumber":false,"htmlFormatted":false,"idLookup":false,"inlineHelpText":null,"label":"Total_Inventory","length":0,"mask":null,"maskType":null,"name":"Total_Inventory__c","nameField":false,"namePointing":false,"nillable":false,"permissionable":false,"picklistValues":[],"precision":18,"queryByDistance":false,"referenceTargetField":null,"referenceTo":[],"relationshipName":null,"relationshipOrder":null,"restrictedDelete":false,"restrictedPicklist":false,"scale":0,"soapType":"xsd:double","sortable":true,"type":"double","unique":false,"updateable":true,"writeRequiresMasterRead":false}],"keyPrefix":"a02","label":"Merchandise","labelPlural":"Merchandise","layoutable":true,"listviewable"
 :null,"lookupLayoutable":null,"mergeable":false,"name":"Merchandise__c","namedLayoutInfos":[],"queryable":true,"recordTypeInfos":[{"available":true,"defaultRecordTypeMapping":true,"name":"Master","recordTypeId":"012000000000000AAA","urls":{"layout":"/services/data/v34.0/sobjects/Merchandise__c/describe/layouts/012000000000000AAA"}}],"replicateable":true,"retrieveable":true,"searchLayoutable":true,"searchable":true,"triggerable":true,"undeletable":true,"updateable":true,"urls":{"compactLayouts":"/services/data/v34.0/sobjects/Merchandise__c/describe/compactLayouts","rowTemplate":"/services/data/v34.0/sobjects/Merchandise__c/{ID}","approvalLayouts":"/services/data/v34.0/sobjects/Merchandise__c/describe/approvalLayouts","uiDetailTemplate":"https://na35.salesforce.com/{ID}","uiEditTemplate":"https://na35.salesforce.com/{ID}/e","describe":"/services/data/v34.0/sobjects/Merchandise__c/describe","uiNewRecord":"https://na35.salesforce.com/a02/e","quickActions":"/services/data/v34.0/sobjects/
 Merchandise__c/quickActions","layouts":"/services/data/v34.0/sobjects/Merchandise__c/describe/layouts","sobject":"/services/data/v34.0/sobjects/Merchandise__c"}}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/ce86029b/components/camel-salesforce/camel-salesforce-maven-plugin/src/main/java/org/apache/camel/maven/CamelSalesforceMojo.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-maven-plugin/src/main/java/org/apache/camel/maven/CamelSalesforceMojo.java b/components/camel-salesforce/camel-salesforce-maven-plugin/src/main/java/org/apache/camel/maven/CamelSalesforceMojo.java
index 6a48ea7..b554579 100644
--- a/components/camel-salesforce/camel-salesforce-maven-plugin/src/main/java/org/apache/camel/maven/CamelSalesforceMojo.java
+++ b/components/camel-salesforce/camel-salesforce-maven-plugin/src/main/java/org/apache/camel/maven/CamelSalesforceMojo.java
@@ -46,6 +46,7 @@ import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
 
 import org.apache.camel.component.salesforce.SalesforceEndpointConfig;
 import org.apache.camel.component.salesforce.SalesforceHttpClient;
@@ -447,13 +448,13 @@ public class CamelSalesforceMojo extends AbstractMojo {
                 getLog().info("Generating JSON Schema...");
                 // generate JSON schema for every object description
                 final ObjectMapper schemaObjectMapper = JsonUtils.createSchemaObjectMapper();
-                final Set<Object> allSchemas = new HashSet<>();
+                final Set<JsonSchema> allSchemas = new HashSet<>();
                 for (SObjectDescription description : descriptions) {
                     if (IGNORED_OBJECTS.contains(description.getName())) {
                         continue;
                     }
                     try {
-                        allSchemas.add(JsonUtils.getSObjectJsonSchema(schemaObjectMapper, description, jsonSchemaId, true));
+                        allSchemas.addAll(JsonUtils.getSObjectJsonSchema(schemaObjectMapper, description, jsonSchemaId, true));
                     } catch (IOException e) {
                         throw new MojoExecutionException("Unable to generate JSON Schema types for: " + description.getName(), e);
                     }


[2/2] camel git commit: CAMEL-11667: Support Metadata component extension

Posted by zr...@apache.org.
CAMEL-11667: Support Metadata component extension

Adds support for `MetaDataExtension` in the Salesforce component.
Currently two kinds of metadata are supported:
 - listing Salesforce Object types
 - listing fields of Salesforce object type

For Salesforce object types object name and label are returned and for
Salesforce object fields name and field type are returned.

New facade to use low level Salesforce RestClient was added
`SalesforceClientTemplate` intended to be used from extensions such as
this and the existing `ComponentVerifierExtension` was refactored to use
it.


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/ce86029b
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/ce86029b
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/ce86029b

Branch: refs/heads/master
Commit: ce86029bb906cb0db78c3b22f84c01aa2da2e587
Parents: 26aa4e8
Author: Zoran Regvart <zr...@apache.org>
Authored: Tue Aug 15 12:24:00 2017 +0200
Committer: Zoran Regvart <zr...@apache.org>
Committed: Tue Aug 29 17:08:06 2017 +0200

----------------------------------------------------------------------
 .../camel-salesforce-component/pom.xml          |   6 +
 .../salesforce/SalesforceClientTemplate.java    |  84 +++++++
 .../salesforce/SalesforceComponent.java         | 220 ++++++++++++++-----
 .../SalesforceComponentVerifierExtension.java   |  94 +-------
 .../salesforce/SalesforceConsumer.java          |   7 +-
 .../salesforce/SalesforceMetaDataExtension.java | 169 ++++++++++++++
 .../salesforce/api/utils/JsonUtils.java         |  49 ++++-
 .../internal/client/AbstractClientBase.java     |   8 +-
 .../internal/client/HttpClientHolder.java       |  25 +++
 .../processor/AbstractRestProcessor.java        |  10 +-
 .../salesforce/RestApiIntegrationTest.java      |   8 +
 .../SalesforceComponentVerifierTest.java        | 179 ---------------
 .../SalesforceMetaDataExtensionTest.java        | 141 ++++++++++++
 .../src/test/resources/globalObjects.json       |   1 +
 .../src/test/resources/objectDescription.json   |   1 +
 .../apache/camel/maven/CamelSalesforceMojo.java |   5 +-
 16 files changed, 660 insertions(+), 347 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/ce86029b/components/camel-salesforce/camel-salesforce-component/pom.xml
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/pom.xml b/components/camel-salesforce/camel-salesforce-component/pom.xml
index 8a2c29d..bba0c50 100644
--- a/components/camel-salesforce/camel-salesforce-component/pom.xml
+++ b/components/camel-salesforce/camel-salesforce-component/pom.xml
@@ -176,6 +176,12 @@
       <scope>test</scope>
     </dependency>
     <dependency>
+      <groupId>org.assertj</groupId>
+      <artifactId>assertj-core</artifactId>
+      <version>${assertj-version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
       <groupId>com.googlecode.junit-toolbox</groupId>
       <artifactId>junit-toolbox</artifactId>
       <version>${junit-toolbox-version}</version>

http://git-wip-us.apache.org/repos/asf/camel/blob/ce86029b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceClientTemplate.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceClientTemplate.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceClientTemplate.java
new file mode 100644
index 0000000..65957a8
--- /dev/null
+++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceClientTemplate.java
@@ -0,0 +1,84 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.salesforce;
+
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.component.salesforce.internal.client.HttpClientHolder;
+import org.apache.camel.component.salesforce.internal.client.RestClient;
+import org.apache.camel.util.ServiceHelper;
+
+final class SalesforceClientTemplate {
+
+    @FunctionalInterface
+    interface RestClientSupplier {
+        RestClient restClientWith(CamelContext camelContext, Map<String, Object> parameters) throws Exception;
+    }
+
+    @FunctionalInterface
+    interface WithClient<T> {
+        T invoke(RestClient client);
+    }
+
+    static RestClientSupplier restClientSupplier = (camelContext, parameters) -> SalesforceComponent
+        .createRestClient(camelContext, parameters);
+
+    private SalesforceClientTemplate() {
+        // utility class
+    }
+
+    static <T> T invoke(final CamelContext camelContext, final Map<String, Object> parameters,
+        final WithClient<T> performer) throws Exception {
+
+        final RestClient client = restClientSupplier.restClientWith(camelContext, parameters);
+
+        return invokeInternal(client, performer);
+    }
+
+    static <T> T invoke(final SalesforceComponent component, final Map<String, Object> parameters,
+        final WithClient<T> performer) throws Exception {
+
+        final RestClient client = component.createRestClient(parameters);
+
+        return invokeInternal(client, performer);
+    }
+
+    private static <T> T invokeInternal(final RestClient client, final WithClient<T> performer) throws Exception {
+        // we'll handle HTTP client lifecycle so we'll start here and stop at
+        // the end; we won't handle SalesforceSession lifecycle as stoping a
+        // SalesforceSession that we borrowed from a configured
+        // SalesforceComponent could mean logging out any running endpoints also
+        final boolean isHttpClientHolder = client instanceof HttpClientHolder;
+        if (isHttpClientHolder) {
+            ((HttpClientHolder) client).getHttpClient().start();
+        }
+
+        ServiceHelper.startService(client);
+
+        try {
+            return performer.invoke(client);
+        } finally {
+            ServiceHelper.stopService(client);
+
+            if (isHttpClientHolder) {
+                ((HttpClientHolder) client).getHttpClient().stop();
+            }
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/ce86029b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceComponent.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceComponent.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceComponent.java
index 0ef308e..dd5b951 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceComponent.java
+++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceComponent.java
@@ -20,6 +20,7 @@ import java.net.URI;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
 import java.util.regex.Pattern;
 
@@ -27,12 +28,16 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.ComponentVerifier;
 import org.apache.camel.Endpoint;
 import org.apache.camel.SSLContextParametersAware;
+import org.apache.camel.TypeConverter;
 import org.apache.camel.VerifiableComponent;
 import org.apache.camel.component.extension.ComponentVerifierExtension;
 import org.apache.camel.component.salesforce.api.SalesforceException;
 import org.apache.camel.component.salesforce.api.dto.AbstractSObjectBase;
 import org.apache.camel.component.salesforce.internal.OperationName;
+import org.apache.camel.component.salesforce.internal.PayloadFormat;
 import org.apache.camel.component.salesforce.internal.SalesforceSession;
+import org.apache.camel.component.salesforce.internal.client.DefaultRestClient;
+import org.apache.camel.component.salesforce.internal.client.RestClient;
 import org.apache.camel.component.salesforce.internal.streaming.SubscriptionHelper;
 import org.apache.camel.impl.DefaultComponent;
 import org.apache.camel.spi.Metadata;
@@ -60,6 +65,18 @@ import static org.apache.camel.component.salesforce.SalesforceLoginConfig.DEFAUL
 @Metadata(label = "verifiers", enums = "parameters,connectivity")
 public class SalesforceComponent extends DefaultComponent implements VerifiableComponent, SSLContextParametersAware {
 
+    public static final String HTTP_PROXY_HOST = "httpProxyHost";
+    public static final String HTTP_PROXY_PORT = "httpProxyPort";
+    public static final String HTTP_PROXY_IS_SOCKS4 = "isHttpProxySocks4";
+    public static final String HTTP_PROXY_IS_SECURE = "isHttpProxySecure";
+    public static final String HTTP_PROXY_INCLUDE = "httpProxyInclude";
+    public static final String HTTP_PROXY_EXCLUDE = "httpProxyExclude";
+    public static final String HTTP_PROXY_USERNAME = "httpProxyUsername";
+    public static final String HTTP_PROXY_PASSWORD = "httpProxyPassword";
+    public static final String HTTP_PROXY_USE_DIGEST_AUTH = "httpProxyUseDigestAuth";
+    public static final String HTTP_PROXY_AUTH_URI = "httpProxyAuthUri";
+    public static final String HTTP_PROXY_REALM = "httpProxyRealm";
+
     static final int CONNECTION_TIMEOUT = 60000;
     static final Pattern SOBJECT_NAME_PATTERN = Pattern.compile("^.*[\\?&]sObjectName=([^&,]+).*$");
     static final String APEX_CALL_PREFIX = OperationName.APEX_CALL.value() + "/";
@@ -207,6 +224,7 @@ public class SalesforceComponent extends DefaultComponent implements VerifiableC
         super(context);
 
         registerExtension(SalesforceComponentVerifierExtension::new);
+        registerExtension(SalesforceMetaDataExtension::new);
     }
 
     protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
@@ -300,72 +318,25 @@ public class SalesforceComponent extends DefaultComponent implements VerifiableC
         }
 
         // create a Jetty HttpClient if not already set
-        if (null == httpClient) {
-            if (config != null && config.getHttpClient() != null) {
-                httpClient = config.getHttpClient();
-            } else {
-                // set ssl context parameters if set
-                SSLContextParameters contextParameters = sslContextParameters;
-                if (contextParameters == null) {
-                    contextParameters = retrieveGlobalSslContextParameters();
-                }
-                if (contextParameters == null) {
-                    contextParameters = new SSLContextParameters();
-                }
-                final SslContextFactory sslContextFactory = new SslContextFactory();
-                sslContextFactory.setSslContext(contextParameters.createSSLContext(getCamelContext()));
+        if (httpClient == null) {
+            final SSLContextParameters contextParameters = Optional.ofNullable(sslContextParameters)
+                .orElseGet(() -> Optional.ofNullable(retrieveGlobalSslContextParameters())
+                .orElseGet(() -> new SSLContextParameters()));
 
-                httpClient = new SalesforceHttpClient(sslContextFactory);
-                // default settings, use httpClientProperties to set other properties
-                httpClient.setConnectTimeout(CONNECTION_TIMEOUT);
-            }
-        }
+            final SslContextFactory sslContextFactory = new SslContextFactory();
+            sslContextFactory.setSslContext(contextParameters.createSSLContext(getCamelContext()));
 
-        // set HTTP client parameters
-        if (httpClientProperties != null && !httpClientProperties.isEmpty()) {
-            IntrospectionSupport.setProperties(getCamelContext().getTypeConverter(),
-                httpClient, new HashMap<String, Object>(httpClientProperties));
-        }
-
-        // set HTTP proxy settings
-        if (this.httpProxyHost != null && httpProxyPort != null) {
-            Origin.Address proxyAddress = new Origin.Address(this.httpProxyHost, this.httpProxyPort);
-            ProxyConfiguration.Proxy proxy; 
-            if (isHttpProxySocks4) {
-                proxy = new Socks4Proxy(proxyAddress, isHttpProxySecure);
-            } else {
-                proxy = new HttpProxy(proxyAddress, isHttpProxySecure);
-            }
-            if (httpProxyIncludedAddresses != null && !httpProxyIncludedAddresses.isEmpty()) {
-                proxy.getIncludedAddresses().addAll(httpProxyIncludedAddresses);
-            }
-            if (httpProxyExcludedAddresses != null && !httpProxyExcludedAddresses.isEmpty()) {
-                proxy.getExcludedAddresses().addAll(httpProxyExcludedAddresses);
-            }
-            httpClient.getProxyConfiguration().getProxies().add(proxy);
+            httpClient = createHttpClient(sslContextFactory);
         }
-        if (this.httpProxyUsername != null && httpProxyPassword != null) {
 
-            StringHelper.notEmpty(httpProxyAuthUri, "httpProxyAuthUri");
-            StringHelper.notEmpty(httpProxyRealm, "httpProxyRealm");
-
-            final Authentication authentication;
-            if (httpProxyUseDigestAuth) {
-                authentication = new DigestAuthentication(new URI(httpProxyAuthUri),
-                    httpProxyRealm, httpProxyUsername, httpProxyPassword);
-            } else {
-                authentication = new BasicAuthentication(new URI(httpProxyAuthUri),
-                    httpProxyRealm, httpProxyUsername, httpProxyPassword);
-            }
-            httpClient.getAuthenticationStore().addAuthentication(authentication);
-        }
+        setupHttpClient(httpClient, getCamelContext(), httpClientProperties);
 
         // support restarts
-        if (this.session == null) {
-            this.session = new SalesforceSession(getCamelContext(), httpClient, httpClient.getTimeout(), loginConfig);
+        if (session == null) {
+            session = new SalesforceSession(getCamelContext(), httpClient, httpClient.getTimeout(), loginConfig);
         }
         // set session before calling start()
-        httpClient.setSession(this.session);
+        httpClient.setSession(session);
 
         // start the Jetty client to initialize thread pool, etc.
         httpClient.start();
@@ -662,6 +633,137 @@ public class SalesforceComponent extends DefaultComponent implements VerifiableC
 
     @Override
     public ComponentVerifier getVerifier() {
-        return (scope, parameters) -> getExtension(ComponentVerifierExtension.class).orElseThrow(UnsupportedOperationException::new).verify(scope, parameters);
+        return (scope, parameters) -> getExtension(ComponentVerifierExtension.class)
+            .orElseThrow(UnsupportedOperationException::new).verify(scope, parameters);
+    }
+
+    public RestClient createRestClientFor(final SalesforceEndpoint endpoint) throws SalesforceException {
+        final SalesforceEndpointConfig endpointConfig = endpoint.getConfiguration();
+
+        return createRestClientFor(endpointConfig);
+    }
+
+    RestClient createRestClientFor(SalesforceEndpointConfig endpointConfig) throws SalesforceException {
+        final String version = endpointConfig.getApiVersion();
+        final PayloadFormat format = endpointConfig.getFormat();
+
+        return new DefaultRestClient(httpClient, version, format, session);
+    }
+
+    RestClient createRestClient(final Map<String, Object> properties) throws Exception {
+        final SalesforceEndpointConfig modifiedConfig = Optional.ofNullable(config).map(SalesforceEndpointConfig::copy)
+            .orElseGet(() -> new SalesforceEndpointConfig());
+        final CamelContext camelContext = getCamelContext();
+        final TypeConverter typeConverter = camelContext.getTypeConverter();
+
+        IntrospectionSupport.setProperties(typeConverter, modifiedConfig, properties);
+
+        return createRestClientFor(modifiedConfig);
+    }
+
+    static RestClient createRestClient(final CamelContext camelContext, final Map<String, Object> properties)
+        throws Exception {
+        final TypeConverter typeConverter = camelContext.getTypeConverter();
+
+        final SalesforceEndpointConfig config = new SalesforceEndpointConfig();
+        // let's work with a copy for IntrospectionSupport so original properties are intact
+        IntrospectionSupport.setProperties(typeConverter, config, new HashMap<>(properties));
+
+        final SalesforceLoginConfig loginConfig = new SalesforceLoginConfig();
+        // let's work with a copy for IntrospectionSupport so original properties are intact
+        IntrospectionSupport.setProperties(typeConverter, loginConfig, new HashMap<>(properties));
+
+        final SSLContextParameters sslContextParameters = Optional.ofNullable(camelContext.getSSLContextParameters())
+            .orElseGet(() -> new SSLContextParameters());
+        // let's work with a copy for IntrospectionSupport so original properties are intact
+        IntrospectionSupport.setProperties(typeConverter, sslContextParameters, new HashMap<>(properties));
+
+        final SslContextFactory sslContextFactory = new SslContextFactory();
+        sslContextFactory.setSslContext(sslContextParameters.createSSLContext(camelContext));
+
+        final SalesforceHttpClient httpClient = createHttpClient(sslContextFactory);
+        setupHttpClient(httpClient, camelContext, properties);
+
+        final SalesforceSession session = new SalesforceSession(camelContext, httpClient, httpClient.getTimeout(),
+            loginConfig);
+        httpClient.setSession(session);
+
+        return new DefaultRestClient(httpClient, config.getApiVersion(), config.getFormat(), session);
+    }
+
+    static SalesforceHttpClient createHttpClient(final SslContextFactory sslContextFactory) throws Exception {
+        final SalesforceHttpClient httpClient = new SalesforceHttpClient(sslContextFactory);
+        // default settings, use httpClientProperties to set other
+        // properties
+        httpClient.setConnectTimeout(CONNECTION_TIMEOUT);
+
+        return httpClient;
+    }
+
+    static SalesforceHttpClient setupHttpClient(final SalesforceHttpClient httpClient, final CamelContext camelContext,
+        final Map<String, Object> httpClientProperties) throws Exception {
+
+        if (httpClientProperties == null || httpClientProperties.isEmpty()) {
+            return httpClient;
+        }
+
+        // set HTTP client parameters
+        final TypeConverter typeConverter = camelContext.getTypeConverter();
+        IntrospectionSupport.setProperties(typeConverter, httpClient,
+            new HashMap<String, Object>(httpClientProperties));
+
+        final String httpProxyHost = typeConverter.convertTo(String.class, httpClientProperties.get(HTTP_PROXY_HOST));
+        final Integer httpProxyPort = typeConverter.convertTo(Integer.class, httpClientProperties.get(HTTP_PROXY_PORT));
+        final boolean isHttpProxySocks4 = typeConverter.convertTo(boolean.class,
+            httpClientProperties.get(HTTP_PROXY_IS_SOCKS4));
+        final boolean isHttpProxySecure = typeConverter.convertTo(boolean.class,
+            httpClientProperties.get(HTTP_PROXY_IS_SECURE));
+        @SuppressWarnings("unchecked")
+        final Set<String> httpProxyIncludedAddresses = (Set<String>) httpClientProperties.get(HTTP_PROXY_INCLUDE);
+        @SuppressWarnings("unchecked")
+        final Set<String> httpProxyExcludedAddresses = (Set<String>) httpClientProperties.get(HTTP_PROXY_EXCLUDE);
+        final String httpProxyUsername = typeConverter.convertTo(String.class,
+            httpClientProperties.get(HTTP_PROXY_USERNAME));
+        final String httpProxyPassword = typeConverter.convertTo(String.class,
+            httpClientProperties.get(HTTP_PROXY_PASSWORD));
+        final String httpProxyAuthUri = typeConverter.convertTo(String.class,
+            httpClientProperties.get(HTTP_PROXY_AUTH_URI));
+        final String httpProxyRealm = typeConverter.convertTo(String.class, httpClientProperties.get(HTTP_PROXY_REALM));
+        final boolean httpProxyUseDigestAuth = typeConverter.convertTo(boolean.class,
+            httpClientProperties.get(HTTP_PROXY_USE_DIGEST_AUTH));
+
+        // set HTTP proxy settings
+        if (httpProxyHost != null && httpProxyPort != null) {
+            Origin.Address proxyAddress = new Origin.Address(httpProxyHost, httpProxyPort);
+            ProxyConfiguration.Proxy proxy;
+            if (isHttpProxySocks4) {
+                proxy = new Socks4Proxy(proxyAddress, isHttpProxySecure);
+            } else {
+                proxy = new HttpProxy(proxyAddress, isHttpProxySecure);
+            }
+            if (httpProxyIncludedAddresses != null && !httpProxyIncludedAddresses.isEmpty()) {
+                proxy.getIncludedAddresses().addAll(httpProxyIncludedAddresses);
+            }
+            if (httpProxyExcludedAddresses != null && !httpProxyExcludedAddresses.isEmpty()) {
+                proxy.getExcludedAddresses().addAll(httpProxyExcludedAddresses);
+            }
+            httpClient.getProxyConfiguration().getProxies().add(proxy);
+        }
+        if (httpProxyUsername != null && httpProxyPassword != null) {
+            StringHelper.notEmpty(httpProxyAuthUri, "httpProxyAuthUri");
+            StringHelper.notEmpty(httpProxyRealm, "httpProxyRealm");
+
+            final Authentication authentication;
+            if (httpProxyUseDigestAuth) {
+                authentication = new DigestAuthentication(new URI(httpProxyAuthUri), httpProxyRealm, httpProxyUsername,
+                    httpProxyPassword);
+            } else {
+                authentication = new BasicAuthentication(new URI(httpProxyAuthUri), httpProxyRealm, httpProxyUsername,
+                    httpProxyPassword);
+            }
+            httpClient.getAuthenticationStore().addAuthentication(authentication);
+        }
+
+        return httpClient;
     }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/ce86029b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceComponentVerifierExtension.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceComponentVerifierExtension.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceComponentVerifierExtension.java
index be71dde..6c23901 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceComponentVerifierExtension.java
+++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceComponentVerifierExtension.java
@@ -16,8 +16,6 @@
  */
 package org.apache.camel.component.salesforce;
 
-import java.net.URI;
-import java.net.URISyntaxException;
 import java.util.Map;
 import java.util.Optional;
 
@@ -29,15 +27,6 @@ import org.apache.camel.component.extension.verifier.ResultErrorBuilder;
 import org.apache.camel.component.extension.verifier.ResultErrorHelper;
 import org.apache.camel.component.salesforce.api.SalesforceException;
 import org.apache.camel.component.salesforce.api.dto.RestError;
-import org.apache.camel.component.salesforce.internal.SalesforceSession;
-import org.apache.camel.component.salesforce.internal.client.DefaultRestClient;
-import org.apache.camel.util.jsse.SSLContextParameters;
-import org.eclipse.jetty.client.HttpProxy;
-import org.eclipse.jetty.client.Origin;
-import org.eclipse.jetty.client.Socks4Proxy;
-import org.eclipse.jetty.client.util.BasicAuthentication;
-import org.eclipse.jetty.client.util.DigestAuthentication;
-import org.eclipse.jetty.util.ssl.SslContextFactory;
 
 public class SalesforceComponentVerifierExtension extends DefaultComponentVerifierExtension {
 
@@ -86,39 +75,10 @@ public class SalesforceComponentVerifierExtension extends DefaultComponentVerifi
         ResultBuilder builder = ResultBuilder.withStatusAndScope(Result.Status.OK, Scope.CONNECTIVITY);
 
         try {
-            SalesforceEndpointConfig configuration = new SalesforceEndpointConfig();
-            setProperties(configuration, parameters);
-
-            SalesforceLoginConfig loginConfig = new SalesforceLoginConfig();
-            setProperties(loginConfig, parameters);
-
-            // Create a dummy SslContextFactory which is needed by SalesforceHttpClient
-            // or the underlying jetty client fails with a NPE
-            SSLContextParameters contextParameters = new SSLContextParameters();
-            SslContextFactory sslContextFactory = new SslContextFactory();
-            sslContextFactory.setSslContext(contextParameters.createSSLContext(getCamelContext()));
-
-            SalesforceHttpClient httpClient = new SalesforceHttpClient(sslContextFactory);
-            httpClient.setConnectTimeout(SalesforceComponent.CONNECTION_TIMEOUT);
-            configureHttpProxy(httpClient, parameters);
-
-            SalesforceSession session = new SalesforceSession(getCamelContext(), httpClient, httpClient.getTimeout(), loginConfig);
-            DefaultRestClient client = new DefaultRestClient(httpClient, configuration.getApiVersion(), configuration.getFormat(), session);
-
-            httpClient.setSession(session);
-            httpClient.start();
-
-            // For authentication check is is enough to use
-            session.start();
-
-            client.start();
-            client.getVersions((response, exception) -> processSalesforceException(builder, Optional.ofNullable(exception)));
-            client.stop();
-
-            session.stop();
-
-            httpClient.stop();
-            httpClient.destroy();
+            SalesforceClientTemplate.invoke(getCamelContext(), parameters, client -> {
+                client.getVersions((response, exception) ->  processSalesforceException(builder, Optional.ofNullable(exception)));
+                return null;
+            });
         } catch (NoSuchOptionException e) {
             builder.error(
                 ResultErrorBuilder.withMissingOption(e.getOptionName()).build()
@@ -138,7 +98,7 @@ public class SalesforceComponentVerifierExtension extends DefaultComponentVerifi
     // Helpers
     // *********************************
 
-    private void processSalesforceException(ResultBuilder builder, Optional<SalesforceException> exception) {
+    private static void processSalesforceException(ResultBuilder builder, Optional<SalesforceException> exception) {
         exception.ifPresent(e -> {
             builder.error(
                 ResultErrorBuilder.withException(e)
@@ -158,48 +118,4 @@ public class SalesforceComponentVerifierExtension extends DefaultComponentVerifi
         });
     }
 
-    private void configureHttpProxy(SalesforceHttpClient httpClient, Map<String, Object> parameters) throws NoSuchOptionException, URISyntaxException {
-        Optional<String> httpProxyHost = getOption(parameters, "httpProxyHost", String.class);
-        Optional<Integer> httpProxyPort = getOption(parameters, "httpProxyPort", Integer.class);
-        Optional<String> httpProxyUsername = getOption(parameters, "httpProxyUsername", String.class);
-        Optional<String> httpProxyPassword = getOption(parameters, "httpProxyPassword", String.class);
-
-        if (httpProxyHost.isPresent() && httpProxyPort.isPresent()) {
-            Origin.Address address = new Origin.Address(httpProxyHost.get(), httpProxyPort.get());
-            Boolean isHttpProxySocks4 = getOption(parameters, "isHttpProxySocks4", Boolean.class, () -> false);
-            Boolean isHttpProxySecure = getOption(parameters, "isHttpProxySecure", Boolean.class, () -> true);
-
-            if (isHttpProxySocks4) {
-                httpClient.getProxyConfiguration().getProxies().add(
-                    new Socks4Proxy(address, isHttpProxySecure)
-                );
-            } else {
-                httpClient.getProxyConfiguration().getProxies().add(
-                    new HttpProxy(address, isHttpProxySecure)
-                );
-            }
-        }
-
-        if (httpProxyUsername.isPresent() && httpProxyPassword.isPresent()) {
-            Boolean httpProxyUseDigestAuth = getOption(parameters, "httpProxyUseDigestAuth", Boolean.class, () -> false);
-            String httpProxyAuthUri = getMandatoryOption(parameters, "httpProxyAuthUri", String.class);
-            String httpProxyRealm = getMandatoryOption(parameters, "httpProxyRealm", String.class);
-
-            if (httpProxyUseDigestAuth) {
-                httpClient.getAuthenticationStore().addAuthentication(new DigestAuthentication(
-                    new URI(httpProxyAuthUri),
-                    httpProxyRealm,
-                    httpProxyUsername.get(),
-                    httpProxyPassword.get())
-                );
-            } else {
-                httpClient.getAuthenticationStore().addAuthentication(new BasicAuthentication(
-                    new URI(httpProxyAuthUri),
-                    httpProxyRealm,
-                    httpProxyUsername.get(),
-                    httpProxyPassword.get())
-                );
-            }
-        }
-    }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/ce86029b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceConsumer.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceConsumer.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceConsumer.java
index 0484aee..a006d58e 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceConsumer.java
+++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceConsumer.java
@@ -28,7 +28,6 @@ import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
 import org.apache.camel.component.salesforce.api.SalesforceException;
 import org.apache.camel.component.salesforce.api.utils.JsonUtils;
-import org.apache.camel.component.salesforce.internal.client.DefaultRestClient;
 import org.apache.camel.component.salesforce.internal.client.RestClient;
 import org.apache.camel.component.salesforce.internal.streaming.PushTopicHelper;
 import org.apache.camel.component.salesforce.internal.streaming.SubscriptionHelper;
@@ -110,9 +109,9 @@ public class SalesforceConsumer extends DefaultConsumer {
         if (config.getSObjectQuery() != null) {
             // Note that we don't lookup topic if the query is not specified
             // create REST client for PushTopic operations
-            SalesforceComponent component = endpoint.getComponent();
-            RestClient restClient = new DefaultRestClient(component.getConfig().getHttpClient(),
-                    endpoint.getConfiguration().getApiVersion(), endpoint.getConfiguration().getFormat(), component.getSession());
+            final SalesforceComponent salesforceComponent = endpoint.getComponent();
+            final RestClient restClient = salesforceComponent.createRestClientFor(endpoint);
+
             // don't forget to start the client
             ServiceHelper.startService(restClient);
 

http://git-wip-us.apache.org/repos/asf/camel/blob/ce86029b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceMetaDataExtension.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceMetaDataExtension.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceMetaDataExtension.java
new file mode 100644
index 0000000..abf5201
--- /dev/null
+++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceMetaDataExtension.java
@@ -0,0 +1,169 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.salesforce;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.function.BiFunction;
+import java.util.function.Consumer;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.component.extension.metadata.AbstractMetaDataExtension;
+import org.apache.camel.component.extension.metadata.MetaDataBuilder;
+import org.apache.camel.component.salesforce.api.dto.SObjectDescription;
+import org.apache.camel.component.salesforce.api.utils.JsonUtils;
+import org.apache.camel.component.salesforce.internal.client.RestClient;
+import org.apache.camel.component.salesforce.internal.client.RestClient.ResponseCallback;
+import org.apache.camel.util.ObjectHelper;
+
+import static org.apache.camel.component.salesforce.SalesforceClientTemplate.invoke;
+
+public class SalesforceMetaDataExtension extends AbstractMetaDataExtension {
+
+    static final String OBJECT_TYPE = SalesforceEndpointConfig.SOBJECT_NAME;
+
+    public enum Scope implements MetaDataOperation {
+        OBJECT(
+            (client, params) -> callback -> client.getDescription(stringParam(params, OBJECT_TYPE).get(), callback)) {
+            @Override
+            public MetaData map(final CamelContext camelContext, final InputStream stream) throws IOException {
+                final SObjectDescription description = MAPPER.readerFor(SObjectDescription.class).readValue(stream);
+
+                final JsonSchema payload = JsonUtils.getSObjectJsonSchemaAsSchema(description, true);
+
+                return MetaDataBuilder.on(camelContext)//
+                    .withAttribute(MetaData.CONTENT_TYPE, "application/schema+json")//
+                    .withAttribute(MetaData.JAVA_TYPE, JsonNode.class)//
+                    .withAttribute("scope", "object").withPayload(payload).build();
+            }
+        },
+        OBJECT_TYPES((client, params) -> callback -> client.getGlobalObjects(callback)) {
+            @Override
+            public MetaData map(final CamelContext camelContext, final InputStream stream) throws IOException {
+                final JsonNode rawResponse = MAPPER.readTree(stream);
+                final JsonNode payload = rawResponse.get("sobjects");
+
+                return MetaDataBuilder.on(camelContext)//
+                    .withAttribute(MetaData.CONTENT_TYPE, "application/json")//
+                    .withAttribute(MetaData.JAVA_TYPE, JsonNode.class)//
+                    .withAttribute("scope", "object_types").withPayload(payload).build();
+            }
+        };
+
+        private final BiFunction<RestClient, Map<String, Object>, Consumer<ResponseCallback>> method;
+
+        private Scope(final BiFunction<RestClient, Map<String, Object>, Consumer<ResponseCallback>> method) {
+            this.method = method;
+        }
+
+        public static Scope valueOf(final Object given) {
+            if (given instanceof Scope) {
+                return (Scope) given;
+            }
+
+            if (given instanceof String) {
+                return Scope.valueOf((String) given);
+            }
+
+            return Scope.valueOf(String.valueOf(given));
+        }
+    }
+
+    interface MetaDataOperation {
+
+        MetaData map(CamelContext camelContext, InputStream stream) throws IOException;
+    }
+
+    private static final ObjectMapper MAPPER = JsonUtils.createObjectMapper();
+
+    @Override
+    public Optional<MetaData> meta(final Map<String, Object> parameters) {
+        final Optional<String> objectType = stringParam(parameters, OBJECT_TYPE);
+
+        final Scope scope = objectType.map(v -> Scope.OBJECT).orElse(Scope.OBJECT_TYPES);
+
+        final MetaData metaData = metaInternal(scope, parameters);
+
+        return Optional.ofNullable(metaData);
+    }
+
+    MetaData metaInternal(final Scope scope, final Map<String, Object> parameters) {
+        final CamelContext camelContext = getCamelContext();
+
+        try {
+            return invoke(camelContext, parameters,
+                client -> fetchMetadata(camelContext, scope.method.apply(client, parameters), scope::map));
+        } catch (final Exception e) {
+            throw ObjectHelper.wrapRuntimeCamelException(e);
+        }
+    }
+
+    static MetaData fetchMetadata(final CamelContext camelContext, final Consumer<ResponseCallback> restMethod,
+        final MetaDataOperation callback) {
+        final CompletableFuture<MetaData> ret = new CompletableFuture<>();
+
+        restMethod.accept((response, exception) -> {
+            if (exception != null) {
+                ret.completeExceptionally(exception);
+            } else {
+                try {
+                    ret.complete(callback.map(camelContext, response));
+                } catch (final IOException e) {
+                    ret.completeExceptionally(e);
+                }
+            }
+        });
+
+        try {
+            return ret.get();
+        } catch (InterruptedException | ExecutionException e) {
+            throw ObjectHelper.wrapRuntimeCamelException(e);
+        }
+    }
+
+    static Map<String, Object> mapOf(final String k1, final Object v1, final String k2, final Object v2) {
+        final Map<String, Object> ret = new HashMap<>(2);
+
+        ret.put(k1, v1);
+        ret.put(k2, v2);
+
+        return ret;
+    }
+
+    static Optional<String> stringParam(final Map<String, Object> params, final String name) {
+        final Object value = params.get(name);
+
+        if (value == null) {
+            return Optional.empty();
+        }
+
+        if (value instanceof String) {
+            return Optional.of((String) value);
+        }
+
+        throw new IllegalArgumentException("Expecting parameter `" + name + "` to be of String type, got: " + value);
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/ce86029b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/JsonUtils.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/JsonUtils.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/JsonUtils.java
index 959e00b..cc3f7c1 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/JsonUtils.java
+++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/JsonUtils.java
@@ -17,6 +17,7 @@
 package org.apache.camel.component.salesforce.api.utils;
 
 import java.lang.reflect.Modifier;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
@@ -88,7 +89,7 @@ public abstract class JsonUtils {
                     && AbstractDTOBase.class.isAssignableFrom(type),
                 "org.apache.camel.component.salesforce.api.dto"));
 
-        Set<Object> allSchemas = new HashSet<>();
+        Set<JsonSchema> allSchemas = new HashSet<>();
         for (Class<?> aClass : schemaClasses) {
             JsonSchema jsonSchema = schemaGen.generateSchema(aClass);
             allSchemas.add(jsonSchema);
@@ -97,26 +98,43 @@ public abstract class JsonUtils {
         return getJsonSchemaString(mapper, allSchemas, API_DTO_ID);
     }
 
-    public static String getJsonSchemaString(ObjectMapper mapper, Set<Object> allSchemas, String id) throws JsonProcessingException {
+    public static String getJsonSchemaString(ObjectMapper mapper, Set<JsonSchema> allSchemas, String id) throws JsonProcessingException {
+        JsonSchema rootSchema = getJsonSchemaAsSchema(allSchemas, id);
+
+        return mapper.writeValueAsString(rootSchema);
+    }
+
+    public static JsonSchema getJsonSchemaAsSchema(Set<JsonSchema> allSchemas, String id) {
         ObjectSchema rootSchema = new ObjectSchema();
         rootSchema.set$schema(SCHEMA4);
         rootSchema.setId(id);
-        rootSchema.setOneOf(allSchemas);
+        @SuppressWarnings({"unchecked", "rawtypes"})
+        Set<Object> tmp = (Set) allSchemas;
+        rootSchema.setOneOf(tmp);
 
-        return mapper.writeValueAsString(rootSchema);
+        return rootSchema;
     }
 
     public static String getSObjectJsonSchema(SObjectDescription description) throws JsonProcessingException {
         return getSObjectJsonSchema(description, true);
     }
 
+    public static JsonSchema getSObjectJsonSchemaAsJson(SObjectDescription description) throws JsonProcessingException {
+        return getSObjectJsonSchemaAsSchema(description, true);
+    }
+
     public static String getSObjectJsonSchema(SObjectDescription description, boolean addQuerySchema) throws JsonProcessingException {
         ObjectMapper schemaObjectMapper = createSchemaObjectMapper();
         return getJsonSchemaString(schemaObjectMapper, getSObjectJsonSchema(schemaObjectMapper, description, DEFAULT_ID_PREFIX, addQuerySchema), DEFAULT_ID_PREFIX);
     }
 
-    public static Set<Object> getSObjectJsonSchema(ObjectMapper objectMapper, SObjectDescription description, String idPrefix, boolean addQuerySchema) throws JsonProcessingException {
-        Set<Object> allSchemas = new HashSet<>();
+    public static JsonSchema getSObjectJsonSchemaAsSchema(SObjectDescription description, boolean addQuerySchema) throws JsonProcessingException {
+        ObjectMapper schemaObjectMapper = createSchemaObjectMapper();
+        return getJsonSchemaAsSchema(getSObjectJsonSchema(schemaObjectMapper, description, DEFAULT_ID_PREFIX, addQuerySchema), DEFAULT_ID_PREFIX);
+    }
+
+    public static Set<JsonSchema> getSObjectJsonSchema(ObjectMapper objectMapper, SObjectDescription description, String idPrefix, boolean addQuerySchema) throws JsonProcessingException {
+        Set<JsonSchema> allSchemas = new HashSet<>();
 
         // generate SObject schema from description
         ObjectSchema sobjectSchema = new ObjectSchema();
@@ -191,7 +209,7 @@ public abstract class JsonUtils {
             switch (field.getType()) {
             case "picklist":
                 fieldSchema.asStringSchema().setEnums(
-                        picklistValues == null ? Collections.EMPTY_SET : picklistValues.stream()
+                        picklistValues == null ? Collections.emptySet() : picklistValues.stream()
                                 .map(PickListValue::getValue)
                                 .distinct()
                                 .collect(Collectors.toSet()));
@@ -216,6 +234,23 @@ public abstract class JsonUtils {
                 fieldSchema.setReadonly(!field.isUpdateable());
             }
 
+            final String descriptionText = Arrays.asList(new Object[] {
+                "unique",
+                field.isUnique()
+            }, new Object[] {
+                "idLookup",
+                field.isIdLookup()
+            }, new Object[] {
+                "autoNumber",
+                field.isAutoNumber()
+            }, new Object[] {
+                "calculated",
+                field.isCalculated()
+            }).stream().filter(ary -> Boolean.TRUE.equals(ary[1])).map(ary -> String.valueOf(ary[0])).collect(Collectors.joining(","));
+            // JSON schema currently does not support the above attributes so we'll store this information
+            // in the description
+            fieldSchema.setDescription(descriptionText);
+
             // add property to sobject schema
             if (field.isNillable()) {
                 sobjectSchema.putOptionalProperty(field.getName(), fieldSchema);

http://git-wip-us.apache.org/repos/asf/camel/blob/ce86029b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/client/AbstractClientBase.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/client/AbstractClientBase.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/client/AbstractClientBase.java
index e996de5..97b7b09 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/client/AbstractClientBase.java
+++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/client/AbstractClientBase.java
@@ -38,6 +38,7 @@ import org.apache.camel.component.salesforce.api.dto.RestError;
 import org.apache.camel.component.salesforce.internal.PayloadFormat;
 import org.apache.camel.component.salesforce.internal.SalesforceSession;
 import org.apache.camel.component.salesforce.internal.dto.RestErrors;
+import org.eclipse.jetty.client.HttpClient;
 import org.eclipse.jetty.client.HttpContentResponse;
 import org.eclipse.jetty.client.api.ContentProvider;
 import org.eclipse.jetty.client.api.ContentResponse;
@@ -52,7 +53,7 @@ import org.eclipse.jetty.http.HttpStatus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public abstract class AbstractClientBase implements SalesforceSession.SalesforceSessionListener, Service {
+public abstract class AbstractClientBase implements SalesforceSession.SalesforceSessionListener, Service, HttpClientHolder {
 
     protected static final String APPLICATION_JSON_UTF8 = "application/json;charset=utf-8";
     protected static final String APPLICATION_XML_UTF8 = "application/xml;charset=utf-8";
@@ -240,6 +241,11 @@ public abstract class AbstractClientBase implements SalesforceSession.Salesforce
         this.instanceUrl = instanceUrl;
     }
 
+    @Override
+    public HttpClient getHttpClient() {
+        return httpClient;
+    }
+
     final List<RestError> readErrorsFrom(final InputStream responseContent, final PayloadFormat format,
         final ObjectMapper objectMapper, final XStream xStream)
         throws IOException, JsonParseException, JsonMappingException {

http://git-wip-us.apache.org/repos/asf/camel/blob/ce86029b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/client/HttpClientHolder.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/client/HttpClientHolder.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/client/HttpClientHolder.java
new file mode 100644
index 0000000..c2f4847
--- /dev/null
+++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/client/HttpClientHolder.java
@@ -0,0 +1,25 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.salesforce.internal.client;
+
+import org.eclipse.jetty.client.HttpClient;
+
+public interface HttpClientHolder {
+
+    HttpClient getHttpClient();
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/ce86029b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/AbstractRestProcessor.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/AbstractRestProcessor.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/AbstractRestProcessor.java
index 74be887..0961b34 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/AbstractRestProcessor.java
+++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/AbstractRestProcessor.java
@@ -35,6 +35,7 @@ import org.apache.camel.Exchange;
 import org.apache.camel.Message;
 import org.apache.camel.TypeConverter;
 import org.apache.camel.component.salesforce.NotFoundBehaviour;
+import org.apache.camel.component.salesforce.SalesforceComponent;
 import org.apache.camel.component.salesforce.SalesforceEndpoint;
 import org.apache.camel.component.salesforce.SalesforceEndpointConfig;
 import org.apache.camel.component.salesforce.api.NoSuchSObjectException;
@@ -42,15 +43,12 @@ import org.apache.camel.component.salesforce.api.SalesforceException;
 import org.apache.camel.component.salesforce.api.dto.AbstractSObjectBase;
 import org.apache.camel.component.salesforce.api.dto.approval.ApprovalRequest;
 import org.apache.camel.component.salesforce.api.dto.approval.ApprovalRequests;
-import org.apache.camel.component.salesforce.internal.PayloadFormat;
-import org.apache.camel.component.salesforce.internal.client.DefaultRestClient;
 import org.apache.camel.component.salesforce.internal.client.RestClient;
 import org.apache.camel.util.ServiceHelper;
 
 import static org.apache.camel.component.salesforce.SalesforceEndpointConfig.APEX_METHOD;
 import static org.apache.camel.component.salesforce.SalesforceEndpointConfig.APEX_QUERY_PARAM_PREFIX;
 import static org.apache.camel.component.salesforce.SalesforceEndpointConfig.APEX_URL;
-import static org.apache.camel.component.salesforce.SalesforceEndpointConfig.API_VERSION;
 import static org.apache.camel.component.salesforce.SalesforceEndpointConfig.SOBJECT_BLOB_FIELD_NAME;
 import static org.apache.camel.component.salesforce.SalesforceEndpointConfig.SOBJECT_CLASS;
 import static org.apache.camel.component.salesforce.SalesforceEndpointConfig.SOBJECT_EXT_ID_NAME;
@@ -75,11 +73,11 @@ public abstract class AbstractRestProcessor extends AbstractSalesforceProcessor
         super(endpoint);
 
         final SalesforceEndpointConfig configuration = endpoint.getConfiguration();
-        final PayloadFormat payloadFormat = configuration.getFormat();
         notFoundBehaviour = configuration.getNotFoundBehaviour();
 
-        this.restClient = new DefaultRestClient(httpClient, (String) endpointConfigMap.get(API_VERSION),
-                payloadFormat, session);
+        final SalesforceComponent salesforceComponent = endpoint.getComponent();
+
+        this.restClient = salesforceComponent.createRestClientFor(endpoint);
 
         this.classMap = endpoint.getComponent().getClassMap();
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/ce86029b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/RestApiIntegrationTest.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/RestApiIntegrationTest.java b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/RestApiIntegrationTest.java
index 13485ce..2148686 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/RestApiIntegrationTest.java
+++ b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/RestApiIntegrationTest.java
@@ -506,6 +506,14 @@ public class RestApiIntegrationTest extends AbstractSalesforceTestBase {
         }
     }
 
+    @Test
+    public void testFetchingGlobalObjects() {
+        final GlobalObjects globalObjects = template().requestBody("salesforce:getGlobalObjects", null, GlobalObjects.class);
+
+        assertNotNull(globalObjects);
+        assertFalse(globalObjects.getSobjects().isEmpty());
+    }
+
     @Override
     protected RouteBuilder doCreateRouteBuilder() throws Exception {
 

http://git-wip-us.apache.org/repos/asf/camel/blob/ce86029b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/SalesforceComponentVerifierTest.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/SalesforceComponentVerifierTest.java b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/SalesforceComponentVerifierTest.java
deleted file mode 100644
index 8b27265..0000000
--- a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/SalesforceComponentVerifierTest.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.component.salesforce;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.camel.ComponentVerifier;
-import org.apache.camel.component.salesforce.api.SalesforceException;
-import org.apache.camel.test.junit4.CamelTestSupport;
-import org.apache.camel.util.ObjectHelper;
-import org.junit.Assert;
-import org.junit.Assume;
-import org.junit.Test;
-
-public class SalesforceComponentVerifierTest extends CamelTestSupport {
-    private static final String CLIENT_ID = getSystemPropertyOrEnvVar("salesforce.clientid");
-    private static final String CLIENT_SECRET = getSystemPropertyOrEnvVar("salesforce.clientsecret");
-    private static final String USERNAME = getSystemPropertyOrEnvVar("salesforce.userName");
-    private static final String PASSWORD = getSystemPropertyOrEnvVar("salesforce.password");
-
-    @Override
-    protected void doPreSetup() throws Exception {
-        Assume.assumeNotNull(CLIENT_ID);
-        Assume.assumeNotNull(CLIENT_SECRET);
-        Assume.assumeNotNull(USERNAME);
-        Assume.assumeNotNull(PASSWORD);
-    }
-
-    @Override
-    public boolean isUseRouteBuilder() {
-        return false;
-    }
-
-    // *********************************
-    // Helpers
-    // *********************************
-
-    protected Map<String, Object> getParameters() {
-        HashMap<String, Object> parameters = new HashMap<>();
-        parameters.put("clientId", CLIENT_ID);
-        parameters.put("clientSecret", CLIENT_SECRET);
-        parameters.put("userName", USERNAME);
-        parameters.put("password", PASSWORD);
-
-
-        return parameters;
-    }
-
-    public static String getSystemPropertyOrEnvVar(String systemProperty) {
-        String answer = System.getProperty(systemProperty);
-        if (ObjectHelper.isEmpty(answer)) {
-            String envProperty = systemProperty.toUpperCase().replaceAll("[.-]", "_");
-            answer = System.getenv(envProperty);
-        }
-
-        return answer;
-    }
-
-    protected ComponentVerifier getVerifier() {
-        SalesforceComponent component = context().getComponent("salesforce", SalesforceComponent.class);
-        return component.getVerifier();
-    }
-
-    // *********************************
-    // Parameters validation
-    // *********************************
-
-    @Test
-    public void testUsernamePasswordParameters() {
-        HashMap<String, Object> parameters = new HashMap<>();
-        parameters.put("clientId", "clientId");
-        parameters.put("clientSecret", "clientSecret");
-        parameters.put("userName", "userName");
-        parameters.put("password", "password");
-
-        ComponentVerifier.Result result = getVerifier().verify(ComponentVerifier.Scope.PARAMETERS, parameters);
-
-        Assert.assertEquals(ComponentVerifier.Result.Status.OK, result.getStatus());
-    }
-
-    @Test
-    public void testRefreshTokenParameters() {
-        Map<String, Object> parameters = getParameters();
-        parameters.put("clientId", "clientId");
-        parameters.put("clientSecret", "clientSecret");
-        parameters.put("refreshToken", "refreshToken");
-
-        ComponentVerifier.Result result = getVerifier().verify(ComponentVerifier.Scope.PARAMETERS, parameters);
-
-        Assert.assertEquals(ComponentVerifier.Result.Status.OK, result.getStatus());
-    }
-
-    @Test
-    public void testWrongParameters() {
-        HashMap<String, Object> parameters = new HashMap<>();
-        parameters.put("clientId", "clientId");
-        parameters.put("clientSecret", "clientSecret");
-        parameters.put("password", "password");
-
-        ComponentVerifier.Result result = getVerifier().verify(ComponentVerifier.Scope.PARAMETERS, parameters);
-
-        Assert.assertEquals(ComponentVerifier.Result.Status.ERROR, result.getStatus());
-        Assert.assertEquals(3, result.getErrors().size());
-
-        Assert.assertEquals(ComponentVerifier.VerificationError.StandardCode.INCOMPLETE_PARAMETER_GROUP, result.getErrors().get(0).getCode());
-        Assert.assertEquals(ComponentVerifier.VerificationError.StandardCode.INCOMPLETE_PARAMETER_GROUP, result.getErrors().get(1).getCode());
-        Assert.assertEquals(ComponentVerifier.VerificationError.StandardCode.INCOMPLETE_PARAMETER_GROUP, result.getErrors().get(2).getCode());
-    }
-
-    // *********************************
-    // Connectivity validation
-    // *********************************
-
-    @Test
-    public void testConnectivity() {
-        Map<String, Object> parameters = getParameters();
-        ComponentVerifier.Result result = getVerifier().verify(ComponentVerifier.Scope.CONNECTIVITY, parameters);
-
-        Assert.assertEquals(ComponentVerifier.Result.Status.OK, result.getStatus());
-    }
-
-    @Test
-    public void testConnectivityWithWrongUserName() {
-        Map<String, Object> parameters = getParameters();
-        parameters.put("userName", "not-a-salesforce-user");
-
-        ComponentVerifier.Result result = getVerifier().verify(ComponentVerifier.Scope.CONNECTIVITY, parameters);
-
-        Assert.assertEquals(ComponentVerifier.Result.Status.ERROR, result.getStatus());
-        Assert.assertEquals(2, result.getErrors().size());
-
-        // Exception
-        Assert.assertEquals(ComponentVerifier.VerificationError.StandardCode.EXCEPTION, result.getErrors().get(0).getCode());
-        Assert.assertNotNull(result.getErrors().get(0).getDetails().get(ComponentVerifier.VerificationError.ExceptionAttribute.EXCEPTION_INSTANCE));
-        Assert.assertTrue(result.getErrors().get(0).getDetails().get(ComponentVerifier.VerificationError.ExceptionAttribute.EXCEPTION_INSTANCE) instanceof SalesforceException);
-        Assert.assertEquals(400, result.getErrors().get(0).getDetails().get(ComponentVerifier.VerificationError.HttpAttribute.HTTP_CODE));
-
-        // Salesforce Error
-        Assert.assertEquals("invalid_grant", result.getErrors().get(1).getDetail("salesforce_code"));
-    }
-
-    @Test
-    public void testConnectivityWithWrongSecrets() {
-        Map<String, Object> parameters = getParameters();
-        parameters.put("clientId", "wrong-client-id");
-        parameters.put("clientSecret", "wrong-client-secret");
-
-        ComponentVerifier.Result result = getVerifier().verify(ComponentVerifier.Scope.CONNECTIVITY, parameters);
-
-        Assert.assertEquals(ComponentVerifier.Result.Status.ERROR, result.getStatus());
-
-        Assert.assertEquals(ComponentVerifier.Result.Status.ERROR, result.getStatus());
-        Assert.assertEquals(2, result.getErrors().size());
-
-        // Exception
-        Assert.assertEquals(ComponentVerifier.VerificationError.StandardCode.EXCEPTION, result.getErrors().get(0).getCode());
-        Assert.assertNotNull(result.getErrors().get(0).getDetails().get(ComponentVerifier.VerificationError.ExceptionAttribute.EXCEPTION_INSTANCE));
-        Assert.assertTrue(result.getErrors().get(0).getDetails().get(ComponentVerifier.VerificationError.ExceptionAttribute.EXCEPTION_INSTANCE) instanceof SalesforceException);
-        Assert.assertEquals(400, result.getErrors().get(0).getDetails().get(ComponentVerifier.VerificationError.HttpAttribute.HTTP_CODE));
-
-        // Salesforce Error
-        Assert.assertEquals("invalid_client_id", result.getErrors().get(1).getDetail("salesforce_code"));
-    }
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/ce86029b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/SalesforceMetaDataExtensionTest.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/SalesforceMetaDataExtensionTest.java b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/SalesforceMetaDataExtensionTest.java
new file mode 100644
index 0000000..e19f7cf
--- /dev/null
+++ b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/SalesforceMetaDataExtensionTest.java
@@ -0,0 +1,141 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.salesforce;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Optional;
+import java.util.Set;
+import java.util.function.Predicate;
+import java.util.stream.StreamSupport;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
+import com.fasterxml.jackson.module.jsonSchema.types.ObjectSchema;
+
+import org.apache.camel.component.extension.MetaDataExtension;
+import org.apache.camel.component.extension.MetaDataExtension.MetaData;
+import org.apache.camel.component.salesforce.internal.client.RestClient;
+import org.apache.camel.component.salesforce.internal.client.RestClient.ResponseCallback;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.junit.Test;
+import org.mockito.stubbing.Answer;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.mock;
+
+public class SalesforceMetaDataExtensionTest {
+
+    final SalesforceComponent component = new SalesforceComponent();
+
+    final MetaDataExtension metadata;
+
+    final RestClient restClient = mock(RestClient.class);
+
+    public SalesforceMetaDataExtensionTest() {
+        component.setCamelContext(new DefaultCamelContext());
+        SalesforceClientTemplate.restClientSupplier = (c, p) -> restClient;
+        metadata = component.getExtension(MetaDataExtension.class).get();
+    }
+
+    @Test
+    public void componentShouldProvideMetadataExtension() {
+        assertThat(component.getExtension(MetaDataExtension.class)).isPresent();
+    }
+
+    @Test
+    public void shouldProvideSalesforceObjectFields() throws IOException {
+        final Optional<MetaData> maybeMeta;
+        try (InputStream stream = resource("/objectDescription.json")) {
+            doAnswer(provideStreamToCallback(stream)).when(restClient).getDescription(eq("Account"),
+                any(ResponseCallback.class));
+            maybeMeta = metadata.meta(Collections.singletonMap(SalesforceMetaDataExtension.OBJECT_TYPE, "Account"));
+        }
+
+        assertThat(maybeMeta).isPresent();
+
+        final MetaData meta = maybeMeta.get();
+        assertThat(meta.getAttribute(MetaDataExtension.MetaData.JAVA_TYPE)).isEqualTo(JsonNode.class);
+        assertThat(meta.getAttribute(MetaDataExtension.MetaData.CONTENT_TYPE)).isEqualTo("application/schema+json");
+
+        final ObjectSchema payload = meta.getPayload(ObjectSchema.class);
+        assertThat(payload).isNotNull();
+
+        @SuppressWarnings({"unchecked", "rawtypes"})
+        final Set<JsonSchema> oneOf = (Set) payload.getOneOf();
+        final Optional<JsonSchema> merchandiseSchema = StreamSupport.stream(oneOf.spliterator(), false)
+            .filter(idMatches("urn:jsonschema:org:apache:camel:component:salesforce:dto:Merchandise__c")).findAny();
+        final Optional<JsonSchema> merchandiseQuerySchema = StreamSupport.stream(oneOf.spliterator(), false)
+            .filter(idMatches("urn:jsonschema:org:apache:camel:component:salesforce:dto:QueryRecordsMerchandise__c"))
+            .findAny();
+        assertThat(merchandiseSchema).isPresent();
+        assertThat(merchandiseQuerySchema).isPresent();
+    }
+
+    @Test
+    public void shouldProvideSalesforceObjectTypes() throws IOException {
+        final Optional<MetaData> maybeMeta;
+        try (InputStream stream = resource("/globalObjects.json")) {
+            doAnswer(provideStreamToCallback(stream)).when(restClient).getGlobalObjects(any(ResponseCallback.class));
+            maybeMeta = metadata.meta(Collections.emptyMap());
+        }
+
+        assertThat(maybeMeta).isPresent();
+
+        final MetaData meta = maybeMeta.get();
+        assertThat(meta.getAttribute(MetaDataExtension.MetaData.JAVA_TYPE)).isEqualTo(JsonNode.class);
+        assertThat(meta.getAttribute(MetaDataExtension.MetaData.CONTENT_TYPE)).isEqualTo("application/json");
+
+        final JsonNode payload = meta.getPayload(JsonNode.class);
+        assertThat(payload).isNotNull();
+        assertThat(valueAt(payload, 0, "name")).isEqualTo("AcceptedEventRelation");
+        assertThat(valueAt(payload, 0, "label")).isEqualTo("Accepted Event Relation");
+        assertThat(valueAt(payload, 1, "name")).isEqualTo("Account");
+        assertThat(valueAt(payload, 1, "label")).isEqualTo("Account");
+        assertThat(valueAt(payload, 2, "name")).isEqualTo("AccountCleanInfo");
+        assertThat(valueAt(payload, 2, "label")).isEqualTo("Account Clean Info");
+        assertThat(valueAt(payload, 3, "name")).isEqualTo("AccountContactRole");
+        assertThat(valueAt(payload, 3, "label")).isEqualTo("Account Contact Role");
+    }
+
+    static InputStream resource(final String path) {
+        return SalesforceMetaDataExtensionTest.class.getResourceAsStream(path);
+    }
+
+    static String valueAt(final JsonNode payload, final int idx, final String name) {
+        return payload.get(idx).get(name).asText();
+    }
+
+    static Answer<Void> provideStreamToCallback(final InputStream stream) {
+        return invocation -> {
+            final ResponseCallback callback = (ResponseCallback) Arrays.stream(invocation.getArguments())
+                .filter(ResponseCallback.class::isInstance).findFirst().get();
+            callback.onResponse(stream, null);
+
+            return null;
+        };
+    }
+
+    private static Predicate<JsonSchema> idMatches(final String wantedId) {
+        return schema -> wantedId.equals(schema.getId());
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/ce86029b/components/camel-salesforce/camel-salesforce-component/src/test/resources/globalObjects.json
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/test/resources/globalObjects.json b/components/camel-salesforce/camel-salesforce-component/src/test/resources/globalObjects.json
new file mode 100644
index 0000000..275de6e
--- /dev/null
+++ b/components/camel-salesforce/camel-salesforce-component/src/test/resources/globalObjects.json
@@ -0,0 +1 @@
+{"encoding":"UTF-8","maxBatchSize":200,"sobjects":[{"activateable":false,"createable":false,"custom":false,"customSetting":false,"deletable":false,"deprecatedAndHidden":false,"feedEnabled":false,"keyPrefix":null,"label":"Accepted Event Relation","labelPlural":"Accepted Event Relations","layoutable":false,"mergeable":false,"name":"AcceptedEventRelation","queryable":true,"replicateable":false,"retrieveable":true,"searchable":false,"triggerable":false,"undeletable":false,"updateable":false,"urls":{"rowTemplate":"/services/data/v34.0/sobjects/AcceptedEventRelation/{ID}","describe":"/services/data/v34.0/sobjects/AcceptedEventRelation/describe","sobject":"/services/data/v34.0/sobjects/AcceptedEventRelation"}},{"activateable":false,"createable":true,"custom":false,"customSetting":false,"deletable":true,"deprecatedAndHidden":false,"feedEnabled":true,"keyPrefix":"001","label":"Account","labelPlural":"Accounts","layoutable":true,"mergeable":true,"name":"Account","queryable":true,"replicateabl
 e":true,"retrieveable":true,"searchable":true,"triggerable":true,"undeletable":true,"updateable":true,"urls":{"compactLayouts":"/services/data/v34.0/sobjects/Account/describe/compactLayouts","rowTemplate":"/services/data/v34.0/sobjects/Account/{ID}","approvalLayouts":"/services/data/v34.0/sobjects/Account/describe/approvalLayouts","listviews":"/services/data/v34.0/sobjects/Account/listviews","describe":"/services/data/v34.0/sobjects/Account/describe","quickActions":"/services/data/v34.0/sobjects/Account/quickActions","layouts":"/services/data/v34.0/sobjects/Account/describe/layouts","sobject":"/services/data/v34.0/sobjects/Account"}},{"activateable":false,"createable":false,"custom":false,"customSetting":false,"deletable":false,"deprecatedAndHidden":false,"feedEnabled":false,"keyPrefix":"1CA","label":"Account Clean Info","labelPlural":"Account Clean Info","layoutable":false,"mergeable":false,"name":"AccountCleanInfo","queryable":true,"replicateable":true,"retrieveable":true,"searcha
 ble":false,"triggerable":false,"undeletable":false,"updateable":true,"urls":{"rowTemplate":"/services/data/v34.0/sobjects/AccountCleanInfo/{ID}","describe":"/services/data/v34.0/sobjects/AccountCleanInfo/describe","sobject":"/services/data/v34.0/sobjects/AccountCleanInfo"}},{"activateable":false,"createable":true,"custom":false,"customSetting":false,"deletable":true,"deprecatedAndHidden":false,"feedEnabled":false,"keyPrefix":"02Z","label":"Account Contact Role","labelPlural":"Account Contact Roles","layoutable":false,"mergeable":false,"name":"AccountContactRole","queryable":true,"replicateable":true,"retrieveable":true,"searchable":false,"triggerable":false,"undeletable":false,"updateable":true,"urls":{"rowTemplate":"/services/data/v34.0/sobjects/AccountContactRole/{ID}","describe":"/services/data/v34.0/sobjects/AccountContactRole/describe","sobject":"/services/data/v34.0/sobjects/AccountContactRole"}}]}
\ No newline at end of file