19
Mule ESB 3.6 CRUD operations on Salesforce using Mule ESB

mule salesforce

Embed Size (px)

Citation preview

Page 1: mule salesforce

Mule ESB 3.6

CRUD operations on Salesforce using Mule ESB

Page 2: mule salesforce

Objective

– Advantages of using Salesforce connector– How to perform Create, Read, Update and Delete

operations on Salesforce

Page 3: mule salesforce

Pre-requisites

• Anypoint Studio• A Salesforce developer account• A security token for Salesforce

Page 4: mule salesforce

Salesforce Connector• Salesforce connector allows Mule ESB application to connect

to Salesforce• It supports data sense which fetches meta data information

about of Salesforce once required connection details are specified at the connector

• It lists all objects and operations at design time using data sense and makes development easy and rapid

Page 5: mule salesforce

Steps

• Create a Salesforce developer account• Create a security token for Salesforce account• Create a mule application to perform CRUD

operations

Page 6: mule salesforce

How to create Salesforce developer account

• Sign up for a new account at http://developer.force.com/

Page 7: mule salesforce

How to generate a security token• Sign into http://developer.force.com/, click your name in the

upper right corner, then click Setup > My Personal Information > Reset Security Token. Then, click Reset My Security Token. Salesforce sends your security token via email to your registered email address

Page 8: mule salesforce

Create a mule application to perform CRUD operations

• Create a property file• Configure property file in your project• Add Salesforce connector and configure the

connector details• Configure a flow• Run your application

Page 9: mule salesforce

• Create a property file with following details and place it in mule_home/conf folder

#SF URL sf_url=https://<your salesforce url>/services/Soap/u/26.0#SF Usernamesf_username=<Your salesforce account name>#SF Passwordsf_password=<Your salesforce account password>#SF Security Tokensf_security_token=<Your salesforce security token>

Page 10: mule salesforce

Add the property file in your flow• Click on global elements tab -> Click on create -> Type in Property

Placeholder in the filter box -> Select Property Placeholder and click on Ok -> Type in “file:${mule_home}/conf/salesforce-config.properties” in the location text box and click on Ok

• You should see an XML tag added under your configuration XML as below<context:property-placeholder location="file:${mule_home}/conf/salesforce-config.properties"/>

Page 11: mule salesforce

Add Salesforce connector in your flow

• Click on global elements tab -> Click on create -> Select Salesforce and add property as shown below

Page 12: mule salesforce

You need to create 3 java classes as show below

• CreateContactRequest.java

public class CreateContactRequest implements Callable {

@Overridepublic Object onCall(MuleEventContext eventContext) throws Exception {HashMap<String,Object> contactSObjectFields = new HashMap<String,Object>(); // sObject is defined as a map contactSObjectFields.put("FirstName", “YourFirstName"); contactSObjectFields.put("LastName", "YourLastName");contactSObjectFields.put("MobilePhone", "YourMobileNo");contactSObjectFields.put("Email", “YourEmail");// list of sobjects to be created List<HashMap<String,Object>> objects = new ArrayList<HashMap<String,Object>>(); objects.add(contactSObjectFields); // map that will be placed as payload HashMap<String,Object> payload = new HashMap<String,Object>();payload.put("type", "Contact");payload.put("objects", objects);return payload;}

}

Page 13: mule salesforce

• UpdateContactRequest.java

public class UpdateContactRequest implements Callable {

@Overridepublic Object onCall(MuleEventContext eventContext) throws Exception {HashMap<String,Object> contactSObjectFields = new HashMap<String,Object>();MuleMessage muleMessage = eventContext.getMessage();contactSObjectFields.put("FirstName", “YourModifiedFirstName"); contactSObjectFields.put("LastName", "YourModifiedLastName");contactSObjectFields.put("MobilePhone", "YourModifiedMobileNo");contactSObjectFields.put("Email", “YourModifiedEmail");contactSObjectFields.put("Id", muleMessage.getProperty("sObjectId", PropertyScope.SESSION));// map that will be placed as payloadHashMap<String,Object> payload = new HashMap<String,Object>();payload.put("type", "Contact");payload.put("object", contactSObjectFields);return payload;}

}

Page 14: mule salesforce

• CreateContactResponseProcessor.java

public class CreateContactResponseProcessor implements Callable {

@SuppressWarnings("unchecked")@Overridepublic Object onCall(MuleEventContext eventContext) throws Exception {AcknowledgementType ack = new AcknowledgementType();MuleMessage message = eventContext.getMessage();System.out.println(message.toString());// get the message payloadList<SaveResult> saveResults = (List<SaveResult>) message.getPayload();Iterator<SaveResult> iter = saveResults.iterator();SaveResult saveResult = iter.next();ack.setMessageID(saveResult.getId());if(saveResult.getSuccess())ack.setStatus("Success");elseack.setStatus("Success");System.out.println(ack);return ack.getMessageID();}}

Page 15: mule salesforce

Create a mule flow with as show below

Page 16: mule salesforce

The flow configuration will look should look like as follows

<context:property-placeholder location="file:${mule_home}/conf/salesforce-config.properties"/> <sfdc:config name="Salesforce" username="${sf_username}" password="${sf_password}" securityToken="${sf_security_token}" url="${sf_url}" doc:name="Salesforce"> <sfdc:connection-pooling-profile initialisationPolicy="INITIALISE_ONE" exhaustedAction="WHEN_EXHAUSTED_GROW"/> </sfdc:config> <flow name="CreateContact" doc:name="CreateContact"> <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="1001" path="SFDC_CRUD" doc:name="HTTP_Inbound"/> <component class="com.sfdc.requestresponse.processor.CreateContactRequest" doc:name="CreateContactRequest"/> <logger message="Salesforce Request----&gt; #[payload]" level="INFO" doc:name="LogSalesforceRequest"/> <sfdc:create config-ref="Salesforce" doc:name="CreateSalesforceContact" type="#[payload.type]"> <sfdc:objects ref="#[payload.objects]"/> </sfdc:create> <logger message="SFDC output: ------ #[payload]" level="INFO" doc:name="LogSalesforceResponse"/> <component class="com.sfdc.requestresponse.processor.CreateContactResponseProcessor" doc:name="CreateContactSFResponseProcessor"/> <message-properties-transformer overwrite="true" scope="session" doc:name="StoreContactId"> <add-message-property key="sObjectId" value="#[payload]"/> </message-properties-transformer> <flow-ref name="QueryContact" doc:name="GoToReadContactFlow"/> </flow> <flow name="QueryContact" doc:name="QueryContact"> <logger level="INFO" doc:name="LogSalesforceReadContactRequest"/> <sfdc:query config-ref="Salesforce" query="SELECT Id,Name,BillingStreet, BillingCity,BillingState,BillingPostalCode,BillingCountry FROM Account WHERE Id = '#[sessionVars.sObjectId]'" doc:name="ReadSalesforceContact"/> <logger level="INFO" doc:name="LogSalesforceReadContactResponse" message="Query Output: #[payload]"/> <flow-ref name="UpdateContact" doc:name="GoToUpdateContactFlow"/> </flow> <flow name="UpdateContact" doc:name="UpdateContact"> <component class="com.sfdc.requestresponse.processor.UpdateContactRequest" doc:name="UpdateContactRequest"/> <logger message="Update Request----&gt; #[payload]" level="INFO" doc:name="LogUpdateContactSalesforceRequest"/> <sfdc:update-single config-ref="Salesforce" type="#[payload.type]" doc:name="UpdateSalesforceContact"> <sfdc:object ref="#[payload.object]"/> </sfdc:update-single> <logger message="Update Output----&gt; #[payload]" level="INFO" doc:name="LogContactUpdated"/> <flow-ref name="ReadContactAgain" doc:name="GoToReadContactFlow"/> </flow> <flow name="ReadContactAgain" doc:name="ReadContactAgain"> <logger level="INFO" doc:name="LogSalesforceReadContactRequest"/> <sfdc:query config-ref="Salesforce" query="SELECT Id,Name,BillingStreet, BillingCity,BillingState,BillingPostalCode,BillingCountry FROM Account WHERE Id = '#[sessionVars.sObjectId]'" doc:name="ReadSalesforceContact"/> <logger level="INFO" doc:name="LogSalesforceReadContactResponse" message="Query Output: #[payload]"/> <flow-ref name="DeleteContact" doc:name="GoToDeleteContactFlow"/> </flow> <flow name="DeleteContact" doc:name="DeleteContact"> <sfdc:delete config-ref="Salesforce" doc:name="DeleteSalesforceContact"> <sfdc:ids> <sfdc:id>#[sessionVars.sObjectId]</sfdc:id> </sfdc:ids> </sfdc:delete> <logger level="INFO" doc:name="LogDeleteContactResponse" message="Delete Output-----&gt; #[payload]"/> <set-payload value="&quot;CRUD Operations executed successfully. Please check the logs for details&quot;" doc:name="Set Payload"/> </flow>

Page 17: mule salesforce

• Now you can run the application and hit the http URL configured in your application in browser

• It should create a contact, read the values, update the contact, read the value and finally delate the contact from Salesforce.

• You can delete the last flow reference for delete contact if you like to see the contact in Salesforce for your testing

• Details of the contact creation to deletion can be observed in logs

Page 18: mule salesforce

Extract from the logsINFO 2015-03-21 20:01:39,730 [[sfdc_connector].connector.http.mule.default.receiver.02] org.mule.api.processor.LoggerMessageProcessor: Salesforce Request----> {type=Contact, objects=[{[email protected], FirstName=Rupesh, MobilePhone=078000000, LastName=Sinha}]}INFO 2015-03-21 20:01:41,605 [[sfdc_connector].connector.http.mule.default.receiver.02] org.mule.api.processor.LoggerMessageProcessor: SFDC output: ------ [[SaveResult errors='{[0]}' id='003L000000YhRS5IAN' success='true']]

Status: Success, Id: 003L000000YhRS5IAN

INFO 2015-03-21 20:01:42,069 [[sfdc_connector].connector.http.mule.default.receiver.02] org.mule.api.processor.LoggerMessageProcessor: Query Output: []INFO 2015-03-21 20:01:42,073 [[sfdc_connector].connector.http.mule.default.receiver.02] org.mule.api.processor.LoggerMessageProcessor: Update Request----> {object={[email protected], FirstName=Rupesh_Changed, Id=003L000000YhRS5IAN, MobilePhone=078000000, LastName=Sinha_Changed}, type=Contact}INFO 2015-03-21 20:01:42,883 [[sfdc_connector].connector.http.mule.default.receiver.02] org.mule.api.processor.LoggerMessageProcessor: Update Output----> [SaveResult errors='{[0]}' id='003L000000YhRS5IAN' success='true']

INFO 2015-03-21 20:01:43,254 [[sfdc_connector].connector.http.mule.default.receiver.02] org.mule.api.processor.LoggerMessageProcessor: Query Output: []INFO 2015-03-21 20:01:44,053 [[sfdc_connector].connector.http.mule.default.receiver.02] org.mule.api.processor.LoggerMessageProcessor: Delete Output-----> [[DeleteResult errors='{[0]}' id='003L000000YhRS5IAN' success='true']]

Page 19: mule salesforce

Thanks for watching