org.mule.modules.quickbooks.api.oauth.DefaultQuickBooksOAuthClient.java Source code

Java tutorial

Introduction

Here is the source code for org.mule.modules.quickbooks.api.oauth.DefaultQuickBooksOAuthClient.java

Source

/**
 * Mule QuickBooks Connector
 *
 * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
 *
 * The software in this package is published under the terms of the CPAL v1.0
 * license, a copy of which has been included with this distribution in the
 * LICENSE.txt file.
 */

package org.mule.modules.quickbooks.api.oauth;

import oauth.signpost.OAuthConsumer;
import oauth.signpost.OAuthProvider;
import oauth.signpost.basic.DefaultOAuthConsumer;
import oauth.signpost.basic.DefaultOAuthProvider;
import oauth.signpost.exception.OAuthCommunicationException;
import oauth.signpost.exception.OAuthExpectationFailedException;
import oauth.signpost.exception.OAuthMessageSignerException;
import oauth.signpost.exception.OAuthNotAuthorizedException;
import oauth.signpost.signature.HmacSha1MessageSigner;
import oauth.signpost.signature.OAuthMessageSigner;
import oauth.signpost.signature.PlainTextMessageSigner;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.Validate;
import org.apache.log4j.Logger;
import org.mule.api.store.ObjectStoreException;
import org.mule.modules.quickbooks.api.ObjectStoreHelper;

@SuppressWarnings({ "rawtypes", "unused" })
public class DefaultQuickBooksOAuthClient implements QuickBooksOAuthClient {
    private static final Logger LOGGER = Logger.getLogger(DefaultQuickBooksOAuthClient.class);

    private String consumerKey;
    private String consumerSecret;
    private ObjectStoreHelper objectStoreHelper;
    private OAuthMessageSigner messageSigner = new HmacSha1MessageSigner();

    public DefaultQuickBooksOAuthClient(String consumerKey, String consumerSecret,
            ObjectStoreHelper objectStoreHelper) {
        Validate.notEmpty(consumerKey);
        Validate.notEmpty(consumerSecret);
        setConsumerKey(consumerKey);
        setConsumerSecret(consumerSecret);
        setObjectStoreHelper(objectStoreHelper);
    }

    /**
     * Retrieves a request token using requestTokenId as identifier
     * If the app doesn't provide a requestToken the method will generate an UUID 
     * and send it as a callback parameter to the service.
     */
    @Override
    public String authorize(String requestTokenUrl, String accessTokenUrl, String authorizationUrl,
            String callbackUrl, String requestTokenId)
            throws OAuthMessageSignerException, OAuthNotAuthorizedException, OAuthExpectationFailedException,
            OAuthCommunicationException, ObjectStoreException {

        OAuthConsumer consumer = new DefaultOAuthConsumer(consumerKey, consumerSecret);
        OAuthProvider provider = new DefaultOAuthProvider(requestTokenUrl, accessTokenUrl, authorizationUrl);
        provider.setOAuth10a(true);

        if (messageSigner != null) {
            consumer.setMessageSigner(messageSigner);
        } else {
            consumer.setMessageSigner(new PlainTextMessageSigner());
        }

        setConsumerKey(consumerKey);
        setConsumerSecret(consumerSecret);

        if (StringUtils.isBlank(requestTokenId)) {
            requestTokenId = org.mule.util.UUID.getUUID();
        }

        callbackUrl = callbackUrl.concat("?userId=" + requestTokenId);

        if (LOGGER.isDebugEnabled()) {
            StringBuilder messageStringBuilder = new StringBuilder();
            messageStringBuilder.append("Retrieving OAuth requestToken ");
            messageStringBuilder.append("[consumerKey = ");
            messageStringBuilder.append(consumerKey);
            messageStringBuilder.append("] ");
            messageStringBuilder.append("[consumerSecret = ");
            messageStringBuilder.append(consumerSecret);
            messageStringBuilder.append("] ");
            messageStringBuilder.append("[callbackUrl = ");
            messageStringBuilder.append(callbackUrl);
            messageStringBuilder.append("] ");
            LOGGER.debug(messageStringBuilder.toString());
        }

        String authTokenUrl = provider.retrieveRequestToken(consumer, callbackUrl);

        if (LOGGER.isDebugEnabled()) {
            StringBuilder messageStringBuilder = new StringBuilder();
            messageStringBuilder.append("Request Token INFO ");
            messageStringBuilder.append("[authTokenUrl = ");
            messageStringBuilder.append(authTokenUrl);
            messageStringBuilder.append("] ");
            messageStringBuilder.append("[requestToken = ");
            messageStringBuilder.append(consumer.getToken());
            messageStringBuilder.append("] ");
            messageStringBuilder.append("[requestTokenSecret = ");
            messageStringBuilder.append(consumer.getTokenSecret());
            messageStringBuilder.append("] ");
            LOGGER.debug(messageStringBuilder.toString());
        }

        //Removes special characters from requestTokenId
        requestTokenId = removeSpecialCharacters(requestTokenId);

        //Stores the request token
        getObjectStoreHelper().store(requestTokenId, new OAuthCredentials(consumer.getToken(),
                consumer.getTokenSecret(), requestTokenUrl, accessTokenUrl, authorizationUrl), true);

        LOGGER.debug("Request Token stored using ID: " + requestTokenId);
        return authTokenUrl;
    }

    /**
     * Gets an access token using the request token stored in the ObjectStore instance.
     * The requestTokenId is provided by the app.
     */
    @Override
    public OAuthCredentials getAccessToken(String verifier, String requestTokenId)
            throws OAuthMessageSignerException, OAuthNotAuthorizedException, OAuthExpectationFailedException,
            OAuthCommunicationException, ObjectStoreException {

        //Removes special characters from requestTokenId
        requestTokenId = removeSpecialCharacters(requestTokenId);

        if (LOGGER.isDebugEnabled()) {
            StringBuilder messageStringBuilder = new StringBuilder();
            messageStringBuilder.append("Trying to retrieve request token information ");
            messageStringBuilder.append("[requestTokenId = ");
            messageStringBuilder.append(requestTokenId);
            messageStringBuilder.append("] ");
            LOGGER.debug(messageStringBuilder.toString());
        }

        //Retrieves requestToken and requestTokenSecret
        OAuthCredentials credentials = (OAuthCredentials) getObjectStoreHelper().retrieve(requestTokenId);
        if (LOGGER.isDebugEnabled()) {
            StringBuilder messageStringBuilder = new StringBuilder();
            messageStringBuilder.append("Retrieved request token INFO ");
            messageStringBuilder.append("[requestToken = ");
            messageStringBuilder.append(credentials.getAccessToken());
            messageStringBuilder.append("] ");
            messageStringBuilder.append("[requestTokenSecret = ");
            messageStringBuilder.append(credentials.getAccessTokenSecret());
            messageStringBuilder.append("] ");
            LOGGER.debug(messageStringBuilder.toString());
        }

        OAuthConsumer consumer = new DefaultOAuthConsumer(getConsumerKey(), getConsumerSecret());

        OAuthProvider provider = new DefaultOAuthProvider(credentials.getRequestTokenUrl(),
                credentials.getAccessTokenUrl(), credentials.getAuthUrl());
        provider.setOAuth10a(true);

        //sets message signer
        if (messageSigner != null) {
            consumer.setMessageSigner(messageSigner);
        } else {
            consumer.setMessageSigner(new PlainTextMessageSigner());
        }

        consumer.setTokenWithSecret(credentials.getAccessToken(), credentials.getAccessTokenSecret());
        provider.retrieveAccessToken(consumer, verifier);
        if (LOGGER.isDebugEnabled()) {
            StringBuilder messageStringBuilder = new StringBuilder();
            messageStringBuilder.append("Token authenticated successfully: ");
            messageStringBuilder.append("[verifier = ");
            messageStringBuilder.append(verifier);
            messageStringBuilder.append("] ");
            LOGGER.debug(messageStringBuilder.toString());
        }

        credentials.setAccessToken(consumer.getToken());
        credentials.setAccessTokenSecret(consumer.getTokenSecret());
        return credentials;
    }

    public String getConsumerKey() {
        return consumerKey;
    }

    public String getConsumerSecret() {
        return consumerSecret;
    }

    public void setConsumerKey(String consumerKey) {
        this.consumerKey = consumerKey;
    }

    public void setConsumerSecret(String consumerSecret) {
        this.consumerSecret = consumerSecret;
    }

    public ObjectStoreHelper getObjectStoreHelper() {
        return objectStoreHelper;
    }

    public void setObjectStoreHelper(ObjectStoreHelper objectStoreHelper) {
        this.objectStoreHelper = objectStoreHelper;
    }

    /**
     * This method is used for avoiding errors in CloudHub's Object Store API
     * @param idToStore key to be stored
     * @return String without encoded characters
     */
    private String removeSpecialCharacters(String idToStore) {
        return StringUtils.remove(idToStore, "%");
    }
}