Use Case 2 - WebSphere Cast Iron Cloud Integration - Fetch CSV File from FTP Server and Insert Data into Salesforce.com

Preface - This post is part of "WebSphere Cast Iron Cloud Integration with Salesforce.com" series.

Today I will post how you can use WebSphere Cast Iron for integrating FTP with Salesforce. Toady, in this example, I will fetch a CSV file present in a FTP server, read that file and then create the Salesforce object based on that record. Finally I will send the response also. So let's not waste time here and get straight into the business.

Use Case:
Below is the object structure -
Below is the CSV File(All_Airports.csv) I would like to read and load from FTP server.
Once done, the final requirement is to create Salesforce records based on the data present in the CSV file.

Before we start implementing the above requirement, let's create the Endpoints first.
Endpoint - FTP:
Endpoint - Salesforce:
Endpoint - HTTP:
Create a default HTTP endpoint with port number 80.

Now we will create the Flat File Schema as shown below. This flat file schema will be used to read to CSV file present in the FTP server.

So all set. Now we will configure the integration by putting activities inside the Orchestration.

Activity# 1: HTTP Receive Request:
Below you will find all the configuration details related to Receive Request activity.
Activity# 2: FTP Get File: 
This activity will fetch the CSV file from the FTP Server. The configuration of this activity is displayed below -

Activity# 3: Transform Read Flat File:
Activity# 4: Salesforce.com Create Objects:
In this activity we will create Salesforce records for the custom object Aiport__c based on the data from the previous activity. Below are the details of the configuration.
Activity# 5: Write XML:
Below are the configuration details for this step.
Activity# 6: HTTP Send Response:
This is the last activity and in this one, we will send the response back. Below are the configuration details
We are done. The final Orchestration looks like -

Test the Integration -
It's time to test the configuration. First we need to start the orchestration and we can do that from Orchestration | Start Orchestration.
Then let's call the HTTP post method as displayed below -
I have used a Chrome Extension named DHC for my testing. 
You can do HTTP POST by clicking on Tools | HTTP Post Utility.
Below is the response I am getting back -
In Salesforce also, records are created.

If you follow the steps mentioned earlier, you will be able to configure the integration very easily. Please let me know if you need any details. Thanks.


"Bulkify Your Code" - Another Example with Use Case

This post is the continuation of my previous post
"Bulkify Your Code" - Explanation of Salesforce' Governor Limit with Use Case

Use Case -
I have two custom objects (Airport__c and Country__c). Below screenshot will give you field details.
My requirement is to make sure when I am inserting an Airport record, I need to check whether the country mentioned in the record is already present in the Country object, if not, then create a new Country record with name same as mentioned in the Airport's Country field provided that Aiport is operational i.e. Operational__c == true.

Solution -
Initially it may look like the requirement is very easy to implement. But we need to keep in mind the Salesforce's Governor Limit.

If we go ahead with the approach of iterating over each new Airport record and then do a query against Country object to check whether that country is already there in the system, we will quickly hit Salesforce's Governor Limit - "Total number of SOQL Issued - 100 (Synchronized) and 200 (Asynchronized)".

So we need to make sure that our code is efficient. Below is the optimized trigger which can handle the requirement and at the same time will make sure that we will not hit by Governor limit.
trigger AirportTrigger on Airport__c (after insert) {
    List<Country__c> allCountries = new List<Country__c>();
    List<String> allCountryNames = new List<String>();
    //Fetch all Country Name and put it into a list - SOQL# 1
    for(Country__c aCountry : [SELECT ID, Name FROM COUNTRY__C]){
    //Iterate only those Airport records matching the requirement - SOQL# 2
    for(Airport__c anAirport : [SELECT ID, Country__c, Operational__c from AIRPORT__C where ID IN :Trigger.new 
                                    AND Country__c NOT IN :allCountryNames]){
            Country__c aCountry = new Country__c(
    //Do a bulk insert
    if(allCountries.size() > 0){

The above code is very much self-explanatory. Please let me know if you need any help. Thanks.

"Bulkify Your Code" - Explanation of Salesforce' Governor Limit with Use Case

Bulkify Your Code” – I am quite sure you have heard this phrase a lot, but do you really know what is the meaning of this phrase and why this one is so important?

This post is all about “Bulkify Your Code” where I will explain –
  • What is the meaning of this phrase?
  • Why this is so important?
  • Explain with Use Cases
So let’s start with What is the meaning of “Bulkify Your Code” –
If you want to combine repetitive tasks in your Apex classes/Triggers, you need to bulkify your code.
For example – if you are given a task to check whether a student’s score is greater than 80, you can’t write a code which can check score of single student. Rather your code should check score of n number of students.
So it means you need to repeat the same task of checking score for n number of students in your apex code and that is what called “Bulkify Your Code”

So now definitely the question that came to your mind – Why “Bulkify Your Code” is so important?
To explain the important, let me give you a real-life example. Say for example, you are staying in an apartment where along with your family, 100 other families are also staying. Each of these families (including your definitely) need water, right? To fulfil this requirement, what the owner will do is that he/she will install same size (I mean the same dimension) of pipes for each family to equally distribute the water.

Exactly the same concept applies for Salesforce. Salesforce’s in based on Multi-Tenant Architecture. So Salesforce needs to make sure that when you are running your piece of code, it should not hamper other’s piece of code (in terms of performance, availability of resources etc.) To explain in more details – Say Company A and Company B both are running their applications in Salesforce. Now at the particular time instance, Company A is running 1000 SOQL queries, whereas Company B is running only 5 queries. Definitely running 1000 queries will take more resources compared to 5 queries and as a result Company B will feel bad performance. Now Salesforce is a non-biased architecture (Yes, I use this term). So Salesforce will make sure Company A and Company B will get the same share. To achieve this Salesforce comes up with Governor Limit.

Governor Limit will make sure that as developer you are writing efficient and scalable code. Now why I love Salesforce a lot and why I call Salesforce a non-biased architecture, because even if you pay more to Salesforce, they will never increase the limit. The only workaround is to write efficient code. Superb. Salesforce rocks!!!!

Use Case:
I have the below two custom objects in my org with field details as per the below screenshot 
My requirement is that if an Airport record is having the Operational checkbox true, then create a country record where Country.Country Name = Airport.Country. Very simple right!!!
But this can lead to many problems.

So let's write the trigger for that first -
trigger AirportTrigger on Airport__c (after insert) {
    for(Airport__c anAirport : Trigger.new){
            Country__c aCountry = new Country__c(
            insert aCountry;

Very simple trigger. What the trigger is doing is simple iterating over Trigger.new (it is returning a list of Airport records that are getting inserted) and checking whether the Operational__c field is true or not. If true, then creating a new Country record with Country name same as airport's country name.

This trigger will work fine when you create a single airport record from Salesforce, because, in that case, Trigger.new will return you only 1 record and which will perform max 1 DML operation (when Operational__c is true). 

But the problem will occur when we will insert multiple airport records with import wizard. 

Now what I will do is that I will prepare a csv file with 1000 airport records in the below fashion.
Now if I try to import these 1000 airport records with import wizard, below is what I am getting -
Now when I checked the debug log, below is the error message I am getting -
Ok - got it!!. So we are getting the error "Too many DML statements". This is the Governor Limit set by Salesforce, which states as a developer you can execute at max 150 DML statements. But what we are doing is -

When we tried to import 1000 new airport records, Trigger.new did batch up mass insert upto 200 records at a time. Each of  these 200 records executed one new insert statement for Country object. So total number of DML operation becomes 200, which is beyond the Salesforce's Governor Limit (150 DML Operations). 

Now let's play more with Salesforce Governor Limit and change the import file like below -

As you can see here, I have changed Operational field alternatively. Now when I tried to import this file(File contains 1000 Airport records), below is what I am getting -
Success!! Do you know the reason for the success. Ok. Let me tell you. 

Trigger.new again did the batch up of mass insert upto 200 records at a timebut out of these 200 records, only 100 records were having Operational__c field set as true. So total number of DML operation were 100 which was within Salesforce's Governor Limit.

But still our code is not efficient as with this code, we can't insert 1000 records (our first csv files). So we have to make our code efficient and the way we can do that is -
trigger AirportTrigger on Airport__c (after insert) {
    List<Country__c> allCountries = new List<Country__c>();
    for(Airport__c anAirport : Trigger.new){
            Country__c aCountry = new Country__c(
    if(allCountries.size() > 0){
Now with the above code, when I tried to insert 1000 airport record with Operational__c field set to true for all, below is what I am getting -

Great!! So the code is now efficient and can handle any number of insert. The changes we did are as follows -

  • Created a list which will hold all the country records which need to be inserted into Salesforce org.
  • Finally if the size of the list is greater than 0, then execute Database.insert which will insert all the country records.
The advantage with this approach is that we are executing only 1 DML operation.

Hope this will help you to understand Salesforce's Governor Limit. Any question, please let me know. Thanks.

Please check my next post with another example - 
"Bulkify Your Code" - Another Example with Use Case

Use Case 1 - WebSphere Cast Iron Cloud Integration - HTTP Receive and Send

Preface - This post is part of "WebSphere Cast Iron Cloud Integration with Salesforce.com" series.

Today I will post how you can use WebSphere Cast Iron for a simple HTTP Receive and Send integration. Though this post is nothing to do with Integration with Salesforce.com, but still I would like to make this post so that you can understand how easy it is to configure WebSphere Cast Iron.

I will use Cast Iron Design Studio to do the configuration.

Step 1:
Create a project with name "HTML_2_HTML_Integration" and save it. Click on File | New | New Project [Local]..

Step 2:

You should see a screen like that once you click on the ok button.
Step 3:
Now drag and drop activity "Receive Request" from right hand side to the Orchestration. The screen should look like -
Step 4:
Now let's configure Receive Request -
  • Configure Pick Endpoint - Click on Pick EndPoint and then the New.. button to create a new EndPoint. The screen should look like - 
     Here you can choose the port number and UserName/Password for your HTTP connection. For the simplicity, I am just choosing the default values i.e. post 80 and no UserName/Password. 
  • Configure URL - Click on Configure and provide a name which will be appended after Hostname. I have given a name "HelloWorld". Choose POST as the HTTP method and check "Requires a Reply" at the button. It should look like -
  • Configure Map Outputs - This is the most important part. Here we will map the inputs from activity i.e. Receive Request to orchestration which will be used in the next step. We can do that by - clicking on copy, followed by select body and click on create button. At the end you should see a map like - 
     So now we have configures our first activity. Now it's time to configure our next activity i.e. Send Response.
Step 5:
Here we will configure another activity named "Send Response". The requirement is that whatever we will post in the first activity i.e. Receive Request as HTTP POST, the same thing should come here. So let's create this by dragging and dropping the activity Send Response after "Receive Request" activity. The screen should look like -
Step 6: 
Here we will configure Send Response activity. We need to configure map inputs so that information can go from Orchestration to activity. We can do that by clicking on Select Inputs and choose body. Then Map body from Orchestration to body from activity. The mapping should look like -

Step 7:
We are done. Save this project by File | Save Project [To Cloud]
Step 8:
It's time to test the configuration. First we need to start the orchestration and we can do that from Orchestration | Start Orchestration
Step 9:
Now we need to do HTTP POST by clicking on Tools | HTTP Post Utility. Here we need to post the URL appended with HelloWorld and also the message we need to post. The screenshot is given below -

Step 10: 
The moment you click on Submit, we should find the same message in the response like below -

As you can see, the message we submitted as request, the same message we received as response. So our Integration is successful and the best part is that we only did configuration for this Integration process.

In my next post, I will explain how we can configure WebSphere Cast Iron to integrate with Salesforce.com to fetch CSV file from FTP server and create data into Salesforce.

Please provide your feedback. Thanks.

Quick Introduction of WebSphere Cast Iron

Preface - This post is part of "WebSphere Cast Iron Cloud Integration with Salesforce.com" series.

What is WebSphere Cast Iron -
WebSphere Cast Iron provides customers a platform so that they can integrate cloud based applications from leading SaaS providers with on-premise applications. IBM acquired Cast Iron system in the year of 2010.

WebSphere Cast Iron Live is a multi-tenant, cloud based platform for Integration cloud application with other cloud applications/on-premise applications. 

WebSphere Cast Iron is available in three different packages -

  • In an appliance - WebSphere Cast Iron DataPower XH40 is a self-contained physical appliance.
  • In the mode of Virtual Machine - WebSphere Cast Iron Hypervisor Edition.
  • In cloud - WebSphere Cast Iron Live.

How to get access in WebSphere Cast Iron -
You can try WebSphere Cast Iron Live for 30 days without any cost. 

Cast Iron Solution Guides -
Please have a look at the below Solutions guides. 
Integrating Two Cloud Services with IBM WebSphere Cast Iron Live Redbook: 
Getting Started with IBM WebSphere Cast Iron Cloud Integration 

In my next post, I will start with first Use Case i.e. WebSphere Cast Iron Cloud Integration - HTTP Receive and Send.

I will really appreciate if you provide your feedback. Thanks.

Never miss a post. Subscribe to get latest blog posts, right into your email box.

* indicates required


Salesforce (105) Apex (52) admin (28) visualforce (21) ADM (20) dev 501 (19) lightning (19) integration (18) learn salesforce (18) 501 (16) javascript (14) SOAP (13) tutorial (11) Advanced Apex (10) Certification. (10) Kitchener Developer Group (8) Trigger (8) test class (8) Certification (7) flow (7) security (7) unit testing (7) Advanced Admin (6) Lightning Experience (6) SOQL (6) Sharing and Visibility (6) design pattern (6) developer (6) report (6) salesforce release (6) service cloud (6) trailhead (6) use case (6) Lightning Feature (5) New Features (5) css (5) dashboard (5) debug (5) formula (5) mobile (5) solution management (5) JSON (4) Kitchener User Group (4) Knowledge Management (4) Lightning Web Component (4) New Feature (4) Sales Cloud (4) Salesforce DX (4) Tips (4) WebSphere (4) best practice (4) cast iron (4) component (4) deployment (4) event (4) github (4) html (4) map (4) polymer (4) profiles (4) release (4) responsive (4) tdd (4) ui (4) visual studio code (4) Architect (3) Article (3) Live Chat (3) Online Event (3) Opportunity (3) Performance (3) Products (3) REST (3) Role (3) SOSL (3) Salesforce Certification (3) Scratch Org (3) Spring 20 (3) Study Notes. (3) Summer15 (3) VS Code (3) Web Technology (3) Winter21 (3) automation tool (3) configuration (3) dynamic apex (3) license (3) mapbox (3) singleton (3) version controlling (3) AppExchange (2) Asynchronous Apex (2) Asynchronous callout (2) Aura Framework (2) Bulkify (2) Community (2) Data Architecture and Management Certification (2) Devops (2) Distributed Version Controlling (2) ES6 (2) Eclipse (2) Einstein (2) Enhancement (2) Enterprise Territory Management (2) Financial Services Cloud (2) Force.com IDE (2) Governor Limit (2) Groups (2) IBM (2) Implicit Sharing (2) JourneyToCTA (2) LWC (2) Lightning Design System (2) Live Agent (2) Metadata (2) PD II (2) Price Book (2) Queueable (2) SFDX (2) Sharing (2) Spring 15 (2) Summer17 (2) Territory (2) Virtual Event (2) ant (2) basic (2) chatter (2) code coverage (2) coding (2) communication (2) console (2) controller (2) documentation (2) dreamforce (2) git (2) jquery (2) logging (2) object (2) permission (2) process builder (2) salesforce1 (2) strategy (2) visual workflow (2) xml (2) Action Plan (1) Action Plan Template (1) Activity Timeline (1) Advanced Currency (1) Agent Productivity (1) Analytics (1) Apex Sharing (1) Arrow (1) Batch (1) Bots (1) Browser (1) Bulk data load (1) CTA (1) Calendar (1) Canon (1) Case Management (1) Celebration (1) Cheat Sheet (1) Classic (1) Compare (1) Confetti (1) Constructor (1) Contact Center (1) Continuation (1) Continuous Integration (1) Convert (1) Cookie (1) CumulusCI (1) Custom Metadata (1) Custom Object (1) Custom Permission (1) Customer (1) Data Model (1) DataCategories (1) DataGrid (1) DataTable (1) Dated Exchange Rate (1) Decorator Design Pattern (1) Dev Hub (1) Development (1) Diwali (1) EDA (1) ESLint (1) Education Cloud (1) Email (1) FSC (1) Function (1) Future (1) Global Gathering (1) Goals (1) Guest Access (1) Guest Profile (1) Guest User Sharing Rule (1) Guide (1) HEDA (1) Higher Education (1) Household (1) Husky (1) IDE (1) Ideas (1) Improvement (1) Invocable (1) KPIs (1) Knowledge (1) Large Data Volume (1) LastModifiedDate (1) Lightning Knowledge (1) Manage Currencies (1) Manual Sharing (1) Metrics (1) Multi Currency (1) New (1) OOPS (1) OWD (1) Omni-Channel (1) Optimize (1) Partner (1) Permission Set (1) Person Account (1) Photo (1) Pipeline (1) Platform Developer I (1) Platform Developer II (1) Presentation (1) Prettier (1) Product Schedule (1) Profile (1) Promise (1) Prototype (1) Public Site (1) Query Plan (1) QuickReference (1) Related records (1) Reports (1) Retrieve (1) Role Hierarchy (1) SAL (1) Salesfor (1) Salesforce Advisor Link (1) Salesforce Labs (1) Salesforce Optimizer (1) SalesforceDx (1) Schedule (1) Session (1) Sharing Rule (1) Sharing Sets (1) Site (1) Skills (1) Snap-ins (1) Spring 17 (1) Summer14 (1) Summer16 (1) Summer19 (1) Switch (1) SystemModStamp (1) Tile (1) Timeline (1) Unauthorized Access (1) User License (1) Users (1) Validation Rule (1) Web (1) Webservice (1) Winter'15 (1) Winter'17 (1) access (1) actionFunction (1) actionPoller (1) actionRegion (1) actionSupport (1) agile (1) app (1) approval process (1) aura (1) awesome (1) backup (1) bitbucket (1) book (1) campaign (1) change set (1) cli (1) code (1) csv (1) custom button (1) custom settings (1) customization (1) data loader (1) database (1) delegate Admin (1) describe (1) dom (1) duplicate (1) dynamic (1) dynamic form (1) email template (1) email-to-case (1) equals (1) error (1) field-level security (1) folder (1) ftp (1) generic (1) gift (1) global describe (1) hashcode (1) import wizard (1) jenkins (1) keynote (1) long running requests (1) monitoring (1) mysql (1) page layout (1) personal (1) power of one (1) record type (1) relationship (1) request (1) review (1) solution (1) sub-tab (1) survey (1) tab (1) username (1) workflow (1)

Popular Posts

Total Pageviews

Contact Me


Email *

Message *