/**
  * Returns the fully configured {@link OAuthService}
  *
  * @return fully configured {@link OAuthService}
  */
 public OAuthService build() {
   Preconditions.checkNotNull(api, "You must specify a valid api through the provider() method");
   Preconditions.checkEmptyString(apiKey, "You must provide an api key");
   Preconditions.checkEmptyString(apiSecret, "You must provide an api secret");
   return api.createService(
       new OAuthConfig(apiKey, apiSecret, callback, signatureType, scope, grantType, debugStream));
 }
  @Override
  public String getAuthorizationUrl(OAuthConfig config) {
    Preconditions.checkValidUrl(
        config.getCallback(), "Must provide a valid url as callback. Google does not support OOB");
    Preconditions.checkEmptyString(
        config.getScope(), "Must provide a valid value as scope. Google does not support no scope");

    return String.format(
        AUTHORIZE_URL, config.getApiKey(), encode(config.getCallback()), encode(config.getScope()));
  }
 private Api createApi(Class<? extends Api> apiClass) {
   Preconditions.checkNotNull(apiClass, "Api class cannot be null");
   Api api;
   try {
     api = apiClass.newInstance();
   } catch (Exception e) {
     throw new OAuthException("Error while creating the Api object", e);
   }
   return api;
 }
 public Token extract(String response) {
   Preconditions.checkEmptyString(
       response, "Cannot extract a token from a null or empty String");
   Matcher matcher = accessTokenPattern.matcher(response);
   if (matcher.find()) {
     return new Token(matcher.group(1), "", response);
   } else {
     throw new OAuthException("Cannot extract an acces token. Response was: " + response);
   }
 }
  @Override
  public String getAuthorizationUrl(OAuthConfig config) {
    Preconditions.checkValidUrl(
        config.getCallback(), "Must provide a valid url which will get the code ");

    // Append scope if present
    if (config.hasScope()) {
      return String.format(
          SCOPED_AUTHORIZE_URL,
          config.getApiKey(),
          OAuthEncoder.encode(config.getCallback()),
          OAuthEncoder.encode(config.getScope()));
    } else {
      return String.format(
          AUTHORIZE_URL, config.getApiKey(), OAuthEncoder.encode(config.getCallback()));
    }
  }
 public String getAuthorizationUrl(OAuthConfig paramOAuthConfig) {
   Preconditions.checkValidUrl(
       paramOAuthConfig.getCallback(),
       "Must provide a valid url as callback. Facebook does not support OOB");
   if (paramOAuthConfig.hasScope()) {
     Object[] arrayOfObject2 = new Object[3];
     arrayOfObject2[0] = paramOAuthConfig.getApiKey();
     arrayOfObject2[1] = OAuthEncoder.encode(paramOAuthConfig.getCallback());
     arrayOfObject2[2] = OAuthEncoder.encode(paramOAuthConfig.getScope());
     return String.format(
         "https://www.facebook.com/dialog/oauth?client_id=%s&redirect_uri=%s&scope=%s",
         arrayOfObject2);
   }
   Object[] arrayOfObject1 = new Object[2];
   arrayOfObject1[0] = paramOAuthConfig.getApiKey();
   arrayOfObject1[1] = OAuthEncoder.encode(paramOAuthConfig.getCallback());
   return String.format(
       "https://www.facebook.com/dialog/oauth?client_id=%s&redirect_uri=%s", arrayOfObject1);
 }
 /** {@inheritDoc} */
 @Override
 public String getAuthorizationUrl(OAuthConfig config) {
   Preconditions.checkValidUrl(
       config.getCallback(),
       "Must provide a valid url as callback. LinkedIn does not support Out Of Band Auth.");
   // Append scope if present
   if (config.hasScope()) {
     return String.format(
         SCOPED_AUTHORIZE_URL,
         config.getApiKey(),
         OAuthEncoder.encode(state),
         OAuthEncoder.encode(config.getCallback()),
         OAuthEncoder.encode(config.getScope()));
   } else {
     return String.format(
         AUTHORIZE_URL,
         config.getApiKey(),
         OAuthEncoder.encode(state),
         OAuthEncoder.encode(config.getCallback()));
   }
 }
 /**
  * Configures the api secret
  *
  * @param apiSecret The api secret for your application
  * @return the {@link ServiceBuilder} instance for method chaining
  */
 public ServiceBuilder apiSecret(String apiSecret) {
   Preconditions.checkEmptyString(apiSecret, "Invalid Api secret");
   this.apiSecret = apiSecret;
   return this;
 }
 /**
  * Configures the api key
  *
  * @param apiKey The api key for your application
  * @return the {@link ServiceBuilder} instance for method chaining
  */
 public ServiceBuilder apiKey(String apiKey) {
   Preconditions.checkEmptyString(apiKey, "Invalid Api key");
   this.apiKey = apiKey;
   return this;
 }
 /**
  * Adds an OAuth callback url
  *
  * @param callback callback url. Must be a valid url or 'oob' for out of band OAuth
  * @return the {@link ServiceBuilder} instance for method chaining
  */
 public ServiceBuilder callback(String callback) {
   Preconditions.checkNotNull(callback, "Callback can't be null");
   this.callback = callback;
   return this;
 }
 /**
  * Configures the {@link Api}
  *
  * <p>Overloaded version. Let's you use an instance instead of a class.
  *
  * @param api instance of {@link Api}s
  * @return the {@link ServiceBuilder} instance for method chaining
  */
 public ServiceBuilder provider(Api api) {
   Preconditions.checkNotNull(api, "Api cannot be null");
   this.api = api;
   return this;
 }
 public ServiceBuilder debugStream(OutputStream stream) {
   Preconditions.checkNotNull(stream, "debug stream can't be null");
   this.debugStream = stream;
   return this;
 }
 /**
  * Configures the OAuth grant type . This is only necessary in some APIs (like Salesforce's).
  *
  * @param String - OAuth grant type
  * @return the {@link ServiceBuilder} instance for method chaining
  */
 public ServiceBuilder grantType(String type) {
   Preconditions.checkEmptyString(type, "Invalid grant type");
   this.grantType = type;
   return this;
 }
 /**
  * Configures the signature type, choose between header, querystring, etc. Defaults to Header
  *
  * @param scope The OAuth scope
  * @return the {@link ServiceBuilder} instance for method chaining
  */
 public ServiceBuilder signatureType(SignatureType type) {
   Preconditions.checkNotNull(type, "Signature type can't be null");
   this.signatureType = type;
   return this;
 }
 /**
  * Configures the OAuth scope. This is only necessary in some APIs (like Google's).
  *
  * @param scope The OAuth scope
  * @return the {@link ServiceBuilder} instance for method chaining
  */
 public ServiceBuilder scope(String scope) {
   Preconditions.checkEmptyString(scope, "Invalid OAuth scope");
   this.scope = scope;
   return this;
 }