== Twitter Salesforce Example

=== Introduction

This example listen for tweets which are mentioning the `+@cameltweet+`
twitter account. Information from the user whom mentions is then created
as a contact in Salesforce.

=== Configuring Twitter

This example is already configured using a testing purpose twitter
account named `cameltweet'. And therefore the example is ready to run
out of the box.

This account is only for testing purpose, and should not be used in your
custom applications. For that you need to setup and use your own twitter
account.

=== Configuring Salesforce

This example uses Camels own test Salesforce developer account, you
would most likely want to sign up with your own Developer account at
https://developer.salesforce.com/. After you have done that, you’ll need
to create a Connected Application for your integration.

To do this after logging in to your Salesforce Developer account,
navigate to _Apps_ located under _Build_ and then _Create_, there you
should see _Connected Apps_ table in the heading click on _New_ and fill
in the indicated required fields and enable the _OAuth Settings_, for
_Callback URL_ you can use
https://login.salesforce.com/services/oauth2/success.

In the _Available OAuth Scopes_ add _Access and manage your data (api)_
and _Perform requests on your behalf at any time (refresh_token,
offline_access)_.

After clicking _Save_ click on _Manage_ on the top of the page and then
click on _Edit Policies_. Change the _IP Relaxation_ to _Relax IP
restrictions_ and click on _Save_.

*NOTE:* This will get you started quicker, but production you should
re-evaluate to comply with your security needs.

Next gather your _Consumer Key_ (_clientId_ property), _Consumer Secret_
(clientSecret) and either use username and password of the developer
account; or get the refresh token from Salesforce (more on this below).

==== Adding the Twitter screen name custom field

The example adds a custom field to _Contact_ SObject, to add it to your
Salesforce environment go into _Customize_ under _Build_ and choose
_Fields_ under _Contact_.

In _Contact Custom Fields & Relationships_ click on _New_ and add a
field of type `+Text+` with field label `+Twitter Screen Name+`, length
of 15 and for uniqueness select _Do not allow duplicate values_ and set
the _Set this field as the unique record identifier from an external
system_.

==== Getting the OAuth refresh token

In your browser go to the URL change the `+__YOUR_CLIENT_ID_HERE__+`
with your connected application _Consumer Key_:

`+https://login.salesforce.com/services/oauth2/authorize?response_type=token&client_id=+`**YOUR_CLIENT_ID_HERE**`+&redirect_uri=https://login.salesforce.com/services/oauth2/success&display=touch+`

Allow access to the application, and you’ll end up on a page with
`+refresh_token+` after the `+#+`, something like:

`+https://login.salesforce.com/services/oauth2/success#access_token=..&refresh_token=+`**<refresh_token>**`+&instance_url=...&issued_at=...&signature=...&scope=...&token_type=Bearer+`

==== How to generate Salesforce Data Transfer Objects (DTOs)

The best way to generate Java representation of Salesforce SObjects is
to use the `+camel-salesforce-maven-plugin+` and specify the desired DTO in <configuration> section, for example:

....
        <configuration>
            <clientId>${camelSalesforce.clientId}</clientId>
            <clientSecret>${camelSalesforce.clientSecret}</clientSecret>
            <userName>${camelSalesforce.userName}</userName>
            <password>${camelSalesforce.password}</password>
            <includes>
                <include>Contact</include>
            </includes>
        </configuration>
....

To generate only DTOs needed for Contact, but the parameter value can be
specified using regular expressions.

=== Build

You will need to compile this example first:

....
mvn compile
....

=== Run

To run the example type using _generate.dto_ profile

....
mvn -DcamelSalesforce.clientId=3<client id> \
    -DcamelSalesforce.clientSecret=<client secret> \
    -DcamelSalesforce.userName=<username> \
    -DcamelSalesforce.password=<password> -Dgenerate.dto spring-boot:run
....

To stop the example hit ctrl+c

=== Help and contributions

If you hit any problem using Camel or have some feedback, then please
https://camel.apache.org/support.html[let us know].

We also love contributors, so
https://camel.apache.org/contributing.html[get involved] :-)

The Camel riders!
