/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package gobblin.salesforce;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.message.BasicNameValuePair;
import com.google.common.collect.Lists;
import gobblin.configuration.ConfigurationKeys;
import gobblin.configuration.State;
import gobblin.password.PasswordManager;
import gobblin.source.extractor.exception.RestApiConnectionException;
import gobblin.source.extractor.extract.restapi.RestApiConnector;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
/**
* An extension of {@link RestApiConnector} for Salesforce API.
*/
@Slf4j
public class SalesforceConnector extends RestApiConnector {
private static final String DEFAULT_SERVICES_DATA_PATH = "/services/data";
private static final String DEFAULT_AUTH_TOKEN_PATH = "/services/oauth2/token";
public SalesforceConnector(State state) {
super(state);
}
@Getter
private String servicesDataEnvPath;
@Override
public HttpEntity getAuthentication() throws RestApiConnectionException {
log.debug("Authenticating salesforce");
String clientId = this.state.getProp(ConfigurationKeys.SOURCE_CONN_CLIENT_ID);
String clientSecret = this.state.getProp(ConfigurationKeys.SOURCE_CONN_CLIENT_SECRET);
String userName = this.state.getProp(ConfigurationKeys.SOURCE_CONN_USERNAME);
String password = PasswordManager.getInstance(this.state)
.readPassword(this.state.getProp(ConfigurationKeys.SOURCE_CONN_PASSWORD));
String securityToken = this.state.getProp(ConfigurationKeys.SOURCE_CONN_SECURITY_TOKEN);
String host = this.state.getProp(ConfigurationKeys.SOURCE_CONN_HOST_NAME);
List<NameValuePair> formParams = Lists.newArrayList();
formParams.add(new BasicNameValuePair("grant_type", "password"));
formParams.add(new BasicNameValuePair("client_id", clientId));
formParams.add(new BasicNameValuePair("client_secret", clientSecret));
formParams.add(new BasicNameValuePair("username", userName));
formParams.add(new BasicNameValuePair("password", password + securityToken));
try {
HttpPost post = new HttpPost(host + DEFAULT_AUTH_TOKEN_PATH);
post.setEntity(new UrlEncodedFormEntity(formParams));
HttpResponse httpResponse = getHttpClient().execute(post);
HttpEntity httpEntity = httpResponse.getEntity();
return httpEntity;
} catch (Exception e) {
throw new RestApiConnectionException("Failed to authenticate salesforce using user:" + userName + " and host:"
+ host + "; error-" + e.getMessage(), e);
}
}
private String getServiceBaseUrl() {
String dataEnvPath = DEFAULT_SERVICES_DATA_PATH + "/v" + this.state.getProp(ConfigurationKeys.SOURCE_CONN_VERSION);
this.servicesDataEnvPath = dataEnvPath;
return this.instanceUrl + dataEnvPath;
}
public String getFullUri(String resourcePath) {
return StringUtils.removeEnd(getServiceBaseUrl(), "/") + StringUtils.removeEnd(resourcePath, "/");
}
}