package pt.rupeal.invoicexpress.server;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.BasicHttpContext;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import pt.rupeal.invoicexpress.MainActivity;
import pt.rupeal.invoicexpress.R;
import pt.rupeal.invoicexpress.model.AccountModel;
import pt.rupeal.invoicexpress.utils.InvoiceXpressException;
import pt.rupeal.invoicexpress.utils.InvoiceXpressError.InvoiceXpressErrorType;
import android.content.Context;
import android.util.Log;
public class AccountsRestHandler extends AsyncTask<Void, Void, List<AccountModel>> {
public AccountsRestHandler(Context context) {
this.context = context;
}
@Override
protected void onPostExecute(List<AccountModel> result) {
super.onPostExecute(result);
// check if there is an error
if(existsError()) {
processError();
return;
}
// this execution is always for refresh
// clear account list
InvoiceXpress.getInstance().getAccounts().clear();
// set account list
InvoiceXpress.getInstance().setAccounts(result);
// refresh
((MainActivity) context).refreshFragment();
}
@Override
protected List<AccountModel> doInBackground(Void... params) {
HttpGet httpGet = new HttpGet(buildRequestHttpGet());
try {
DefaultHttpClient httpClient = new DefaultHttpClient(InvoiceXpress.getHttpParameters());
HttpResponse response = httpClient.execute(httpGet, new BasicHttpContext());
BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
StringBuffer responseString = new StringBuffer();
String line;
while ((line = reader.readLine()) != null) {
responseString.append(line);
}
if(InvoiceXpress.DEBUG) {
Log.d(this.getClass().getCanonicalName(), responseString.toString());
}
return getAccounts(responseString.toString());
} catch (ClientProtocolException e) {
Log.e(this.getClass().getCanonicalName(), e.getMessage(), e);
setError(R.string.error_accounts_unexpected, InvoiceXpressErrorType.ERROR);
} catch (IOException e) {
Log.e(this.getClass().getCanonicalName(), e.getMessage(), e);
setError(R.string.error_accounts_unexpected, InvoiceXpressErrorType.ERROR);
} catch (InvoiceXpressException e) {
Log.e(this.getClass().getCanonicalName(), e.getMessage(), e);
setError(R.string.error_accounts_unexpected, InvoiceXpressErrorType.ERROR);
}
return null;
}
private String buildRequestHttpGet() {
StringBuffer request = new StringBuffer(InvoiceXpress.getInstance().getActiveAccount().getUrl() + "/users/accounts");
request.append(".xml");
request.append("?api_key=" + InvoiceXpress.getInstance().getActiveAccount().getApiKey());
if(InvoiceXpress.DEBUG) {
Log.d(this.getClass().getCanonicalName(), request.toString());
}
return request.toString();
}
private List<AccountModel> getAccounts(String xml) throws InvoiceXpressException {
InvoiceXpressParser parser = new InvoiceXpressParser(context);
Document documentDomElement = parser.getDomElement(xml);
if(documentDomElement == null) {
throw new InvoiceXpressException(context, R.string.error_bad_credentials);
}
NodeList accountsNode = documentDomElement.getElementsByTagName("account");
List<AccountModel> accounts = new ArrayList<AccountModel>(accountsNode.getLength());
for (int index = 0; index < accountsNode.getLength(); index++) {
Node accountNode = accountsNode.item(index);
AccountModel accountDTO = new AccountModel();
accountDTO.setId(parser.getValue((Element) accountNode, "id"));
accountDTO.setName(parser.getValue((Element) accountNode, "name"));
accountDTO.setUrl(parser.getValue((Element) accountNode, "url"));
accountDTO.setApiKey(parser.getValue((Element) accountNode, "api_key"));
accountDTO.setState(parser.getValue((Element) accountNode, "state"));
accounts.add(accountDTO);
}
return accounts;
}
}