// Path: src/main/java/org/springframework/social/salesforce/api/Salesforce.java
// public interface Salesforce extends ApiBinding {
// 
//     public ApiOperations apiOperations();
// 
//     public ApiOperations apiOperations(String instanceUrl);
// 
//     public ChatterOperations chatterOperations();
// 
//     public ChatterOperations chatterOperations(String instanceUrl);
// 
//     public QueryOperations queryOperations();
// 
//     public QueryOperations queryOperations(String instanceUrl);
// 
//     public RecentOperations recentOperations();
// 
//     public RecentOperations recentOperations(String instanceUrl);
// 
//     public SearchOperations searchOperations();
// 
//     public SearchOperations searchOperations(String instanceUrl);
// 
//     public SObjectOperations sObjectsOperations();
// 
//     public SObjectOperations sObjectsOperations(String instanceUrl);
// 
//     public UserOperations userOperations();
// 
//     public UserOperations userOperations(String gatewayUrl);
// 
//     public LimitsOperations limitsOperations();
// 
//     public LimitsOperations limitsOperations(String instanceUrl);
// 
//     public <T> List<T> readList(JsonNode jsonNode, Class<T> type);
// 
//     public <T> T readObject(JsonNode jsonNode, Class<T> type);
// 
//     public String getBaseUrl();
// 
//     public String getInstanceUrl();
// 
//     public void setInstanceUrl(String instanceUrl);
// 
//     public String getUserInfoUrl();
// 
//     public String getAuthGatewayUrl();
// 
//     public void setAuthGatewayBaseUrl(String gatewayUrl);
// 
//     public ConnectOperations connectOperations();
// 
//     public ConnectOperations connectOperations(String instanceUrl);
//     
//     public CustomApiOperations customApiOperations();
// 
//     public CustomApiOperations customApiOperations(String instanceUrl);
// }
// 
// Path: src/main/java/org/springframework/social/salesforce/connect/SalesforceServiceProvider.java
// public class SalesforceServiceProvider extends AbstractOAuth2ServiceProvider<Salesforce> {
//     
//     //Provider ID
//     public final static String ID = "salesforce";
//     
//     public final static String PRODUCTION_GATEWAY_URL = "https://login.salesforce.com";
//     public final static String SANDBOX_GATEWAY_URL    = "https://test.salesforce.com";
//     
//     public final static String TOKEN_PATH      = "/services/oauth2/token";
//     public final static String AUTHORIZE_PATH  = "/services/oauth2/authorize";
// 
//     public SalesforceServiceProvider(String clientId, String clientSecret) {
//         this(clientId, clientSecret,
//                 PRODUCTION_GATEWAY_URL + AUTHORIZE_PATH,
//                 PRODUCTION_GATEWAY_URL + TOKEN_PATH);
//     }
//     
//     public SalesforceServiceProvider(String clientId, String clientSecret, boolean sandbox)
//     {
//         super(new SalesforceOAuth2Template(clientId, clientSecret, (sandbox ? SANDBOX_GATEWAY_URL : PRODUCTION_GATEWAY_URL) + AUTHORIZE_PATH, (sandbox ? SANDBOX_GATEWAY_URL : PRODUCTION_GATEWAY_URL) + TOKEN_PATH));
//     }
// 
//     public SalesforceServiceProvider(String clientId, String clientSecret, String authorizeUrl, String tokenUrl) {
//         super(new SalesforceOAuth2Template(clientId, clientSecret, authorizeUrl, tokenUrl));
//     }
// 
// 
//     public Salesforce getApi(String accessToken) {
//         SalesforceTemplate template = new SalesforceTemplate(accessToken);
// 
//         // gets the returned instance url and sets to Salesforce template as base url.
//         String instanceUrl = ((SalesforceOAuth2Template) getOAuthOperations()).getInstanceUrl();
//         if (instanceUrl != null) {
//             template.setInstanceUrl(instanceUrl);
//         }
// 
//         return template;
//     }
// 
// }


import org.springframework.social.ApiBinding;
import org.springframework.social.MissingAuthorizationException;
import org.springframework.social.salesforce.api.Salesforce;
import org.springframework.social.salesforce.connect.SalesforceServiceProvider;
/**
 * Copyright (C) 2017 https://github.com/jottley/spring-social-salesforce
 *
 * Licensed 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 org.springframework.social.salesforce.api.impl;


/**
 * @author Umut Utkan
 * @author Jared Ottley
 */
public class AbstractSalesForceOperations<T extends ApiBinding> {

    protected T api;


    public AbstractSalesForceOperations(T api) {
        this.api = api;
    }

    protected void requireAuthorization() {
        if (!api.isAuthorized()) {
// Path: src/main/java/org/springframework/social/salesforce/api/Salesforce.java
// public interface Salesforce extends ApiBinding {
// 
//     public ApiOperations apiOperations();
// 
//     public ApiOperations apiOperations(String instanceUrl);
// 
//     public ChatterOperations chatterOperations();
// 
//     public ChatterOperations chatterOperations(String instanceUrl);
// 
//     public QueryOperations queryOperations();
// 
//     public QueryOperations queryOperations(String instanceUrl);
// 
//     public RecentOperations recentOperations();
// 
//     public RecentOperations recentOperations(String instanceUrl);
// 
//     public SearchOperations searchOperations();
// 
//     public SearchOperations searchOperations(String instanceUrl);
// 
//     public SObjectOperations sObjectsOperations();
// 
//     public SObjectOperations sObjectsOperations(String instanceUrl);
// 
//     public UserOperations userOperations();
// 
//     public UserOperations userOperations(String gatewayUrl);
// 
//     public LimitsOperations limitsOperations();
// 
//     public LimitsOperations limitsOperations(String instanceUrl);
// 
//     public <T> List<T> readList(JsonNode jsonNode, Class<T> type);
// 
//     public <T> T readObject(JsonNode jsonNode, Class<T> type);
// 
//     public String getBaseUrl();
// 
//     public String getInstanceUrl();
// 
//     public void setInstanceUrl(String instanceUrl);
// 
//     public String getUserInfoUrl();
// 
//     public String getAuthGatewayUrl();
// 
//     public void setAuthGatewayBaseUrl(String gatewayUrl);
// 
//     public ConnectOperations connectOperations();
// 
//     public ConnectOperations connectOperations(String instanceUrl);
//     
//     public CustomApiOperations customApiOperations();
// 
//     public CustomApiOperations customApiOperations(String instanceUrl);
// }
// 
// Path: src/main/java/org/springframework/social/salesforce/connect/SalesforceServiceProvider.java
// public class SalesforceServiceProvider extends AbstractOAuth2ServiceProvider<Salesforce> {
//     
//     //Provider ID
//     public final static String ID = "salesforce";
//     
//     public final static String PRODUCTION_GATEWAY_URL = "https://login.salesforce.com";
//     public final static String SANDBOX_GATEWAY_URL    = "https://test.salesforce.com";
//     
//     public final static String TOKEN_PATH      = "/services/oauth2/token";
//     public final static String AUTHORIZE_PATH  = "/services/oauth2/authorize";
// 
//     public SalesforceServiceProvider(String clientId, String clientSecret) {
//         this(clientId, clientSecret,
//                 PRODUCTION_GATEWAY_URL + AUTHORIZE_PATH,
//                 PRODUCTION_GATEWAY_URL + TOKEN_PATH);
//     }
//     
//     public SalesforceServiceProvider(String clientId, String clientSecret, boolean sandbox)
//     {
//         super(new SalesforceOAuth2Template(clientId, clientSecret, (sandbox ? SANDBOX_GATEWAY_URL : PRODUCTION_GATEWAY_URL) + AUTHORIZE_PATH, (sandbox ? SANDBOX_GATEWAY_URL : PRODUCTION_GATEWAY_URL) + TOKEN_PATH));
//     }
// 
//     public SalesforceServiceProvider(String clientId, String clientSecret, String authorizeUrl, String tokenUrl) {
//         super(new SalesforceOAuth2Template(clientId, clientSecret, authorizeUrl, tokenUrl));
//     }
// 
// 
//     public Salesforce getApi(String accessToken) {
//         SalesforceTemplate template = new SalesforceTemplate(accessToken);
// 
//         // gets the returned instance url and sets to Salesforce template as base url.
//         String instanceUrl = ((SalesforceOAuth2Template) getOAuthOperations()).getInstanceUrl();
//         if (instanceUrl != null) {
//             template.setInstanceUrl(instanceUrl);
//         }
// 
//         return template;
//     }
// 
// }


// Path: src/main/java/org/springframework/social/salesforce/api/impl/AbstractSalesForceOperations.java
import org.springframework.social.ApiBinding;
import org.springframework.social.MissingAuthorizationException;
import org.springframework.social.salesforce.api.Salesforce;
import org.springframework.social.salesforce.connect.SalesforceServiceProvider;

/**
 * Copyright (C) 2017 https://github.com/jottley/spring-social-salesforce
 *
 * Licensed 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 org.springframework.social.salesforce.api.impl;


/**
 * @author Umut Utkan
 * @author Jared Ottley
 */
public class AbstractSalesForceOperations<T extends ApiBinding> {

    protected T api;


    public AbstractSalesForceOperations(T api) {
        this.api = api;
    }

    protected void requireAuthorization() {
        if (!api.isAuthorized()) {
            throw new MissingAuthorizationException(SalesforceServiceProvider.ID);