Monday, April 20, 2020

LWC Child to parent, grand parent communication with bubble event.

Create and Dispatch Events

Create and dispatch events in a component’s JavaScript class. To create an event, use the constructor. To dispatch an event, call the EventTarget.dispatchEvent() method.
The CustomEvent() the constructor has one required parameter, which is a string indicating the event type. As a component author, you name the event type when you create the event. You can use any string as your event type. However, we recommend that you confirm with the DOM event standard.

Communicate from child to grand parent.
Child.html
<template>
      <button onclick={updateparent} >Update Prnt and Grand Parent</button>
  
</template>

Child.js
import { LightningElement,apifrom 'lwc';

export default class Child extends LightningElement {

    @api recordData;

    updateparent(){
    this.dispatchEvent(new CustomEvent('updateme',
    {bubbles: true,composed: true,detail:"John"}

     ));
    }

  
}

parent.html
<template>

<my-child record-data={objdata}  onupdateme={prntfun}></my-child>
<
</template>

parent.js
import { LightningElementtrackfrom 'lwc';

export default class Prnt extends LightningElement {


@track objdata=[

{"firstname":"Mark""lastname":"Paul"
"Picture":"https://techcrunch.com/wp-content/uploads/2019/08/Screen-Shot-2019-08-29-at-3.02.46-PM.png?w=1390&crop=1"     },
{"firstname":"Jennie""lastname":"Paul",
 "Picture":"https://techcrunch.com/wp-content/uploads/2019/08/Screen-Shot-2019-08-29-at-3.02.46-PM.png?w=1390&crop=1"     }
];


prntfun(event){

    console.log("###evnt detail####"+event.detail)

   this.objdata[0].lastname=event.detail;



}
}

grandParent.html
<template>
   
   <my-prnt  onupdateme={gpfun}> ></my-prnt>
  
</template>

when you dispacth the event with bubbles:true and composed:true, you can use the same syntax as what you used in the parent component. Notice that onupdateme={gpfun}(Grand parent) and onupdateme={prntfun}(Parent) both are same in parent and grandparent.The only change is the function name, rest everything is same.
grandParent.js
import { LightningElementfrom 'lwc';

export default class Gp extends LightningElement {

    gpfun(){

  console.log("#####Grand parent is called$$$$$$$");

    }

}

Before clicking the button the output is as below.


Now after clicking "Update Prnt" , the Name of the Mark paul changes to Mark John, this updation is being done in the parent and passing back the data back to the child.

Even though we need not to use @track from the spring 20 release, there is one place that you need to use that is updating the fields of the objects. This example is the perfect suite of when you need to use @track. If you remove @track in the parent component child component will not reflect the name "John".
Below is the output which explains both child to parent and child to the grandparent. This approach will bubble up to the dom element until it reaches the first invocation of the dom hierarchy.


Notice Grand parent is called is basically coming from the grand parent. Initiation taking place from the child web component.
Thanks !


Slots in LWC

Add a slot to a component’s HTML file so a parent component can pass markup into the component. A component can have zero or more slots.
A slot is a placeholder for markup that a parent component passes into a component’s body. 
To define a slot in markup, use the <slot> tag, which has an optional name attribute.
Below analogy between aura components and web components would give a clear picture of slots.

In the aura component, you used facets and body attribute to received data in the component body and now we are using slots to get it done.
In the below code we placed the content in the body of a child but to see the output we need to specify {!v.body} in the markup or you need to use body attribute in the javascript and parse it and supply it to the markup.
Parent cmp: 
<aura:application >
    <!--no logic in any of the bundle files -->
    <c:childbody >
        Parent data 1..
    </c:childbody>
</aura:application>
childbody cmp:
<aura:component >
    <!--no logic in any of the bundle files -->
{!v.body}
</aura:component>
Below code explains Slots of web components.
Parent webcmp:
<template>
  <!-- I dont have any business logic in the javascript, so ignoring it-->

  <my-childslot>
   <p>From the parent, we are passing data </p>

   <span slot="f1">Parent span </span>

   <div slot="f2">Parent f2 span </div>
  </my-childslot>

</template>

childbody.html webcmp:
<template>

<slot></slot>

<b><slot name="f1">   </slot> </b>
<h1><slot name="f2">   </slot> </h1>

</template>

childbody.js webcmp
import { LightningElementtrackfrom 'lwc';

export default class Childslot extends LightningElement {
    renderedCallback(){
   // Below line will not work as span element is not there in its template
   // console.log("$$$span query selector$$$$"+this.template.querySelector('span').innerHTML);
    
   //Below code works by removing template.
   console.log("$$$span query selector$$$$"+this.querySelector('span').innerHTML);

    }

}

The output of web component as follows:
To access the elements passed into the childbody, you need to use syntax as below. Note you should not use this.template while accessing the elements passed via slot.
this.querySelector('anyelement')

Service components, Arrow functions,map,reduce,find,filter,promises with simple code.

This example is to explain some of the essentials of Javascript in the LWC. Once you run it, you will get a more clear understanding of it. Primarily I thought of explaining Service components(helper in aura), Arrow functions , map, reduce, find, filter, promises with a basic calculator app.

Step 1: Create a Folder with the name calci and followed by calci.html,calci.js,calci.css.





Step 2: Create a file with math.js under the same folder.

The Below code is self-explanatory: converted the traditional Javascript to arrow functions. 

/*
equivalent traditonal javascript  code
export let add=function(x,y) {return x+y;}
export let sub=function(x,y) {return x-y;}
export let div=function(x,y) {return x%y;}
export let mul=function(x,y) {return x*y;} */

/*Converted to Arrow functions */

export let add=(x,y=> x+y;

export let sub=(x,y=> x-y;

export let div=(x,y=> x%y;

export let mul=(x,y=> x*y;


Step 3: copy below code in calci.html markup

<template>

First Number : <input onchange={handler} name="fn" /> <br/>

Second Number : <input onchange={handler} name="sn" /> <br/>

{finalnumber} <br/>


<div class="btn-group">
    <button onclick={add}>Add</button>
    <button onclick={sub}>Sub</button>
    <button onclick={mul}>Mul</button>
    <button onclick={div}>Div</button>
  </div>

  <br/>

  <div class="btn-group">
    <button onclick={find}>Find</button>
    <button onclick={filter}>Filter</button>
    <button onclick={map}>Map</button>
    <button onclick={reduce}>Reduce</button>
    <button onclick={promise}>Promise</button>
  </div>


</template>

Step 4: copy below code in  calci.js 

import { LightningElement } from 'lwc';
import { add,sub,mul,div } from './math';

export default class Calci extends LightningElement {

  fn;
  sn;
  finalnumber;

  arry=[];

    handler(event){
        let nam=event.target.name;
        if(nam==="fn"){
            this.fn=event.target.value
        }
            else if(nam==="sn"){
                this.sn=event.target.value;
            }
 }

    add(){
    let x=`Additon of two numbers (${this.fn} nd ${this.sn}) is :`;
    this.finalnumber='';
    this.finalnumber=add(parseInt(this.fn),parseInt(this.sn));

    this.arry.push(this.finalnumber);

    this.finalnumber=x+this.finalnumber;

    console.log("####this.arry######"+this.arry);

    }

    sub(){ 
        let x=`Sub of two numbers (${this.fn} nd ${this.sn}) is :`;
        this.finalnumber='';
        this.finalnumber=sub(parseInt(this.fn),parseInt(this.sn));
    
        this.arry.push(this.finalnumber);
    
        this.finalnumber=x+this.finalnumber;
    
        console.log("####this.arry######"+this.arry);
    
    
        }

     mul(){
        let x=`Mul of two numbers (${this.fn} nd ${this.sn}) is :`;
        this.finalnumber='';
        this.finalnumber=mul(parseInt(this.fn),parseInt(this.sn));
    
        this.arry.push(this.finalnumber);
    
        this.finalnumber=x+this.finalnumber;
    
        console.log("####this.arry######"+this.arry);
    

     }   

     div(){

        let x=`Div of two numbers (${this.fn} nd ${this.sn}) is :`;
        this.finalnumber='';
        this.finalnumber=div(parseInt(this.fn),parseInt(this.sn));
    
        this.arry.push(this.finalnumber);
    
        this.finalnumber=x+this.finalnumber;
    
        console.log("####this.arry######"+this.arry);
    

     }

     find(){
        console.log("####this.arry######"+this.arry);

        if(this.arry){let elment=this.arry.find(result=>result>200);

        console.log("####elment from find function######"+elment);
        console.log("####elment typeof######"+typeof elment);

     }

     filter(){

        if(this.arry){let elment=this.arry.filter(result=>result>200);console.log("####elment from filter function######"+elment);
            console.log("####elment typeof######"+typeof elment);}
    
     }

     map(){
        if(this.arry){let elment=this.arry.map(result=>result*10);
    
            console.log("####elment from Map function######"+elment);
            console.log("####elment typeof######"+typeof elment);
    
            }}

     reduce(){

        if(this.arry){ let elment=this.arry.reduce((total,result)=>total+result);
    
            console.log("####elment from Reduce function######"+elment);
            console.log("####elment typeof######"+typeof elment);
    }

     promise(){
        const URL = 'https://th-apex-http-callout.herokuapp.com/animals';
        const getSessions = () => fetch(URL,{
            mode: 'no-cors' // 'cors' by default
          })
        .then(response => {
          if (!response.ok) {
            throw new Error('No response from server');
          }
          return response.json();
        })
        .then(result => {
          let sessions = result.data;
          return sessions;
        }).catch(err=>err
            
            
            
            );
    
        console.log("Promise explained: Data from server #########: "+JSON.stringify(getSessions()));
    
     }

}

Step 5:copy below code in calci.css

.btn-group button {
    background-color#4CAF50/* Green background */
    border1px solid green/* Green border */
    colorwhite/* White text */
    padding10px 24px/* Some padding */
    cursorpointer/* Pointer/hand icon */
    floatleft/* Float the buttons side by side */
  }
  
  .btn-group button:not(:last-child) {
    border-rightnone/* Prevent double borders */
  }
  
  /* Clear floats (clearfix hack) */
  .btn-group:after {
    content"";
    clearboth;
    displaytable;
  }
  
  /* Add a background color on hover */
  .btn-group button:hover {
    background-color#3e8e41;
  }

And finally, place calci component in any of the container like aura application or in localhost. The output of the code looks as below.




Click on Add, sub, Mul and Div for basic arithmetic operations. Results of these operations stored in the array(arry) and on these array elements we performed map,find, filter and reduce functions(check in the browser console for the results) to explain how these important functions works.

Thanks

Monday, April 13, 2020

Push lwc to Heroku and local host

Download your Java JDK:

Since oracle is asking to signup to download the JDK, you may use the below website to download JDK without signup.

https://www.malavida.com/en/soft/java-jdk/download

Set your JAVA_HOME and Path.

JAVA_HOME: your JDK path (my java home path looks like this: C:\Program Files\Java\jdk1.8.0_231)

Path :you Bin path (my java path looks like this: C:\Program Files\Java\jdk1.8.0_231\bin)

Testing: use Java -version from the command prompt whether this setting works or not. If everything works, you will get java version, otherwise you will get "java is not recognized as ....."

>> Download your Salesforce CLI and execute the .exe file

https://developer.salesforce.com/tools/sfdxcli

Testing: From the command prompt type "SFDX". If it is properly installed, you will get some sfdx commands, otherwise you will get "sfdx is not recognized as ....."

>> Download your Visual studio code from the below link and then execute the .exe file

https://code.visualstudio.com/

>> Now add the extensions whichever necessary.


How to connect to the Salesforce org: 

>> From the visual studio, select proper folder where you want to store all the project related components.

>> Now, press ctrl+shift+p and select SFDX:create project with manifest and then select standard project template ( this step will not really connect to salesforce org but below step connects)

>> Now, press ctrl+shift+p and select SFDX: authorize an org (select login.salesforce.com or test.salesforce.com or custom domain, it depends on which instance you

are connecting)

>>Now right click on lwc(it can be any component like class, aura component pages... so on)

>> provide the webcomponent name and select folder and then hit enter.

>> Now your webcomponets files are availble under the folder in the format of .html, .js and meta xml

>>Right click once you develop your component and deploy it.


LWC open source:

Go to  : https://lwc.dev/

=> Download node Js from the below link and execute it:

https://nodejs.org/en/

=> Now go to command prompt follow below steps.

To install Lightning Web Components and the Lightning Web Components CLI, use the open source create-lwc-app tool.

Step 1: npx create-lwc-app my-app   ( here my-app can be any name. If you change it as per your needs, ensure to point the below cmd to the right folder
        which you have created)

Note: if the node js in not installed, it will throw an error like "npx is not recognised as internal command..........".

Step 2: cd my-app (to move to the current folder which you have created in the step 1)

Step 3: npm run watch (to start your local server)


As a final step, now go to the local host from any browser: http://localhost:3001


Push the same code to the Heroku cloud:

Signup for the Heroku account for free from the below link:

https://signup.heroku.com

=> Install "GIT" prior to installing Heroku cli, use the below link for the same.

https://git-scm.com/download/win

Testing: from command prompt type git, if it is installed properly, you will get proper commands.

=> Install Heroku cli from below website:

https://devcenter.heroku.com/articles/heroku-cli

Testing: from command prompt type "Heroku",  if it is installed properly, you will get proper commands.

Create a Procfile with web: npm run serve and place the file under root folder of where you created your opensource(my-app) folder.

heroku login

git init (initializes git if it is not initialized)

git add .
git commit -m "Intial Commit"
git push heroku master
heroku open

Note: To connect to specific existing app you can use cmd heroku git:remote -a lwconcloud


TIP: In case if you encounter any challenges to connect to heroku from your local code.

you can download below git stuff from the given link and push to the heroku. You can change the folder structure as per your needs.

https://github.com/Tdssaini/lwc-open-source-with-heroku

>> now go to the app which you have in Heroku and try to check the output.

Wednesday, February 19, 2020

Governor Limits Using Workbench

  • Login to Workbench.
  • On the Jump to picklist select "REST Explorer"
  • Click "Select"
  • From the options presented select: /services/data/v47.0/limits. (change to your latest version)
  • Click "Execute"
Open the required governor limits folder that you want to check.

Sunday, February 2, 2020

Rest API Salesforce Java Integration

>>Add below Jars in the eclipse to the project. You can download them from the maven repository.

httpclient-4.2.1.jar

httpcore-4.2.1.jar

json-20090211.jar

commons-logging-1.1.1.jar

>> Run below code to get the access token and perform further operations.
===============================================

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.UnsupportedEncodingException;

import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicHeader;
import org.apache.http.util.EntityUtils;

import org.json.JSONException;
import org.json.JSONObject;

/**
 * This program demonstrates the following basic use cases for the REST API:
 * - authentication with OAuth 2.0 (This is for development purposes only. Not a real implementation.)
 * - querying (using account records)
 * - inserting (using a contact record related to one of the retrieved account records)
 * - updating (updates contact record added in previous step)
 *
 * @author salesforce training
 */
public class RESTApp extends Object {


//---------REST and OAuth-------
//Portions of the URI for REST access that are re-used throughout the code
private static String OAUTH_ENDPOINT = "/services/oauth2/token";
private static String REST_ENDPOINT = "/services/data";

//Basic header information added to each HTTP object that is used
//to invoke the REST API.
private static Header prettyPrintHeader = new BasicHeader("X-PrettyPrint", "1");

//================Code starts here===================
public static void main(String[] args) {
new RESTApp();
}

/**
* Constructor drives console interaction and calls appropriate methods.
*/
public RESTApp() {
RestConnectionHelper restConn = this.oauth2Login();
if (restConn.baseUri!= null) {
//Retrieved accountId that is used when contact is added.
String accountId = this.queryAccount(restConn);
if (accountId != null) {
//Id of inserted contact. Used to update contact.
String contactId = this.insertContact(restConn,accountId);
if (contactId != null) {
this.updateContact(restConn, contactId);
}  else {
System.out.println("Contact not found.");
}
} else {
System.out.println("Account not found.");
}
}
}

/**
* This method connects the program to the Salesforce organization using OAuth.
* It stores returned values for further access to organization.
* @param userCredentials Contains all credentials necessary for login
* @return
*/
public RestConnectionHelper oauth2Login() {
System.out.println("_______________ Login _______________");
OAuth2Response oauth2Response = null;
HttpResponse response = null;
UserCredentials userCredentials = new UserCredentials();
RestConnectionHelper restConn = new RestConnectionHelper();
String loginHostUri = "https://" +
userCredentials.loginInstanceDomain + OAUTH_ENDPOINT;

try {
//Construct the objects for making the request
HttpClient httpClient = new DefaultHttpClient();
// If you are behind a proxy server, uncomment
// the next line of code after supplying values for your proxy server
// httpClient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, new HttpHost("myProxy.domain.com", 8088 /*this may need to change as well*/, "http"));
HttpPost httpPost = new HttpPost(loginHostUri);
StringBuffer requestBodyText =
new StringBuffer("grant_type=password");
requestBodyText.append("&username=");
requestBodyText.append(userCredentials.userName);
requestBodyText.append("&password=");
requestBodyText.append(userCredentials.password);
requestBodyText.append("&client_id=");
requestBodyText.append(userCredentials.consumerKey);
requestBodyText.append("&client_secret=");
requestBodyText.append(userCredentials.consumerSecret);
StringEntity requestBody =
new StringEntity(requestBodyText.toString());
requestBody.setContentType("application/x-www-form-urlencoded");
httpPost.setEntity(requestBody);
httpPost.addHeader(prettyPrintHeader);
System.out.println("body is " + requestBodyText);
//Make the request and store the result
response = httpClient.execute(httpPost);

//Parse the result if we were able to connect.
if (  response.getStatusLine().getStatusCode() == 200 ) {
String response_string = EntityUtils.toString(response.getEntity());
try {
JSONObject json = new JSONObject(response_string);
oauth2Response = new OAuth2Response(json);
System.out.println("JSON returned by response: +\n" + json.toString(1));
} catch (JSONException je) {
je.printStackTrace();
}
restConn.baseUri = oauth2Response.instance_url + REST_ENDPOINT
+ "/v" + userCredentials.apiVersion +".0";
restConn.oauthHeader = new BasicHeader("Authorization", "OAuth " +
oauth2Response.access_token);
System.out.println("\nSuccessfully logged in to instance: "
+ restConn.baseUri);
} else {
System.out.println("An error has occured. Http status: " + response.getStatusLine().getStatusCode());
System.out.println(getBody(response.getEntity().getContent()));
System.exit(-1);
}
} catch (UnsupportedEncodingException uee) {
uee.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
} catch (NullPointerException npe) {
npe.printStackTrace();
}
return restConn;
}

/**
* This method demonstrates
* - How to use HTTPGet and a constructed URI to retrieve data from Salesforce.
* - Simple parsing of a JSON object.
*/
public String queryAccount(RestConnectionHelper restConn) {
System.out.println("\n_______________ Account QUERY _______________");
String accountId = null;
try {
//Set up the HTTP objects needed to make the request.
HttpClient httpClient = new DefaultHttpClient();
/********************************************************
* TODO:
* Set the value of uri on the line below to the baseURI concatenated
* with the query parameter and the query string.
********************************************************/
String uri = restConn.baseUri + "/query?q=SELECT+id+,+name+FROM+Account+limit+2";
System.out.println("Query URL: " + uri);
HttpGet httpGet = new HttpGet(uri);
httpGet.addHeader(restConn.oauthHeader);
httpGet.addHeader(prettyPrintHeader);

// Make the request.
HttpResponse response = httpClient.execute(httpGet);

// Process the result
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == 200) {
String response_string = EntityUtils.toString(response.getEntity());
try {
JSONObject json = new JSONObject(response_string);
System.out.println("JSON result of Query:\n" + json.toString(1));

/********************************************************
* TODO:
* Add an assignment statement the line below
* to store the account id of the first object returned to
* use later when creating the Contact record.
********************************************************/
accountId = json.getJSONArray("records").getJSONObject(0).getString("Id");
System.out.println("accountId value is " + accountId);
} catch (JSONException je) {
je.printStackTrace();

}
} else {
System.out.println("Query was unsuccessful. Status code returned is " + statusCode);
}
} catch (IOException ioe) {
ioe.printStackTrace();
} catch (NullPointerException npe) {
npe.printStackTrace();
}
return accountId;
}

/**
* This method demonstrates
* - How to use HTTPPost and a constructed URI to insert data into Salesforce.
* - Simple creation of a JSON object.
*/
public String insertContact(RestConnectionHelper restConn, String accountId) {
System.out.println("\n_______________ Contact INSERT _______________");
String contactId = null;
/********************************************************
* TODO:
* On the line below add code to the URI
* to indicate the type of object that will be inserted into the database
********************************************************/
String uri = restConn.baseUri + "/sobjects/Contact/";
try {
//create the JSON object containing the new contact details.
JSONObject contact = new JSONObject();
contact.put("LastName", "Chin");
contact.put("FirstName", "Jasmine");
contact.put("MobilePhone", "(415)222-3333");
contact.put("Phone", "(650)123-3211");

/********************************************************
* TODO:
* On the line below add the key value pair for the accountId
* to the JSON contact data.
********************************************************/
contact.put("AccountId", accountId);
System.out.println("JSON for contact record to be inserted:\n" + contact.toString(1));

//Construct the objects needed for the request
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(uri);
httpPost.addHeader(restConn.oauthHeader);
httpPost.addHeader(prettyPrintHeader);
// The message we are going to post
StringEntity body = new StringEntity(contact.toString(1));
body.setContentType("application/json");
httpPost.setEntity(body);

//Make the request
HttpResponse response = httpClient.execute(httpPost);

//Process the results
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == 201) {
String response_string = EntityUtils.toString(response.getEntity());
JSONObject json = new JSONObject(response_string);
// Store the retrieved contact id to use when we update the contact.
contactId = json.getString("id");
System.out.println("New contact id from response: " + contactId);
} else {
System.out.println("Insertion unsuccessful. Status code returned is " + statusCode);
}
} catch (JSONException e) {
System.out.println("Issue creating JSON or processing results");
e.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
} catch (NullPointerException npe) {
npe.printStackTrace();
}
return contactId;
}

/**
* This method demonstrates
* - How to use HTTPPatch and a constructed URI to update data in Salesforce.
* NOTE: You have to create the HTTPPatch, as it does not exist in the standard library.
* - Simple creation of a JSON object.
*/
public void updateContact(RestConnectionHelper restConn, String contactid) {
System.out.println("\n_______________ Contact UPDATE _______________");

//Notice, the id for the record to update is part of the URI, not part of the JSON
String uri = restConn.baseUri + "/sobjects/Contact/" + contactid;
try {
//Create the JSON object containing the updated contact phone number
//and the id of the contact we are updating.
JSONObject contact = new JSONObject();
contact.put("Phone", "(415)555-1234");
System.out.println("JSON for update of contact record:\n" + contact.toString(1));

//Set up the objects necessary to make the request.
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPatch httpPatch = new HttpPatch(uri);
httpPatch.addHeader(restConn.oauthHeader);
httpPatch.addHeader(prettyPrintHeader);
StringEntity body = new StringEntity(contact.toString(1));
body.setContentType("application/json");
httpPatch.setEntity(body);

//Make the request
HttpResponse response = httpClient.execute(httpPatch);

//Process the response
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == 204) {
System.out.println("Updated the contact successfully.");
} else {
System.out.println("Contact update NOT successfully. Status code is " + statusCode);
}
} catch (JSONException e) {
System.out.println("Issue creating JSON or processing results");
e.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
} catch (NullPointerException npe) {
npe.printStackTrace();
}
}

/**
* Extend the Apache HttpPost method to implement an HttpPost
* method.
*/
private static class HttpPatch extends HttpPost {
public HttpPatch(String uri) {
super(uri);
}

public String getMethod() {
return "PATCH";
}
}

/**
* This class is used to hold values returned by the OAuth request.
*/
static class OAuth2Response {
String id;
String issued_at;
String instance_url;
String signature;
String access_token;

public OAuth2Response() {
}
public OAuth2Response(JSONObject json) {
try {
id =json.getString("id");
issued_at = json.getString("issued_at");
instance_url = json.getString("instance_url");
signature = json.getString("signature");
access_token = json.getString("access_token");

} catch (JSONException e) {
e.printStackTrace();
}
}
}

/**
* This class holds all the values related to the credentials needed to
* make the OAuth2 request for authentication. Normally they would not be set in
* this manner.
*/
class UserCredentials {
String loginInstanceDomain = "light601dep-dev-ed.my.salesforce.com";
String apiVersion = "47";
//---------Credentials----------
//Credentials providing access to a specific Salesforce organization.
/********************************************************
* TODO:
* 1. Enter Salesforce login userName
* 2. Enter Salesforce login password
* 3. Enter consumerKey
* 4. Enter consumerSecret
********************************************************/
String userName = "David@lightning601.com";
String password = "xxxxxxxxxG841Lq4OPaBc3nvtMcGmhC5GH";
String consumerKey = "3MVG9G9pzCUSkzZvyptQFNKyeFZLuFEuMqSNrj_gLpwyqgHTmUSLK0qb0EvWiNm6VYzLixRXeULtJZlm3LevO";
String consumerSecret = "32B4AFDB1FD3E9B8FD62FD2333ACC9B33A65778C35634F8D618745746A2A6C86";
String grantType = "password";
}

/**
* This class holds information gained from login that are used in subsequent calls.
*/
class RestConnectionHelper {
//Holds URI returned from OAuth call, which is then used throughout the code.
String baseUri;

//The oauthHeader set in the oauth2Login method, and then added to
//each HTTP object that is used to invoke the REST API.
Header oauthHeader;

}

//==========utility methods=============
/**
* Utility method for changing a stream into a String.
* @param inputStream
* @return
*/
private String getBody(InputStream inputStream) {
String result = "";
try {
BufferedReader in = new BufferedReader(
new InputStreamReader(inputStream)
);
String inputLine;
while ( (inputLine = in.readLine() ) != null ) {
result += inputLine;
result += "\n";
}
in.close();
} catch (IOException ioe) {
ioe.printStackTrace();
}
return result;
}
}

===================================================================