package pt.rupeal.invoicexpress.server;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
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.enums.FragmentTagsEnum;
import pt.rupeal.invoicexpress.fragments.ContactDetailsFragment;
import pt.rupeal.invoicexpress.model.ContactModel;
import pt.rupeal.invoicexpress.utils.InvoiceXpressError.InvoiceXpressErrorType;
import pt.rupeal.invoicexpress.utils.InvoiceXpressException;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
public class ContactDetailsRestHandler extends AsyncTask<String, Void, ContactModel> {
private boolean isRefreshing;
public ContactDetailsRestHandler(Context context) {
this.context = context;
}
@Override
protected void onPostExecute(ContactModel result) {
super.onPostExecute(result);
// check if there is an error
if(existsError()) {
processError();
return;
}
if(isRefreshing) {
// update contacts map
InvoiceXpress.getInstance().getContacts().put(result.getId(), result);
// put id Client
Bundle args = new Bundle();
args.putSerializable(ContactModel.CONTACT, result);
// set contact details fragment
((MainActivity) context).refreshFragment(args);
} else {
// put contact
InvoiceXpress.getInstance().getContacts().put(result.getId(), result);
// set contact to arguments
Bundle args = new Bundle();
args.putSerializable(ContactModel.CONTACT, result);
// add contact details fragment
((MainActivity) context).addFragment(ContactDetailsFragment.class,
FragmentTagsEnum.CONTACTS_DETAILS,
args);
}
}
@Override
protected ContactModel doInBackground(String... params) {
String clientId = params[0];
isRefreshing = Boolean.parseBoolean(params[1]);
HttpGet httpGet = new HttpGet(buildRequestHttpGet(clientId));
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 getContactDetails(responseString.toString());
} catch (ClientProtocolException e) {
Log.e(this.getClass().getCanonicalName(), e.getMessage(), e);
setError(R.string.error_contact_unexpected, InvoiceXpressErrorType.ERROR);
} catch (IOException e) {
Log.e(this.getClass().getCanonicalName(), e.getMessage(), e);
setError(R.string.error_contact_unexpected, InvoiceXpressErrorType.ERROR);
} catch (InvoiceXpressException e) {
Log.e(this.getClass().getCanonicalName(), e.getMessage(), e);
setError(e.getMessage(), InvoiceXpressErrorType.ERROR);
}
return null;
}
private String buildRequestHttpGet(String clientId) {
StringBuffer request = new StringBuffer(InvoiceXpress.getInstance().getActiveAccount().getUrl() + "/clients/");
request.append(clientId);
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 ContactModel getContactDetails(String xml) throws InvoiceXpressException {
InvoiceXpressParser parser = new InvoiceXpressParser(context);
Document documentDomElement = parser.getDomElement(xml);
ContactModel contact = new ContactModel();
NodeList nodeList = documentDomElement.getElementsByTagName("client");
Element elem = (Element) nodeList.item(0);
contact.setId(parser.getValue(elem, "id"));
contact.setName(parser.getValue(elem, "name"));
contact.setCode(parser.getValue(elem, "code"));
contact.setEmail(parser.getValue(elem, "email"));
contact.setAddress(parser.getValue(elem, "address"));
contact.setPostalCode(parser.getValue(elem, "postal_code"));
contact.setCountry(parser.getValue(elem, "country"));
contact.setFiscalId(parser.getValue(elem, "fiscal_id"));
contact.setWebsite(parser.getValue(elem, "website"));
contact.setPhone(parser.getValue(elem, "phone"));
contact.setFax(parser.getValue(elem, "fax"));
Node preferred = parser.getNode(elem, "preferred_contact");
contact.setPreferredName(parser.getValue((Element) preferred, "name"));
contact.setPreferredEmail(parser.getValue((Element) preferred, "email"));
contact.setPreferredPhone(parser.getValue((Element) preferred, "phone"));
contact.setObservations(parser.getValue(elem, "observations"));
contact.setSendOptions(parser.getValue(elem, "send_options"));
return contact;
}
}