package ca.grocerygo.android.services; import android.content.Context; import android.os.AsyncTask; import android.util.Log; import android.widget.TextView; import android.widget.Toast; import ca.grocerygo.android.GroceryApplication; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import java.io.StringWriter; import java.net.URL; public class QueryUPCDatabase extends AsyncTask<String, Void, String> { private Context mContext; private TextView mTextView; public QueryUPCDatabase(Context context, TextView textView) { this.mContext = context; this.mTextView = textView; } @Override protected String doInBackground(String... params) { try { URL databaseURL = new URL("http://upcdatabase.org/api/xml/" + params[0] + "/" + params[1]); //Log.i("GroceryOTG", "http://upcdatabase.org/api/xml/" + params[0] + "/" + params[1]); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(new InputSource(databaseURL.openStream())); document.getDocumentElement().normalize(); NodeList nodeList = document.getElementsByTagName("output"); Node node = nodeList.item(0); NodeList itemNameList = ((Element) node).getElementsByTagName("itemname"); if (itemNameList.getLength() == 0) return null; String itemName = nodeToString(itemNameList.item(0)); NodeList descriptionList = ((Element) node).getElementsByTagName("description"); if (descriptionList.getLength() > 0) itemName += nodeToString(descriptionList.item(0)); // TODO: Only get the first item for now, maybe add them as a list later return itemName; } catch (Exception e) { e.printStackTrace(); Log.e(GroceryApplication.TAG, "Could not construct upc database url. Exception " + e); } return null; } @Override protected void onPostExecute(String name) { if (name == null) { mTextView.setText(""); makeToast("Could not find that item in the database"); } else { mTextView.setText(name); } } private void makeToast(String text) { Toast.makeText(mContext, text, Toast.LENGTH_SHORT).show(); } private String nodeToString(Node node) { StringWriter sw = new StringWriter(); try { Transformer t = TransformerFactory.newInstance().newTransformer(); t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); t.setOutputProperty(OutputKeys.INDENT, "yes"); t.setOutputProperty(OutputKeys.METHOD, "text"); t.transform(new DOMSource(node), new StreamResult(sw)); } catch (TransformerException te) { System.out.println("nodeToString Transformer Exception"); } return sw.toString(); } }