Salesforce.com interface to directly access Salesforce.com

Dependencies:   HTTPClient-SSL MbedJSONValue

Dependents:   df-2014-salesforce-hrm-k64f

Fork of SalesforceInterface by Doug Anson

Embed: (wiki syntax)

« Back to documentation index

SalesforceInterface Class Reference

SalesforceInterface Class Reference

Salesforce Interface SalesforceInterface provides a simple C++ API into the REST-based Salesforce.com APIs. More...

#include <SalesforceInterface.h>

Public Member Functions

 SalesforceInterface (HTTPClient *http, RawSerial *pc=NULL)
 Default constructor.
 SalesforceInterface (HTTPClient *http, Logger *logger=NULL)
 Alternative constructor.
virtual ~SalesforceInterface ()
 Default destructor.
void setCredentials (char *username, char *password, char *client_id, char *client_secret)
 Establish salesforce.com credentials.
char * getSalesforceToken (bool fetch=true)
 Get our salesforce.com token.
void resetSalesforceToken ()
 Force the interface to re-acquire the OAUTH token and salesforce token.
void setSalesforceAPIVersion (int version)
 Set our salesforce.com API version.
void setSalesforceAPIVersion (char *version)
 Set our salesforce.com API version.
char * getSalesforceAPIVersion ()
 Get our salesforce.com API version.
char * query (char *query_str, char *output_buffer, int output_buffer_length)
 Salesforce.com API SOQL QUERY method to invoke ad-hoc SOQL queries into salesforce.com.
MbedJSONValue createRecord (char *object_name, MbedJSONValue &record)
 Salesforce.com API record creation method to create a new record within a salesforce.com object.
MbedJSONValue readRecord (char *object_name, char *record_id, char *record_value=NULL)
 Salesforce.com API record read method to read a record within a salesforce.com object.
bool updateRecord (char *object_name, char *record_id, MbedJSONValue &record)
 Salesforce.com API record update method to update a record within a salesforce.com object.
bool upsertRecord (char *object_name, char *external_id_field_name, char *external_id_field_value, MbedJSONValue &record)
 Salesforce.com API record upsert (update/insert) method to update a record within a salesforce.com object for External IDs.
bool deleteRecord (char *object_name, char *record_id)
 Salesforce.com API record delete method to delete a record within a salesforce.com object.
int httpResponseCode ()
 Salesforce.com API invocation HTTP response code to aid in debugging error conditions.
MbedJSONValue getLastError ()
 Retrieve the last executed update, upsert, or delete response error detail.

Detailed Description

Salesforce Interface SalesforceInterface provides a simple C++ API into the REST-based Salesforce.com APIs.

Example Project: http://mbed.org/users/ansond/code/df-2014-salesforce-testharness-k64f/

 #include "Definitions.h"       // definitions including platform specifics...
 #include "Logger.h"
 
 // include salesforce.com credentials
 #include "sf_creds.h"
 
 // our Serial port
 #include "BufferedSerial.h"
 BufferedSerial pc(USBTX, USBRX);
 
 // Ethernet
 #include "EthernetInterface.h"
 EthernetInterface ethernet;
 
 // HTTP 
 #include "HTTPClient.h"
 HTTPClient http;
 
 // Salesforce.com Interface
 #include "SalesforceInterface.h"
  
 // test case persistence
 char *object_name = NULL;
 char *account_name = NULL;
 char *updated_account_name = NULL;
 char *external_id_field_name = NULL;
 char *external_id_field_value = NULL;
 DEFINE_SML_BUFFER(record_id);
    
 // *************** Test Cases ************************
 
 void Test_getSalesforceToken(Logger *logger,SalesforceInterface *sf) {
     logger->log("\r\n\r\nGetting Salesforce Token...");
     logger->turnLEDPurple();
     
     // get the salesforce token     
     char *id = sf->getSalesforceToken();
     if (id != NULL && strlen(id) > 0)
         logger->log("Saleforce token: %s",id);
     else
         logger->log("Unable to get Saleforce token");
     logger->turnLEDGreen();
 }
 
 void Test_query(Logger *logger,SalesforceInterface *sf,char *query_str) {
     logger->log("\r\n\r\nExecuting test query: %s",query_str);
     logger->turnLEDPurple();
     if (query_str != NULL && strlen(query_str) > 0) { 
         ALLOC_BUFFER(response);
         char *answer = sf->query(query_str,response,MAX_BUFFER_LENGTH);
         if (answer != NULL) logger->log("query result: %s",answer);
         else logger->log("query - NULL result");
     }
     else {
        logger->log("Unable to perform query as we do not have our salesforce token");
     }
     logger->turnLEDGreen();
 }
 
 void Test_create(Logger *logger,SalesforceInterface *sf) {
     logger->log("\r\n\r\nExecuting create()");
     logger->turnLEDPurple();
     
     // create a new record
     MbedJSONValue new_record;
     new_record["name"] = account_name;
     
     // DEBUG
     logger->log("Create: new record: %s",new_record.serialize().c_str());
     
     // create...
     MbedJSONValue response = sf->createRecord(object_name,new_record);
     
     // display the result
     char *result = (char *)response.serialize().c_str();
     if (result != NULL && strlen(result) > 0 && strcmp(result,"null") != 0) {
        // save off the token if we succeeded
        logger->log("Create: result: %s",result);
        logger->log("Create: http_code=%d",sf->httpResponseCode());
        RESET_SML_BUFFER(record_id);
        strcpy(record_id,(char *)response["id"].get<std::string>().c_str());
     }
     else {
        // failure
        logger->log("Create: FAILED http_code=%d",sf->httpResponseCode());
     }
     logger->turnLEDGreen();
 }
 
 void Test_read(Logger *logger,SalesforceInterface *sf) {
     logger->log("\r\n\r\nExecuting read()");
     logger->turnLEDPurple();
          
     // DEBUG
     logger->log("Read: reading: %s from %s",record_id,object_name);
     
     // read...
     MbedJSONValue response = sf->readRecord(object_name,record_id);
     
     // display the result
     char *result = (char *)response.serialize().c_str();
     if (result != NULL && strlen(result) > 0 && strcmp(result,"null") != 0) {
        // save off the token if we succeeded
        logger->log("Read: result: %s",result);
        logger->log("Read: http_code=%d",sf->httpResponseCode());
     }
     else {
        // failure
        logger->log("Read: FAILED http_code=%d",sf->httpResponseCode());
     }
     
     logger->turnLEDGreen();
 }
 
 void Test_create_external_id(Logger *logger,SalesforceInterface *sf) {
     logger->log("\r\n\r\nExecuting create(ExternalID)");
     logger->turnLEDPurple();
     
     // create a new record
     MbedJSONValue new_record;
     new_record[external_id_field_name] = external_id_field_value;
     
     // DEBUG
     logger->log("create(ExternalID): new record: %s",new_record.serialize().c_str());
     
     // create...
     MbedJSONValue response = sf->createRecord(object_name,new_record);
     
     // display the result
     char *result = (char *)response.serialize().c_str();
     if (result != NULL && strlen(result) > 0 && strcmp(result,"null") != 0) {
        // save off the token if we succeeded
        logger->log("create(ExternalID): result: %s",result);
        logger->log("create(ExternalID): http_code=%d",sf->httpResponseCode());
        RESET_SML_BUFFER(record_id);
        strcpy(record_id,(char *)response["id"].get<std::string>().c_str());
     }
     else {
        // failure
        logger->log("create(ExternalID): FAILED http_code=%d",sf->httpResponseCode());
     }
     logger->turnLEDGreen();
 }
 
 void Test_read_by_external_id_and_value(Logger *logger,SalesforceInterface *sf) {
     logger->log("\r\n\r\nExecuting read(externalID)...");
     logger->turnLEDPurple();
          
     // DEBUG
     logger->log("read(externalID): reading: %s from %s with value %s",object_name,external_id_field_name,external_id_field_value);
     
     // read (external ID)...
     MbedJSONValue response = sf->readRecord(object_name,external_id_field_name,external_id_field_value);
     
     // display the result
     char *result = (char *)response.serialize().c_str();
     if (result != NULL && strlen(result) > 0 && strcmp(result,"null") != 0) {
        // save off the token if we succeeded
        logger->log("read(externalID): result: %s",result);
        logger->log("read(externalID): http_code=%d",sf->httpResponseCode());
     }
     else {
        // failure
        logger->log("read(externalID): FAILED http_code=%d",sf->httpResponseCode());
     }
     
     logger->turnLEDGreen();
 }
 
 void Test_update(Logger *logger,SalesforceInterface *sf) {
     logger->log("\r\n\r\nExecuting update()");
     logger->turnLEDPurple();
     
     // update am existing record - assume "name" is the proper key for the record you wish to update...
     MbedJSONValue changed_record;
     changed_record["name"] = updated_account_name;
     
     // DEBUG
     logger->log("Update: updated record: %s",changed_record.serialize().c_str());
     
     // update...
     bool updated = sf->updateRecord(object_name,record_id,changed_record);
     
     // display the result
     if (updated) {
        // SUCCESS
        logger->log("Update: successful! http_code=%d",sf->httpResponseCode());
     }
     else {
        // failure
        logger->log("Update: FAILED http_code=%d",sf->httpResponseCode());
     }
     logger->turnLEDGreen();
 }
 
 void Test_upsert_external_id(Logger *logger,SalesforceInterface *sf) {
     logger->log("\r\n\r\nExecuting upsert(ExternalID)");
     logger->turnLEDPurple();
     
     // update am existing record - assume "name" is the proper key for the record you wish to update...
     MbedJSONValue changed_record;
     changed_record["name"] = updated_account_name;
     
     // DEBUG
     logger->log("upsert(ExternalID): upserted record: %s",changed_record.serialize().c_str());
     
     // Upsert...
     bool updated = sf->upsertRecord(object_name,external_id_field_name,external_id_field_value,changed_record);
     
     // display the result
     if (updated) {
        // SUCCESS
        logger->log("upsert(ExternalID): successful! http_code=%d",sf->httpResponseCode());
     }
     else {
        // failure
        logger->log("upsert(ExternalID): FAILED http_code=%d",sf->httpResponseCode());
     }
     logger->turnLEDGreen();
 }
 
 void Test_delete(Logger *logger,SalesforceInterface *sf) {
     logger->log("\r\n\r\nExecuting delete()");
     logger->turnLEDPurple();
     
     // DEBUG
     logger->log("Delete: deleting: %s from %s",record_id,object_name);
     
     // delete...
     bool deleted = sf->deleteRecord(object_name,record_id);
     
     // display the result
     if (deleted) {
        // SUCCESS
        logger->log("Delete: successful! http_code=%d",sf->httpResponseCode());
     }
     else {
        // failure
        logger->log("Delete: FAILED http_code=%d",sf->httpResponseCode());
     }
     
     logger->turnLEDGreen();
 }
 
 void Test_reset_auth(Logger *logger,SalesforceInterface *sf) {
     logger->log("\r\n\r\nForcing API to reset OAUTH token and Salesforce Token...");
     logger->turnLEDPurple();
     sf->resetSalesforceToken();
     logger->turnLEDGreen();
 }
 
 // *************** Test Cases ************************
 
 // Main Task...
 void mainTask(void const *v) {
        
    // create our object instances 
    Logger logger(&pc,NULL);    
    SalesforceInterface *sf = NULL;
    
    // announce
    logger.log("\r\n\r\nARM Salesforce Interface Testharness v%s",APP_VERSION);
    logger.turnLEDBlue();
    
    // initialize Ethernet
    logger.log("Initializing Ethernet...");
    ethernet.init();
    
    // get a DHCP address and bring the network interface up
    logger.log("Getting IP Address...");
    logger.turnLEDOrange();
    if (ethernet.connect() == 0) {
        // log our IP address (DHCP)
        logger.log("IP Address: %s",ethernet.getIPAddress());
        
        // allocate the Salesforce.com interface
        logger.log("Allocating Saleforce.com interface...");
        sf = new SalesforceInterface(&http,&logger);
        
        // set our Salesforce.com credentials
        sf->setCredentials(username,password,client_id,client_secret);
        
        // *************** BEGIN TEST CASES *****************        

        // configuration for the test cases        
        object_name             = "Account";       // use the account object
        account_name            = "ARM";           // add this record (name)
        updated_account_name    = "ARM Holdings";  // update the existing record's name to this
        external_id_field_name  = "Device__c";     // External ID field name
        external_id_field_value = "ABC123";        // External ID field value
        RESET_SML_BUFFER(record_id);               // buffer for the record's token
        
        // Perform a Create
        Test_create(&logger,sf);
                
        // Perform a Read
        Test_read(&logger,sf);
        
        // Perform a Query
        Test_query(&logger,sf,"SELECT Id,Name FROM Account LIMIT 5");
        
        // Perform an Update
        Test_update(&logger,sf);
                
        // Perform a second Read to visually confirm the update above...
        Test_read(&logger,sf);
        
        // Perform a Create (External ID)
        Test_create_external_id(&logger,sf);
        
        // Perform an Upsert
        Test_upsert_external_id(&logger,sf);
        
        // Perform a read of the external ID'ed specified by a given value
        Test_read_by_external_id_and_value(&logger,sf);
        
        // force the API to re-acquire the OAUTH token and Salesforce Token 
        Test_reset_auth(&logger,sf);
        
        // Perform a Read (should re-acquire the OAUTH token and Salesforce Token)
        Test_read(&logger,sf);
        
        // Perform a Delete
        Test_delete(&logger,sf);
                
        // reset the record token buffer
        // RESET_SML_BUFFER(record_id);
        
        // Perform a Read - should error out
        Test_read(&logger,sf);
                        
        // reset the record token buffer
        RESET_SML_BUFFER(record_id);
        
        // *************** BEGIN TEST CASES *****************      
        
        // entering main loop
        logger.log("All tests complete...\r\nExiting...");
        logger.turnLEDBlue();
        exit(0);
     }
     else {
         logger.log("No Network... Exiting...");
         logger.turnLEDRed();
         exit(1);
     }     
  }
  
  // main entry
  int main() {
     Thread workerTask(mainTask, NULL, osPriorityNormal, STACK_SIZE);
     while (true) {
        Thread::wait(10*WAIT_TIME_MS);
     }
  }

Definition at line 450 of file SalesforceInterface.h.


Constructor & Destructor Documentation

SalesforceInterface ( HTTPClient *  http,
RawSerial *  pc = NULL 
)

Default constructor.

Parameters:
httpHTTPClient instance
pcoptional RawSerial for debugging output. If NULL, there will be no debugging output

Definition at line 51 of file SalesforceInterface.cpp.

SalesforceInterface ( HTTPClient *  http,
Logger *  logger = NULL 
)

Alternative constructor.

Parameters:
httpHTTPClient instance
loggeroptional Logger instance (See Logger for more info). If NULL, there will be no debugging output

Definition at line 63 of file SalesforceInterface.cpp.

~SalesforceInterface (  ) [virtual]

Default destructor.

Definition at line 87 of file SalesforceInterface.cpp.


Member Function Documentation

MbedJSONValue createRecord ( char *  object_name,
MbedJSONValue &  record 
)

Salesforce.com API record creation method to create a new record within a salesforce.com object.

Parameters:
object_namename of the salesforce.com object to create the record in (i.e. "Account")
recordMbedJSONValue json structure that the new record will be comprised with
Returns:
MbedJSONValue structure with the results of the creation operation in JSON format

Definition at line 319 of file SalesforceInterface.cpp.

bool deleteRecord ( char *  object_name,
char *  record_id 
)

Salesforce.com API record delete method to delete a record within a salesforce.com object.

Parameters:
object_namename of the salesforce.com object to delete the record in (i.e. "Account")
record_idsalesforce.com id of the record instance to delete
Returns:
true - success, false - failure

Definition at line 349 of file SalesforceInterface.cpp.

MbedJSONValue getLastError (  )

Retrieve the last executed update, upsert, or delete response error detail.

Returns:
http response code from last update, upsert, or delete operation

Definition at line 355 of file SalesforceInterface.cpp.

char * getSalesforceAPIVersion (  )

Get our salesforce.com API version.

Returns:
string containing our salesforce.com API version or NULL if in error

Definition at line 123 of file SalesforceInterface.cpp.

char * getSalesforceToken ( bool  fetch = true )

Get our salesforce.com token.

Parameters:
fetchboolean that will direct the interface to fetch the token if not already done (default = true)
Returns:
our salesforce token in JSON format or NULL if in error

Definition at line 262 of file SalesforceInterface.cpp.

int httpResponseCode (  )

Salesforce.com API invocation HTTP response code to aid in debugging error conditions.

Returns:
http response code

Definition at line 120 of file SalesforceInterface.cpp.

char * query ( char *  query_str,
char *  output_buffer,
int  output_buffer_length 
)

Salesforce.com API SOQL QUERY method to invoke ad-hoc SOQL queries into salesforce.com.

Parameters:
query_strcharacter string with the SOQL query to invoke
output_bufferallocated result buffer to use
output_buffer_lengthallocated result buffer length
Returns:
result of the SOQL query in JSON format or NULL if in error

Definition at line 281 of file SalesforceInterface.cpp.

MbedJSONValue readRecord ( char *  object_name,
char *  record_id,
char *  record_value = NULL 
)

Salesforce.com API record read method to read a record within a salesforce.com object.

Parameters:
object_namename of the salesforce.com object to read the record in (i.e. "Account")
record_idsalesforce.com id of the record instance to read
record_valuesalesforce.com id value of the record instance to read (for external ID usage - default is NULL for non-external IDs)
Returns:
MbedJSONValue structure with the results of the read operation in JSON format

Definition at line 328 of file SalesforceInterface.cpp.

void resetSalesforceToken (  )

Force the interface to re-acquire the OAUTH token and salesforce token.

Definition at line 169 of file SalesforceInterface.cpp.

void setCredentials ( char *  username,
char *  password,
char *  client_id,
char *  client_secret 
)

Establish salesforce.com credentials.

Parameters:
usernamesalesforce.com account user name
passwordsalesforce.com account password. The password must be of the form [password][security token]
client_idsalesforce.com connected application "customer key" value
client_secretsalesforce.com connected application client secret value

Definition at line 92 of file SalesforceInterface.cpp.

void setSalesforceAPIVersion ( char *  version )

Set our salesforce.com API version.

Parameters:
versionstring value (format "X.Y")

Definition at line 122 of file SalesforceInterface.cpp.

void setSalesforceAPIVersion ( int  version )

Set our salesforce.com API version.

Parameters:
versioninteger value (positive)

Definition at line 121 of file SalesforceInterface.cpp.

bool updateRecord ( char *  object_name,
char *  record_id,
MbedJSONValue &  record 
)

Salesforce.com API record update method to update a record within a salesforce.com object.

Parameters:
object_namename of the salesforce.com object to update the record in (i.e. "Account")
record_idsalesforce.com id of the record instance to read
recordMbedJSONValue instance with updated data for the record
Returns:
true - success, false - failure

Definition at line 337 of file SalesforceInterface.cpp.

bool upsertRecord ( char *  object_name,
char *  external_id_field_name,
char *  external_id_field_value,
MbedJSONValue &  record 
)

Salesforce.com API record upsert (update/insert) method to update a record within a salesforce.com object for External IDs.

Parameters:
object_namename of the salesforce.com External object to upsert the record in (i.e. "FooBar_c")
external_id_field_namesalesforce.com id of the External record instance to upsert
external_id_field_valuesalesforce.com id value of the External record instance to upsert
recordMbedJSONValue instance with updated data for the record
Returns:
true - success, false - failure

Definition at line 343 of file SalesforceInterface.cpp.