package br.com.developer.redu.http;
import br.com.developer.redu.models.*;
import org.scribe.model.*;
import org.scribe.oauth.OAuthService;
import org.scribe.builder.ServiceBuilder;
import java.util.Map;
import com.google.gson.Gson;
/**
* Created with IntelliJ IDEA.
* User: igor
* Date: 8/30/12
* Time: 12:08 PM
* To change this template use File | Settings | File Templates.
*/
public class ScribeHttpClient extends HttpClient {
private OAuthService service;
private Token accesToken;
public ScribeHttpClient(String consumerKey, String consumerSecret){
super(consumerKey, consumerSecret);
this.initOauth();
}
public ScribeHttpClient(String consumerKey, String consumerSecret, String pin){
super(consumerKey, consumerSecret);
this.initOauth();
this.accesToken = this.service.getAccessToken(null, new Verifier(pin));
}
/**
* Versão Alternativa de construtor que instancia um token de acesso diretamente, sem a necessidade de um pin(¬¬)
*
* @param consumerKey
* @param consumerSecret
*
* @param accessToken Provavelmente esse accessToken será capturado ao iniciar uma sessão no Redu
*/
public ScribeHttpClient(String consumerKey, String consumerSecret, Token accessToken) {
super(consumerKey, consumerSecret);
this.initOauth();
this.accesToken = accessToken;
}
private void initOauth(){
this.service = new ServiceBuilder().provider(ReduOauth2.class)
.apiKey(this.consumerKey).apiSecret(this.consumerSecret).callback("").build();
}
private void addUrlParams(OAuthRequest request, Map.Entry<String, String>... params){
for (Map.Entry<String, String> pair : params){
request.addQuerystringParameter(pair.getKey(), pair.getValue());
}
}
private void addBodyParams(OAuthRequest request, Map.Entry<String, String>... params){
for(Map.Entry<String, String> pair : params){
request.addBodyParameter(pair.getKey(), pair.getValue());
}
}
@Override
public void initClient(String pin) {
Verifier v = new Verifier(pin);
this.accesToken = this.service.getAccessToken(null, v);
}
@Override
public String getAuthUrl() {
return this.service.getAuthorizationUrl(null);
}
@Override
public String get(String url, Map.Entry<String, String>... params) {
OAuthRequest request = new OAuthRequest(Verb.GET, url);
if(params != null){
this.addUrlParams(request, params);
}
this.service.signRequest(this.accesToken, request);
Response r = request.send();
return r.getBody();
}
@Override
public String post(String url, Map.Entry<String, String>... params) {
OAuthRequest request = new OAuthRequest(Verb.POST, url);
if(params != null){
this.addBodyParams(request, params);
}
this.service.signRequest(this.accesToken, request);
Response r = request.send();
return r.getBody(); //To change body of implemented methods use File | Settings | File Templates.
}
@Override
public String post(String url, byte[] payload, Map.Entry<String, String>... params) {
OAuthRequest request = new OAuthRequest(Verb.POST, url);
if(params != null){
this.addBodyParams(request, params);
}
request.addPayload(payload);
request.addHeader("Content-Type", "application/json");
this.service.signRequest(this.accesToken, request);
Response r = request.send();
return r.getBody();
}
@Override
public void delete(String url, Map.Entry<String, String>... params) {
OAuthRequest request = new OAuthRequest(Verb.DELETE, url);
if(params != null){
this.addUrlParams(request, params);
}
this.service.signRequest(this.accesToken, request);
Response r = request.send();
if (!(r.getCode() == 200)){
throw new DeleteException("Invalid return code", r.getCode());
}
}
@Override
public void put(String url,byte[] payload, Map.Entry<String, String>... params) {
OAuthRequest request = new OAuthRequest(Verb.PUT, url);
if(params != null){
this.addBodyParams(request, params);
}
request.addPayload(payload);
request.addHeader("Content-Type", "application/json");
this.service.signRequest(this.accesToken, request);
Response r = request.send();
if(!(r.getCode() == 200)){
throw new PutException("Invalid return code", r.getCode());
}
}
public static Token parseToken(String httpToken) {
String rawResponse = "{\"access_token\":\"" + httpToken + "\",\"token_type\":\"bearer\"}";
return new Token(httpToken, null, rawResponse);
}
}