package de.vanmar.android.yarrn.requests;
import android.app.Application;
import android.util.Log;
import com.octo.android.robospice.request.springandroid.SpringAndroidSpiceRequest;
import com.octo.android.robospice.retry.DefaultRetryPolicy;
import org.scribe.builder.ServiceBuilder;
import org.scribe.model.OAuthRequest;
import org.scribe.model.Response;
import org.scribe.model.Token;
import org.scribe.oauth.OAuthService;
import java.util.concurrent.TimeUnit;
import de.vanmar.android.yarrn.R;
import de.vanmar.android.yarrn.YarrnPrefs_;
import de.vanmar.android.yarrn.ravelry.RavelryApi;
import de.vanmar.android.yarrn.ravelry.RavelryException;
import de.vanmar.android.yarrn.util.PrefsUtils;
public abstract class AbstractRavelryRequest<T> extends SpringAndroidSpiceRequest<T> {
protected final Application application;
protected final YarrnPrefs_ prefs;
public AbstractRavelryRequest(Class<T> clazz, YarrnPrefs_ prefs, Application application) {
super(clazz);
this.prefs = prefs;
this.application = application;
setRetryPolicy(new DefaultRetryPolicy(1, 0, 0));
}
protected Response executeRequest(OAuthRequest request) throws RavelryException {
if (PrefsUtils.isSet(prefs.accessToken())
&& PrefsUtils.isSet(prefs.username())) {
signRequest(request);
request.setConnectTimeout(10, TimeUnit.SECONDS);
final Response response = request.send();
switch (response.getCode()) {
case 200:
case 304:
return response;
case 401:
case 403:
case 404:
throw new RavelryException(response.getCode());
default:
Log.w("TAG", request.getCompleteUrl());
throw new IllegalArgumentException(
"Unknown Response code: "
+ response.getCode());
}
} else {
throw new RavelryException(401);
}
}
private void signRequest(OAuthRequest request) {
final String apiKey = application.getString(R.string.api_key);
final String apiSecret = application.getString(R.string.api_secret);
final String callback = application.getString(R.string.api_callback);
OAuthService service = new ServiceBuilder()
.provider(new RavelryApi(application.getString(R.string.ravelry_url)))
.apiKey(apiKey).apiSecret(apiSecret).callback(callback).build();
final Token accessToken = new Token(prefs.accessToken()
.get(), prefs.accessSecret().get());
service.signRequest(accessToken, request);
request.setConnectTimeout(10, TimeUnit.SECONDS);
}
}