package me.evis.mobile.noodle.product;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import me.evis.mobile.noodle.R;
import me.evis.mobile.util.DeviceUtil;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import android.content.Context;
import android.net.http.AndroidHttpClient;
import android.os.AsyncTask;
import android.util.Log;
import com.amazon.advertising.api.sample.SignedRequestsHelper;
public class QueryApaapiByEanTask extends AsyncTask<String, Void, StringResult> {
private static final String TAG = "QueryApaapiByEanTask";
private Context context;
private OnSuccessListener onSuccessListener;
private OnFailureListener onFailureListener;
public QueryApaapiByEanTask(Context context, OnSuccessListener onSuccessListener, OnFailureListener onFailureListener) {
this.context = context;
this.onSuccessListener = onSuccessListener;
this.onFailureListener = onFailureListener;
}
@Override
protected StringResult doInBackground(String... params) {
if (!DeviceUtil.isOnline(context)) {
return new StringResult(false, "No network available");
}
if (context == null) {
throw new IllegalStateException("Context in null");
}
if (params.length < 1) {
throw new IllegalStateException("No params");
}
String ean = params[0];
SignedRequestsHelper helper;
String endpoint = context.getString(R.string.amazon_aws_endpoint);
String accessKey = context.getString(R.string.amazon_aws_access_key_id);
String secretKey = context.getString(R.string.amazon_aws_secret_key);
String associateTag = context.getString(R.string.amazon_associate_tag);
try {
helper = SignedRequestsHelper.getInstance(endpoint, accessKey, secretKey);
} catch (Exception e) {
Log.e(TAG, "Error creating signer", e);
return null;
}
String requestUrl = null;
Map<String, String> serviceParams = new HashMap<String, String>();
serviceParams.put("Service", "AWSECommerceService");
serviceParams.put("Version", "2011-08-01");
serviceParams.put("AssociateTag", associateTag);
serviceParams.put("Operation", "ItemLookup");
serviceParams.put("SearchIndex", "All");
serviceParams.put("IdType", "EAN");
serviceParams.put("ItemId", ean);
serviceParams.put("ResponseGroup", "ItemAttributes,EditorialReview,Images");
requestUrl = helper.sign(serviceParams);
Log.d(TAG, "Signed Request is \"" + requestUrl + "\"");
AndroidHttpClient client = AndroidHttpClient.newInstance("Android", context);
HttpGet request = new HttpGet(requestUrl);
HttpResponse response = null;
StringResult result = null;
try {
response = client.execute(request);
if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
String resultStr = "HTTP " + response.getStatusLine().getStatusCode()
+ ": " + response.getStatusLine().getReasonPhrase();
Log.d(TAG, resultStr);
result = new StringResult(false, resultStr);
} else {
Document doc = null;
InputStream is = response.getEntity().getContent();
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
doc = db.parse(is);
NodeList errors = doc.getElementsByTagName("Error");
if (errors.getLength() > 0) {
Log.d(TAG, errors.item(0).getTextContent());
result = new StringResult(false, errors.item(0).getTextContent());
} else {
NodeList titleNodes = doc.getElementsByTagName("Title");
if (titleNodes.getLength() > 0) {
result = new StringResult(true, titleNodes.item(0).getTextContent());
}
}
}
} catch (ClientProtocolException e) {
Log.e(TAG, "Http protocol error", e);
result = new StringResult(false, "Error response");
} catch (IOException e) {
Log.e(TAG, "Error when requesting URL: \"" + requestUrl + "\" or parsing HTTP response", e);
result = new StringResult(false, "Error requesting or parsing HTTP response");
} catch (Exception e) {
Log.e(TAG, "Error parsing HTTP response", e);
result = new StringResult(false, "Error parsing HTTP response");
} finally {
// Close the connection
if (client != null && client.getConnectionManager() != null) {
client.close();
client = null;
}
}
return result;
}
@Override
protected void onPostExecute(StringResult result) {
super.onPostExecute(result);
if (result.isSuccess() && onSuccessListener != null) {
onSuccessListener.onSuccess(result.getResult());
}
if (!result.isSuccess() && onFailureListener != null) {
onFailureListener.onFailure(result.getResult());
}
}
public interface OnSuccessListener {
public void onSuccess(String productName);
}
public interface OnFailureListener {
public void onFailure(String failure);
}
}