Updated Branches:
  refs/heads/master 3553b95ad -> 512b0a165

CAMEL-6428: camel-salesforce component. Thanks to Dhiraj Bokde for the 
contribution.


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

Branch: refs/heads/master
Commit: 512b0a165273dd0296580997fef6002635ed034b
Parents: 3553b95
Author: Claus Ibsen <davscl...@apache.org>
Authored: Sat Jun 8 08:57:59 2013 +0200
Committer: Claus Ibsen <davscl...@apache.org>
Committed: Sat Jun 8 08:57:59 2013 +0200

----------------------------------------------------------------------
 .../camel-salesforce-component/pom.xml             |    5 +
 .../component/salesforce/SalesforceComponent.java  |   96 +++++++-
 .../component/salesforce/SalesforceConsumer.java   |   13 +-
 .../component/salesforce/SalesforceEndpoint.java   |   11 +-
 .../salesforce/SalesforceEndpointConfig.java       |   58 +++--
 .../component/salesforce/SalesforceProducer.java   |    2 +-
 .../internal/client/DefaultRestClient.java         |   27 +-
 .../internal/processor/AbstractRestProcessor.java  |   25 +--
 .../salesforce/BulkApiBatchIntegrationTest.java    |   18 +-
 .../component/salesforce/LoginConfigHelper.java    |    2 +-
 .../salesforce/RestApiIntegrationTest.java         |   56 ++---
 .../SalesforceComponentConfigurationTest.java      |  201 +++++++++++++++
 .../apache/camel/maven/CamelSalesforceMojo.java    |   34 +--
 .../maven/CamelSalesforceMojoIntegrationTest.java  |    2 +-
 14 files changed, 410 insertions(+), 140 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/512b0a16/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 5d6c831..933e2f5 100644
--- a/components/camel-salesforce/camel-salesforce-component/pom.xml
+++ b/components/camel-salesforce/camel-salesforce-component/pom.xml
@@ -45,6 +45,11 @@
       <artifactId>camel-core</artifactId>
     </dependency>
     <dependency>
+      <groupId>org.apache.camel</groupId>
+      <artifactId>spi-annotations</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
       <groupId>org.eclipse.jetty</groupId>
       <artifactId>jetty-client</artifactId>
     </dependency>

http://git-wip-us.apache.org/repos/asf/camel/blob/512b0a16/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 57ee583..4f075e0 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
@@ -16,35 +16,42 @@
  */
 package org.apache.camel.component.salesforce;
 
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
+import org.apache.camel.CamelContext;
+import org.apache.camel.ComponentConfiguration;
 import org.apache.camel.Endpoint;
 import org.apache.camel.component.salesforce.api.SalesforceException;
+import org.apache.camel.component.salesforce.api.dto.AbstractQueryRecordsBase;
 import org.apache.camel.component.salesforce.api.dto.AbstractSObjectBase;
 import org.apache.camel.component.salesforce.internal.OperationName;
 import org.apache.camel.component.salesforce.internal.SalesforceSession;
 import 
org.apache.camel.component.salesforce.internal.streaming.SubscriptionHelper;
-import org.apache.camel.impl.DefaultComponent;
+import org.apache.camel.impl.UriEndpointComponent;
+import org.apache.camel.spi.EndpointCompleter;
 import org.apache.camel.util.ObjectHelper;
+import org.apache.camel.util.ReflectionHelper;
 import org.apache.camel.util.ServiceHelper;
 import org.eclipse.jetty.client.HttpClient;
 import org.eclipse.jetty.client.RedirectListener;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
 /**
  * Represents the component that manages {@link SalesforceEndpoint}.
  */
-public class SalesforceComponent extends DefaultComponent {
+public class SalesforceComponent extends UriEndpointComponent implements 
EndpointCompleter {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(SalesforceComponent.class);
 
     private static final int MAX_CONNECTIONS_PER_ADDRESS = 20;
     private static final int CONNECTION_TIMEOUT = 60000;
     private static final int RESPONSE_TIMEOUT = 60000;
+    private static final Pattern SOBJECT_NAME_PATTERN = 
Pattern.compile("^.*[\\?&]sObjectName=([^&,]+).*$");
 
     private SalesforceLoginConfig loginConfig;
     private SalesforceEndpointConfig config;
@@ -58,6 +65,14 @@ public class SalesforceComponent extends DefaultComponent {
     // Lazily created helper for consumer endpoints
     private SubscriptionHelper subscriptionHelper;
 
+    public SalesforceComponent() {
+        super(SalesforceEndpoint.class);
+    }
+
+    public SalesforceComponent(CamelContext context) {
+        super(context, SalesforceEndpoint.class);
+    }
+
     protected Endpoint createEndpoint(String uri, String remaining, 
Map<String, Object> parameters) throws Exception {
         // get Operation from remaining URI
         OperationName operationName = null;
@@ -151,7 +166,8 @@ public class SalesforceComponent extends DefaultComponent {
 
     private Map<String, Class<?>> parsePackages() {
         Map<String, Class<?>> result = new HashMap<String, Class<?>>();
-        Set<Class<?>> classes = 
getCamelContext().getPackageScanClassResolver().findImplementations(AbstractSObjectBase.class,
 packages);
+        Set<Class<?>> classes = 
getCamelContext().getPackageScanClassResolver().
+            findImplementations(AbstractSObjectBase.class, packages);
         for (Class<?> aClass : classes) {
             // findImplementations also returns AbstractSObjectBase for some 
reason!!!
             if (AbstractSObjectBase.class != aClass) {
@@ -198,6 +214,70 @@ public class SalesforceComponent extends DefaultComponent {
         return subscriptionHelper;
     }
 
+    @Override
+    public List<String> completeEndpointPath(ComponentConfiguration 
configuration, String completionText) {
+        final List<String> result = new ArrayList<String>();
+        // return operations names on empty completion text
+        final boolean empty = ObjectHelper.isEmpty(completionText);
+        if (empty || completionText.indexOf('?') == -1) {
+            if (empty) {
+                completionText = "";
+            }
+            final OperationName[] values = OperationName.values();
+            for (OperationName val : values) {
+                final String strValue = val.value();
+                if (strValue.startsWith(completionText)) {
+                    result.add(strValue);
+                }
+            }
+            // also add place holder for user defined push topic name for 
empty completionText
+            if (empty) {
+                result.add("[PushTopicName]");
+            }
+        } else {
+            // handle package parameters
+            if (completionText.matches("^.*[\\?&]sObjectName=$")) {
+                result.addAll(classMap.keySet());
+            } else if (completionText.matches("^.*[\\?&]sObjectFields=$")) {
+                // find sObjectName from configuration or completionText
+                String sObjectName = (String) 
configuration.getParameter("sObjectName");
+                if (sObjectName == null) {
+                    final Matcher matcher = 
SOBJECT_NAME_PATTERN.matcher(completionText);
+                    if (matcher.matches()) {
+                        sObjectName = matcher.group(1);
+                    }
+                }
+                // return all fields of sObject
+                if (sObjectName != null) {
+                    final Class<?> aClass = classMap.get(sObjectName);
+                    ReflectionHelper.doWithFields(aClass, new 
ReflectionHelper.FieldCallback() {
+                        @Override
+                        public void doWith(Field field) throws 
IllegalArgumentException, IllegalAccessException {
+                            // get non-static fields
+                            if ((field.getModifiers() & Modifier.STATIC) == 0) 
{
+                                result.add(field.getName());
+                            }
+                        }
+                    });
+                }
+            } else if (completionText.matches("^.*[\\?&]sObjectClass=$")) {
+                for (Class c : classMap.values()) {
+                    result.add(c.getName());
+                }
+                // also add Query records classes
+                Set<Class<?>> classes = 
getCamelContext().getPackageScanClassResolver().
+                    findImplementations(AbstractQueryRecordsBase.class, 
packages);
+                for (Class<?> aClass : classes) {
+                    // findImplementations also returns 
AbstractQueryRecordsBase for some reason!!!
+                    if (AbstractQueryRecordsBase.class != aClass) {
+                        result.add(aClass.getName());
+                    }
+                }
+            }
+        }
+        return result;
+    }
+
     public SalesforceLoginConfig getLoginConfig() {
         return loginConfig;
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/512b0a16/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 c3f6a05..983d41d 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
@@ -16,15 +16,11 @@
  */
 package org.apache.camel.component.salesforce;
 
-import java.io.IOException;
-import java.io.StringReader;
-import java.util.HashMap;
-import java.util.Map;
-
 import org.apache.camel.AsyncCallback;
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
 import org.apache.camel.RuntimeCamelException;
+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.component.salesforce.internal.streaming.PushTopicHelper;
@@ -35,6 +31,11 @@ import org.codehaus.jackson.map.ObjectMapper;
 import org.cometd.bayeux.Message;
 import org.cometd.bayeux.client.ClientSessionChannel;
 
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * The Salesforce consumer.
  */
@@ -102,7 +103,7 @@ public class SalesforceConsumer extends DefaultConsumer {
             // create REST client for PushTopic operations
             SalesforceComponent component = endpoint.getComponent();
             RestClient restClient = new 
DefaultRestClient(component.getConfig().getHttpClient(),
-                    endpoint.getConfiguration().getApiVersion(), "json", 
component.getSession());
+                    endpoint.getConfiguration().getApiVersion(), 
PayloadFormat.JSON, component.getSession());
             // don't forget to start the client
             ServiceHelper.startService(restClient);
 

http://git-wip-us.apache.org/repos/asf/camel/blob/512b0a16/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceEndpoint.java
----------------------------------------------------------------------
diff --git 
a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceEndpoint.java
 
b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceEndpoint.java
index b7283eb..97e8bcc 100644
--- 
a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceEndpoint.java
+++ 
b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceEndpoint.java
@@ -22,17 +22,22 @@ import org.apache.camel.Producer;
 import org.apache.camel.component.salesforce.internal.OperationName;
 import org.apache.camel.impl.DefaultEndpoint;
 import org.apache.camel.impl.SynchronousDelegateProducer;
+import org.apache.camel.spi.UriEndpoint;
+import org.apache.camel.spi.UriParam;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
  * Represents a Salesforce endpoint.
  */
+@UriEndpoint(scheme = "salesforce", consumerClass = SalesforceConsumer.class)
 public class SalesforceEndpoint extends DefaultEndpoint {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(SalesforceEndpoint.class);
 
+    @UriParam
     private final SalesforceEndpointConfig config;
+
     private final OperationName operationName;
     private final String topicName;
 
@@ -66,8 +71,10 @@ public class SalesforceEndpoint extends DefaultEndpoint {
                     operationName.value()));
         }
 
-        return new SalesforceConsumer(this, processor,
-                getComponent().getSubscriptionHelper());
+        final SalesforceConsumer consumer = new SalesforceConsumer(this, 
processor,
+            getComponent().getSubscriptionHelper());
+        configureConsumer(consumer);
+        return consumer;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/camel/blob/512b0a16/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceEndpointConfig.java
----------------------------------------------------------------------
diff --git 
a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceEndpointConfig.java
 
b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceEndpointConfig.java
index 78643c0..055e91a 100644
--- 
a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceEndpointConfig.java
+++ 
b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceEndpointConfig.java
@@ -16,18 +16,23 @@
  */
 package org.apache.camel.component.salesforce;
 
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.component.salesforce.api.dto.bulk.ContentType;
-import org.apache.camel.component.salesforce.api.dto.bulk.OperationEnum;
 import org.apache.camel.component.salesforce.internal.PayloadFormat;
 import org.apache.camel.component.salesforce.internal.dto.NotifyForFieldsEnum;
 import 
org.apache.camel.component.salesforce.internal.dto.NotifyForOperationsEnum;
+import org.apache.camel.spi.UriParam;
+import org.apache.camel.spi.UriParams;
 import org.eclipse.jetty.client.HttpClient;
 
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Salesforce Endpoint configuration.
+ */
+@UriParams
 public class SalesforceEndpointConfig implements Cloneable {
 
     // default API version
@@ -49,43 +54,57 @@ public class SalesforceEndpointConfig implements Cloneable {
     public static final String SOBJECT_SEARCH = "sObjectSearch";
 
     // parameters for Bulk API
-    public static final String BULK_OPERATION = "bulkOperation";
     public static final String CONTENT_TYPE = "contentType";
     public static final String JOB_ID = "jobId";
     public static final String BATCH_ID = "batchId";
     public static final String RESULT_ID = "resultId";
 
-    // parameters for Streaming API
-    public static final String UPDATE_TOPIC = "updateTopic";
-
     // general properties
+    @UriParam
     private String apiVersion = DEFAULT_VERSION;
 
     // Rest API properties
+    @UriParam
     private PayloadFormat format = PayloadFormat.JSON;
+    @UriParam
     private String sObjectName;
+    @UriParam
     private String sObjectId;
+    @UriParam
     private String sObjectFields;
+    @UriParam
     private String sObjectIdName;
+    @UriParam
     private String sObjectIdValue;
+    @UriParam
     private String sObjectBlobFieldName;
+    @UriParam
     private String sObjectClass;
+    @UriParam
     private String sObjectQuery;
+    @UriParam
     private String sObjectSearch;
 
     // Bulk API properties
-    private OperationEnum bulkOperation;
+    @UriParam
     private ContentType contentType;
+    @UriParam
     private String jobId;
+    @UriParam
     private String batchId;
+    @UriParam
     private String resultId;
 
     // Streaming API properties
+    @UriParam
     private boolean updateTopic;
+    @UriParam
     private NotifyForFieldsEnum notifyForFields;
+    @UriParam
     private NotifyForOperationsEnum notifyForOperations;
 
     // Jetty HttpClient, set using reference
+    @UriParam
     private HttpClient httpClient;
 
     public SalesforceEndpointConfig copy() {
@@ -98,12 +117,12 @@ public class SalesforceEndpointConfig implements Cloneable 
{
         }
     }
 
-    public PayloadFormat getPayloadFormat() {
+    public PayloadFormat getFormat() {
         return format;
     }
 
-    public void setFormat(String format) {
-        this.format = PayloadFormat.valueOf(format.toUpperCase());
+    public void setFormat(PayloadFormat format) {
+        this.format = format;
     }
 
     public String getApiVersion() {
@@ -186,14 +205,6 @@ public class SalesforceEndpointConfig implements Cloneable 
{
         this.sObjectSearch = sObjectSearch;
     }
 
-    public OperationEnum getBulkOperation() {
-        return bulkOperation;
-    }
-
-    public void setBulkOperation(OperationEnum bulkOperation) {
-        this.bulkOperation = bulkOperation;
-    }
-
     public ContentType getContentType() {
         return contentType;
     }
@@ -275,9 +286,6 @@ public class SalesforceEndpointConfig implements Cloneable {
         valueMap.put(SOBJECT_SEARCH, sObjectSearch);
 
         // add bulk API properties
-        if (bulkOperation != null) {
-            valueMap.put(BULK_OPERATION, bulkOperation.value());
-        }
         if (contentType != null) {
             valueMap.put(CONTENT_TYPE, contentType.value());
         }
@@ -285,8 +293,6 @@ public class SalesforceEndpointConfig implements Cloneable {
         valueMap.put(BATCH_ID, batchId);
         valueMap.put(RESULT_ID, resultId);
 
-        valueMap.put(UPDATE_TOPIC, String.valueOf(updateTopic));
-
         return Collections.unmodifiableMap(valueMap);
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/512b0a16/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceProducer.java
----------------------------------------------------------------------
diff --git 
a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceProducer.java
 
b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceProducer.java
index a095f6f..42c1bfe 100644
--- 
a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceProducer.java
+++ 
b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceProducer.java
@@ -39,7 +39,7 @@ public class SalesforceProducer extends DefaultAsyncProducer {
         super(endpoint);
 
         final SalesforceEndpointConfig endpointConfig = 
endpoint.getConfiguration();
-        final PayloadFormat payloadFormat = endpointConfig.getPayloadFormat();
+        final PayloadFormat payloadFormat = endpointConfig.getFormat();
 
         // check if its a Bulk Operation
         if (isBulkOperation(endpoint.getOperationName())) {

http://git-wip-us.apache.org/repos/asf/camel/blob/512b0a16/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/client/DefaultRestClient.java
----------------------------------------------------------------------
diff --git 
a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/client/DefaultRestClient.java
 
b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/client/DefaultRestClient.java
index 70eec1c..b15d5cf 100644
--- 
a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/client/DefaultRestClient.java
+++ 
b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/client/DefaultRestClient.java
@@ -16,15 +16,10 @@
  */
 package org.apache.camel.component.salesforce.internal.client;
 
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-import java.net.URLEncoder;
-import java.util.List;
-
 import com.thoughtworks.xstream.XStream;
 import org.apache.camel.component.salesforce.api.SalesforceException;
 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.codehaus.jackson.map.ObjectMapper;
@@ -36,6 +31,12 @@ import org.eclipse.jetty.http.HttpHeaders;
 import org.eclipse.jetty.http.HttpMethods;
 import org.eclipse.jetty.util.StringUtil;
 
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.List;
+
 public class DefaultRestClient extends AbstractClientBase implements 
RestClient {
 
     private static final String SERVICES_DATA = "/services/data/";
@@ -44,10 +45,10 @@ public class DefaultRestClient extends AbstractClientBase 
implements RestClient
 
     private ObjectMapper objectMapper;
     private XStream xStream;
-    protected String format;
+    protected PayloadFormat format;
 
     public DefaultRestClient(HttpClient httpClient,
-                             String version, String format, SalesforceSession 
session) throws SalesforceException {
+                             String version, PayloadFormat format, 
SalesforceSession session) throws SalesforceException {
         super(version, session, httpClient);
 
         this.format = format;
@@ -61,7 +62,7 @@ public class DefaultRestClient extends AbstractClientBase 
implements RestClient
     @Override
     protected void doHttpRequest(ContentExchange request, 
ClientResponseCallback callback) {
         // set standard headers for all requests
-        final String contentType = "json".equals(format) ? 
APPLICATION_JSON_UTF8 : APPLICATION_XML_UTF8;
+        final String contentType = PayloadFormat.JSON.equals(format) ? 
APPLICATION_JSON_UTF8 : APPLICATION_XML_UTF8;
         request.setRequestHeader(HttpHeaders.ACCEPT, contentType);
         request.setRequestHeader(HttpHeaders.ACCEPT_CHARSET, 
StringUtil.__UTF8);
         // request content type and charset is set by the request entity
@@ -73,7 +74,7 @@ public class DefaultRestClient extends AbstractClientBase 
implements RestClient
     protected SalesforceException createRestException(ContentExchange 
httpExchange) {
         // try parsing response according to format
         try {
-            if ("json".equals(format)) {
+            if (PayloadFormat.JSON.equals(format)) {
                 List<RestError> restErrors = objectMapper.readValue(
                         httpExchange.getResponseContent(), new 
TypeReference<List<RestError>>() {
                 });
@@ -177,7 +178,7 @@ public class DefaultRestClient extends AbstractClientBase 
implements RestClient
 
         // input stream as entity content
         post.setRequestContentSource(sObject);
-        post.setRequestContentType("json".equals(format) ? 
APPLICATION_JSON_UTF8 : APPLICATION_XML_UTF8);
+        post.setRequestContentType(PayloadFormat.JSON.equals(format) ? 
APPLICATION_JSON_UTF8 : APPLICATION_XML_UTF8);
 
         doHttpRequest(post, new DelegatingClientCallback(callback));
     }
@@ -191,7 +192,7 @@ public class DefaultRestClient extends AbstractClientBase 
implements RestClient
 
         // input stream as entity content
         patch.setRequestContentSource(sObject);
-        patch.setRequestContentType("json".equals(format) ? 
APPLICATION_JSON_UTF8 : APPLICATION_XML_UTF8);
+        patch.setRequestContentType(PayloadFormat.JSON.equals(format) ? 
APPLICATION_JSON_UTF8 : APPLICATION_XML_UTF8);
 
         doHttpRequest(patch, new DelegatingClientCallback(callback));
     }
@@ -231,7 +232,7 @@ public class DefaultRestClient extends AbstractClientBase 
implements RestClient
         // input stream as entity content
         patch.setRequestContentSource(sObject);
         // TODO will the encoding always be UTF-8??
-        patch.setRequestContentType("json".equals(format) ? 
APPLICATION_JSON_UTF8 : APPLICATION_XML_UTF8);
+        patch.setRequestContentType(PayloadFormat.JSON.equals(format) ? 
APPLICATION_JSON_UTF8 : APPLICATION_XML_UTF8);
 
         doHttpRequest(patch, new DelegatingClientCallback(callback));
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/512b0a16/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 82e2c14..ed7a212 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
@@ -16,11 +16,6 @@
  */
 package org.apache.camel.component.salesforce.internal.processor;
 
-import java.io.InputStream;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.Map;
-
 import org.apache.camel.AsyncCallback;
 import org.apache.camel.Exchange;
 import org.apache.camel.component.salesforce.SalesforceEndpoint;
@@ -31,16 +26,12 @@ 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.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;
-import static 
org.apache.camel.component.salesforce.SalesforceEndpointConfig.SOBJECT_EXT_ID_VALUE;
-import static 
org.apache.camel.component.salesforce.SalesforceEndpointConfig.SOBJECT_FIELDS;
-import static 
org.apache.camel.component.salesforce.SalesforceEndpointConfig.SOBJECT_ID;
-import static 
org.apache.camel.component.salesforce.SalesforceEndpointConfig.SOBJECT_NAME;
-import static 
org.apache.camel.component.salesforce.SalesforceEndpointConfig.SOBJECT_QUERY;
-import static 
org.apache.camel.component.salesforce.SalesforceEndpointConfig.SOBJECT_SEARCH;
+import java.io.InputStream;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Map;
+
+import static org.apache.camel.component.salesforce.SalesforceEndpointConfig.*;
 
 public abstract class AbstractRestProcessor extends 
AbstractSalesforceProcessor {
 
@@ -52,10 +43,10 @@ public abstract class AbstractRestProcessor extends 
AbstractSalesforceProcessor
     public AbstractRestProcessor(SalesforceEndpoint endpoint) throws 
SalesforceException {
         super(endpoint);
 
-        final PayloadFormat payloadFormat = 
endpoint.getConfiguration().getPayloadFormat();
+        final PayloadFormat payloadFormat = 
endpoint.getConfiguration().getFormat();
 
         this.restClient = new DefaultRestClient(httpClient, 
endpointConfigMap.get(API_VERSION),
-                payloadFormat.toString().toLowerCase(), session);
+                payloadFormat, session);
 
         this.classMap = endpoint.getComponent().getClassMap();
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/512b0a16/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/BulkApiBatchIntegrationTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/BulkApiBatchIntegrationTest.java
 
b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/BulkApiBatchIntegrationTest.java
index 5406c16..52bf7cc 100644
--- 
a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/BulkApiBatchIntegrationTest.java
+++ 
b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/BulkApiBatchIntegrationTest.java
@@ -16,21 +16,17 @@
  */
 package org.apache.camel.component.salesforce;
 
+import org.apache.camel.component.salesforce.api.dto.bulk.*;
+import org.apache.camel.component.salesforce.dto.Merchandise__c;
+import org.junit.experimental.theories.DataPoints;
+import org.junit.experimental.theories.Theory;
+
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import org.apache.camel.component.salesforce.api.dto.bulk.BatchInfo;
-import org.apache.camel.component.salesforce.api.dto.bulk.BatchStateEnum;
-import org.apache.camel.component.salesforce.api.dto.bulk.ContentType;
-import org.apache.camel.component.salesforce.api.dto.bulk.JobInfo;
-import org.apache.camel.component.salesforce.api.dto.bulk.OperationEnum;
-import org.apache.camel.component.salesforce.dto.Merchandise__c;
-import org.junit.experimental.theories.DataPoints;
-import org.junit.experimental.theories.Theory;
-
 public class BulkApiBatchIntegrationTest extends AbstractBulkApiTestBase {
     private static final String TEST_REQUEST_XML = "/test-request.xml";
     private static final String TEST_REQUEST_CSV = "/test-request.csv";
@@ -40,12 +36,12 @@ public class BulkApiBatchIntegrationTest extends 
AbstractBulkApiTestBase {
         List<BatchTest> result = new ArrayList<BatchTest>();
         BatchTest test = new BatchTest();
         test.contentType = ContentType.XML;
-        test.stream = 
AbstractBulkApiTestBase.class.getResourceAsStream(TEST_REQUEST_XML);
+        test.stream = 
BulkApiBatchIntegrationTest.class.getResourceAsStream(TEST_REQUEST_XML);
         result.add(test);
 
         test = new BatchTest();
         test.contentType = ContentType.CSV;
-        test.stream = 
AbstractBulkApiTestBase.class.getResourceAsStream(TEST_REQUEST_CSV);
+        test.stream = 
BulkApiBatchIntegrationTest.class.getResourceAsStream(TEST_REQUEST_CSV);
         result.add(test);
 
         // TODO test ZIP_XML and ZIP_CSV

http://git-wip-us.apache.org/repos/asf/camel/blob/512b0a16/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/LoginConfigHelper.java
----------------------------------------------------------------------
diff --git 
a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/LoginConfigHelper.java
 
b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/LoginConfigHelper.java
index 4d10618..f3153c0 100644
--- 
a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/LoginConfigHelper.java
+++ 
b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/LoginConfigHelper.java
@@ -26,7 +26,7 @@ import java.util.Properties;
 
 public class LoginConfigHelper extends Assert {
 
-    private static final String TEST_LOGIN_PROPERTIES = 
"test-salesforce-login.properties";
+    private static final String TEST_LOGIN_PROPERTIES = 
"../test-salesforce-login.properties";
 
     public static SalesforceLoginConfig getLoginConfig() throws IOException {
 

http://git-wip-us.apache.org/repos/asf/camel/blob/512b0a16/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 a7510e3..6589cdf 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
@@ -16,24 +16,8 @@
  */
 package org.apache.camel.component.salesforce;
 
-import java.io.FileOutputStream;
-import java.io.InputStream;
-import java.nio.channels.Channels;
-import java.nio.channels.FileChannel;
-import java.nio.channels.ReadableByteChannel;
-import java.util.HashMap;
-import java.util.List;
-
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.salesforce.api.dto.CreateSObjectResult;
-import org.apache.camel.component.salesforce.api.dto.GlobalObjects;
-import org.apache.camel.component.salesforce.api.dto.RestResources;
-import org.apache.camel.component.salesforce.api.dto.SObjectBasicInfo;
-import org.apache.camel.component.salesforce.api.dto.SObjectDescription;
-import org.apache.camel.component.salesforce.api.dto.SearchResult;
-import org.apache.camel.component.salesforce.api.dto.SearchResults;
-import org.apache.camel.component.salesforce.api.dto.Version;
-import org.apache.camel.component.salesforce.api.dto.Versions;
+import org.apache.camel.component.salesforce.api.dto.*;
 import org.apache.camel.component.salesforce.dto.Document;
 import org.apache.camel.component.salesforce.dto.Line_Item__c;
 import org.apache.camel.component.salesforce.dto.Merchandise__c;
@@ -42,6 +26,14 @@ import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.nio.channels.Channels;
+import java.nio.channels.FileChannel;
+import java.nio.channels.ReadableByteChannel;
+import java.util.HashMap;
+import java.util.List;
+
 public class RestApiIntegrationTest extends AbstractSalesforceTestBase {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(RestApiIntegrationTest.class);
@@ -310,105 +302,105 @@ public class RestApiIntegrationTest extends 
AbstractSalesforceTestBase {
 
                 // allow overriding format per endpoint
                 from("direct:getVersionsXml")
-                    .to("salesforce:getVersions?format=xml");
+                    .to("salesforce:getVersions?format=XML");
 
                 // testGetResources
                 from("direct:getResources")
                     .to("salesforce:getResources");
 
                 from("direct:getResourcesXml")
-                    .to("salesforce:getResources?format=xml");
+                    .to("salesforce:getResources?format=XML");
 
                 // testGetGlobalObjects
                 from("direct:getGlobalObjects")
                     .to("salesforce:getGlobalObjects");
 
                 from("direct:getGlobalObjectsXml")
-                    .to("salesforce:getGlobalObjects?format=xml");
+                    .to("salesforce:getGlobalObjects?format=XML");
 
                 // testGetBasicInfo
                 from("direct:getBasicInfo")
                     .to("salesforce:getBasicInfo?sObjectName=Merchandise__c");
 
                 from("direct:getBasicInfoXml")
-                    
.to("salesforce:getBasicInfo?format=xml&sObjectName=Merchandise__c");
+                    
.to("salesforce:getBasicInfo?format=XML&sObjectName=Merchandise__c");
 
                 // testGetDescription
                 from("direct:getDescription")
                     
.to("salesforce:getDescription?sObjectName=Merchandise__c");
 
                 from("direct:getDescriptionXml")
-                    
.to("salesforce:getDescription?format=xml&sObjectName=Merchandise__c");
+                    
.to("salesforce:getDescription?format=XML&sObjectName=Merchandise__c");
 
                 // testGetSObject
                 from("direct:getSObject")
                     
.to("salesforce:getSObject?sObjectName=Merchandise__c&sObjectFields=Description__c,Price__c");
 
                 from("direct:getSObjectXml")
-                    
.to("salesforce:getSObject?format=xml&sObjectName=Merchandise__c&sObjectFields=Description__c,Total_Inventory__c");
+                    
.to("salesforce:getSObject?format=XML&sObjectName=Merchandise__c&sObjectFields=Description__c,Total_Inventory__c");
 
                 // testCreateSObject
                 from("direct:CreateSObject")
                     .to("salesforce:createSObject?sObjectName=Merchandise__c");
 
                 from("direct:CreateSObjectXml")
-                    
.to("salesforce:createSObject?format=xml&sObjectName=Merchandise__c");
+                    
.to("salesforce:createSObject?format=XML&sObjectName=Merchandise__c");
 
                 // testUpdateSObject
                 from("direct:UpdateSObject")
                     .to("salesforce:updateSObject?sObjectName=Merchandise__c");
 
                 from("direct:UpdateSObjectXml")
-                    
.to("salesforce:updateSObject?format=xml&sObjectName=Merchandise__c");
+                    
.to("salesforce:updateSObject?format=XML&sObjectName=Merchandise__c");
 
                 // testDeleteSObject
                 from("direct:deleteSObject")
                     .to("salesforce:deleteSObject?sObjectName=Merchandise__c");
 
                 from("direct:deleteSObjectXml")
-                    
.to("salesforce:deleteSObject?format=xml&sObjectName=Merchandise__c");
+                    
.to("salesforce:deleteSObject?format=XML&sObjectName=Merchandise__c");
 
                 // testGetSObjectWithId
                 from("direct:getSObjectWithId")
                     
.to("salesforce:getSObjectWithId?sObjectName=Line_Item__c&sObjectIdName=Name");
 
                 from("direct:getSObjectWithIdXml")
-                    
.to("salesforce:getSObjectWithId?format=xml&sObjectName=Line_Item__c&sObjectIdName=Name");
+                    
.to("salesforce:getSObjectWithId?format=XML&sObjectName=Line_Item__c&sObjectIdName=Name");
 
                 // testUpsertSObject
                 from("direct:upsertSObject")
                     
.to("salesforce:upsertSObject?sObjectName=Line_Item__c&sObjectIdName=Name");
 
                 from("direct:upsertSObjectXml")
-                    
.to("salesforce:upsertSObject?format=xml&sObjectName=Line_Item__c&sObjectIdName=Name");
+                    
.to("salesforce:upsertSObject?format=XML&sObjectName=Line_Item__c&sObjectIdName=Name");
 
                 // testDeleteSObjectWithId
                 from("direct:deleteSObjectWithId")
                     
.to("salesforce:deleteSObjectWithId?sObjectName=Line_Item__c&sObjectIdName=Name");
 
                 from("direct:deleteSObjectWithIdXml")
-                    
.to("salesforce:deleteSObjectWithId?format=xml&sObjectName=Line_Item__c&sObjectIdName=Name");
+                    
.to("salesforce:deleteSObjectWithId?format=XML&sObjectName=Line_Item__c&sObjectIdName=Name");
 
                 // testGetBlobField
                 from("direct:getBlobField")
                     
.to("salesforce:getBlobField?sObjectName=Document&sObjectBlobFieldName=Body");
 
                 from("direct:getBlobFieldXml")
-                    
.to("salesforce:getBlobField?format=xml&sObjectName=Document&sObjectBlobFieldName=Body");
+                    
.to("salesforce:getBlobField?format=XML&sObjectName=Document&sObjectBlobFieldName=Body");
 
                 // testQuery
                 from("direct:query")
                     .to("salesforce:query?sObjectQuery=SELECT name from 
Line_Item__c&sObjectClass=org.apache.camel.component.salesforce.dto.QueryRecordsLine_Item__c");
 
                 from("direct:queryXml")
-                    .to("salesforce:query?format=xml&sObjectQuery=SELECT name 
from 
Line_Item__c&sObjectClass=org.apache.camel.component.salesforce.dto.QueryRecordsLine_Item__c");
+                    .to("salesforce:query?format=XML&sObjectQuery=SELECT name 
from 
Line_Item__c&sObjectClass=org.apache.camel.component.salesforce.dto.QueryRecordsLine_Item__c");
 
                 // testSearch
                 from("direct:search")
                     .to("salesforce:search?sObjectSearch=FIND {Wee}");
 
                 from("direct:searchXml")
-                    .to("salesforce:search?format=xml&sObjectSearch=FIND 
{Wee}");
+                    .to("salesforce:search?format=XML&sObjectSearch=FIND 
{Wee}");
             }
         };
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/512b0a16/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/SalesforceComponentConfigurationTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/SalesforceComponentConfigurationTest.java
 
b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/SalesforceComponentConfigurationTest.java
new file mode 100644
index 0000000..c556061
--- /dev/null
+++ 
b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/SalesforceComponentConfigurationTest.java
@@ -0,0 +1,201 @@
+/**
+ * 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 org.apache.camel.CamelContext;
+import org.apache.camel.Component;
+import org.apache.camel.ComponentConfiguration;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.salesforce.dto.Document;
+import org.apache.camel.component.salesforce.dto.Line_Item__c;
+import org.apache.camel.component.salesforce.dto.Merchandise__c;
+import org.apache.camel.component.salesforce.dto.QueryRecordsLine_Item__c;
+import org.apache.camel.component.salesforce.internal.PayloadFormat;
+import org.apache.camel.impl.ParameterConfiguration;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.*;
+
+
+/**
+ * Lets test the use of the ComponentConfiguration on the Salesforce endpoint
+ */
+@Ignore("Must run manually with a user supplied 
test-salesforce-login.properties")
+public class SalesforceComponentConfigurationTest extends CamelTestSupport {
+
+    private static final Logger LOG = 
LoggerFactory.getLogger(SalesforceComponentConfigurationTest.class);
+
+    protected String componentName = "salesforce123";
+    protected boolean verbose = true;
+
+    @Test
+    public void testConfiguration() throws Exception {
+        Component component = context().getComponent(componentName);
+        ComponentConfiguration configuration = 
component.createComponentConfiguration();
+        SortedMap<String, ParameterConfiguration> parameterConfigurationMap = 
configuration.getParameterConfigurationMap();
+        if (verbose) {
+            Set<Map.Entry<String, ParameterConfiguration>> entries = 
parameterConfigurationMap.entrySet();
+            for (Map.Entry<String, ParameterConfiguration> entry : entries) {
+                String name = entry.getKey();
+                ParameterConfiguration config = entry.getValue();
+                LOG.info("Has name: {} with type {}", name, 
config.getParameterType().getName());
+            }
+        }
+
+        assertParameterConfig(configuration, "format", PayloadFormat.class);
+        assertParameterConfig(configuration, "sObjectName", String.class);
+        assertParameterConfig(configuration, "sObjectFields", String.class);
+        assertParameterConfig(configuration, "updateTopic", boolean.class);
+
+        configuration.setParameter("format", PayloadFormat.XML);
+        configuration.setParameter("sObjectName", "Merchandise__c");
+        configuration.setParameter("sObjectFields", 
"Description__c,Total_Inventory__c");
+        configuration.setParameter("updateTopic", false);
+
+        // operation name is base uri
+        configuration.setBaseUri("getSObject");
+
+        SalesforceEndpoint endpoint = 
assertIsInstanceOf(SalesforceEndpoint.class, configuration.createEndpoint());
+        final SalesforceEndpointConfig endpointConfig = 
endpoint.getConfiguration();
+        assertEquals("endpoint.format", PayloadFormat.XML, 
endpointConfig.getFormat());
+        assertEquals("endpoint.sObjectName", "Merchandise__c", 
endpointConfig.getSObjectName());
+        assertEquals("endpoint.sObjectFields", 
"Description__c,Total_Inventory__c", endpointConfig.getSObjectFields());
+        assertEquals("endpoint.updateTopic", false, 
endpointConfig.isUpdateTopic());
+    }
+
+    public static void assertParameterConfig(ComponentConfiguration 
configuration, String name,
+                                       Class<?> parameterType) {
+        ParameterConfiguration config = 
configuration.getParameterConfiguration(name);
+        assertNotNull("ParameterConfiguration should exist for parameter name 
" + name, config);
+        assertEquals("ParameterConfiguration." + name + ".getName()", name, 
config.getName());
+        assertEquals("ParameterConfiguration." + name + ".getParameterType()", 
parameterType,
+                config.getParameterType());
+    }
+
+    @Test
+    public void testEndpointCompletion() throws Exception {
+        Component component = context().getComponent(componentName);
+        ComponentConfiguration configuration = 
component.createComponentConfiguration();
+
+        // get operation names
+        assertCompletionOptions(configuration.completeEndpointPath(""),
+            "getVersions", "getResources", "getGlobalObjects", "getBasicInfo", 
"getDescription", "getSObject",
+            "createSObject", "updateSObject", "deleteSObject", 
"getSObjectWithId", "upsertSObject",
+            "deleteSObjectWithId", "getBlobField", "query", "queryMore", 
"search", "createJob", "getJob",
+            "closeJob", "abortJob", "createBatch", "getBatch", 
"getAllBatches", "getRequest", "getResults",
+            "createBatchQuery", "getQueryResultIds", "getQueryResult", 
"[PushTopicName]"
+        );
+
+        // get filtered operation names
+        assertCompletionOptions(configuration.completeEndpointPath("get"),
+            "getVersions", "getResources", "getGlobalObjects", "getBasicInfo", 
"getDescription", "getSObject",
+            "getSObjectWithId", "getBlobField", "getJob", "getBatch", 
"getAllBatches", "getRequest", "getResults",
+            "getQueryResultIds", "getQueryResult"
+        );
+
+/* TODO support parameter completion
+        // get ALL REST operation parameters
+        // TODO support operation specific parameter completion
+        
assertCompletionOptions(configuration.completeEndpointPath("getSObject?"),
+            "apiVersion", "httpClient", "format", "sObjectName", "sObjectId", 
"sObjectFields",
+            "sObjectIdName", "sObjectIdValue", "sObjectBlobFieldName", 
"sObjectClass", "sObjectQuery", "sObjectSearch");
+
+        // get filtered REST parameters
+        
assertCompletionOptions(configuration.completeEndpointPath("getSObject?format=XML&"),
+            "apiVersion", "httpClient", "sObjectName", "sObjectId", 
"sObjectFields",
+            "sObjectIdName", "sObjectIdValue", "sObjectBlobFieldName", 
"sObjectClass", "sObjectQuery", "sObjectSearch");
+
+        // get ALL Bulk operation parameters
+        // TODO support operation specific parameter completion
+        
assertCompletionOptions(configuration.completeEndpointPath("createJob?"),
+            "apiVersion", "httpClient", "sObjectQuery", "contentType", 
"jobId", "batchId", "resultId");
+
+        // get filtered Bulk operation parameters
+        
assertCompletionOptions(configuration.completeEndpointPath("createJob?contentType=XML&"),
+            "apiVersion", "httpClient", "sObjectQuery", "jobId", "batchId", 
"resultId");
+
+        // get ALL topic parameters for consumers
+        assertCompletionOptions(configuration.completeEndpointPath("myTopic?"),
+            "apiVersion", "httpClient", "updateTopic", "notifyForFields", 
"notifyForOperations");
+
+        // get filtered topic parameters for consumers
+        
assertCompletionOptions(configuration.completeEndpointPath("myTopic?updateTopic=true&"),
+            "apiVersion", "httpClient", "notifyForFields", 
"notifyForOperations");
+
+        // get parameters from partial name
+        
assertCompletionOptions(configuration.completeEndpointPath("getSObject?sObject"),
+            "sObjectName", "sObjectId", "sObjectFields",
+            "sObjectIdName", "sObjectIdValue", "sObjectBlobFieldName", 
"sObjectClass", "sObjectQuery", "sObjectSearch");
+*/
+
+        // get sObjectName values, from scanned DTO packages
+        
assertCompletionOptions(configuration.completeEndpointPath("getSObject?sObjectName="),
+            "Document", "Line_Item__c", "Merchandise__c");
+
+        // get sObjectFields values, from scanned DTO
+        assertCompletionOptions(
+            
configuration.completeEndpointPath("getSObject?sObjectName=Merchandise__c&sObjectFields="),
+            "attributes", "Id", "OwnerId", "IsDeleted", "Name", "CreatedDate", 
"CreatedById",
+            "LastModifiedDate", "LastModifiedById", "SystemModstamp", 
"LastActivityDate",
+            "Description__c", "Price__c", "Total_Inventory__c");
+
+        // get sObjectClass values, from scanned DTO packages
+        
assertCompletionOptions(configuration.completeEndpointPath("getSObject?sObjectClass="),
+            Document.class.getName(),
+            Line_Item__c.class.getName(),
+            Merchandise__c.class.getName(),
+            QueryRecordsLine_Item__c.class.getName());
+    }
+
+    private void assertCompletionOptions(List<String> options, final String 
...args) {
+        List<String> missing = new ArrayList<String>();
+        for (String arg : args) {
+            if (!options.remove(arg)) {
+                missing.add(arg);
+            }
+        }
+        if (!missing.isEmpty() || !options.isEmpty()) {
+            fail(String.format("Missing options %s, unknown options %s",
+                missing, options));
+        }
+    }
+
+    protected CamelContext createCamelContext() throws Exception {
+        final CamelContext camelContext = super.createCamelContext();
+        final SalesforceLoginConfig loginConfig = 
LoginConfigHelper.getLoginConfig();
+        final SalesforceComponent component = new SalesforceComponent();
+        component.setLoginConfig(loginConfig);
+        // set DTO package
+        component.setPackages(new String[]{
+            Merchandise__c.class.getPackage().getName()
+        });
+        camelContext.addComponent(componentName, component);
+        return camelContext;
+    }
+
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() throws Exception {
+            }
+        };
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/512b0a16/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 b191933..5513c9c 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
@@ -16,29 +16,10 @@
  */
 package org.apache.camel.maven;
 
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.lang.reflect.Field;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-import java.util.regex.Pattern;
-
 import org.apache.camel.component.salesforce.SalesforceLoginConfig;
 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.GlobalObjects;
-import org.apache.camel.component.salesforce.api.dto.PickListValue;
-import org.apache.camel.component.salesforce.api.dto.SObject;
-import org.apache.camel.component.salesforce.api.dto.SObjectDescription;
-import org.apache.camel.component.salesforce.api.dto.SObjectField;
+import org.apache.camel.component.salesforce.api.dto.*;
+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;
@@ -56,6 +37,15 @@ import org.codehaus.jackson.map.ObjectMapper;
 import org.eclipse.jetty.client.HttpClient;
 import org.eclipse.jetty.client.RedirectListener;
 
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.regex.Pattern;
+
 /**
  * Goal which generates POJOs for Salesforce SObjects
  *
@@ -206,7 +196,7 @@ public class CamelSalesforceMojo extends AbstractMojo {
         RestClient restClient = null;
         try {
             restClient = new DefaultRestClient(httpClient,
-                    version, "json", session);
+                    version, PayloadFormat.JSON, session);
             // remember to start the active client object
             ((DefaultRestClient) restClient).start();
         } catch (Exception e) {

http://git-wip-us.apache.org/repos/asf/camel/blob/512b0a16/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/java/org/apache/camel/maven/CamelSalesforceMojoIntegrationTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/java/org/apache/camel/maven/CamelSalesforceMojoIntegrationTest.java
 
b/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/java/org/apache/camel/maven/CamelSalesforceMojoIntegrationTest.java
index e3af8d3..917292b 100644
--- 
a/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/java/org/apache/camel/maven/CamelSalesforceMojoIntegrationTest.java
+++ 
b/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/java/org/apache/camel/maven/CamelSalesforceMojoIntegrationTest.java
@@ -25,7 +25,7 @@ import java.util.Properties;
 
 public class CamelSalesforceMojoIntegrationTest {
 
-    private static final String TEST_LOGIN_PROPERTIES = 
"test-salesforce-login.properties";
+    private static final String TEST_LOGIN_PROPERTIES = 
"../test-salesforce-login.properties";
 
     @Test
     public void testExecute() throws Exception {

Reply via email to