package com.markupartist.iglaset.provider; import java.util.ArrayList; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import android.text.TextUtils; import com.markupartist.iglaset.provider.Drink.Volume; class DrinksParser extends AbstractParser<Drink> { private ArrayList<Drink> mDrinks = new ArrayList<Drink>(); private Drink mCurrentDrink; private Volume mCurrentVolume = null; private Tag mCurrentTag = null; private int mArticleCount; public static int COUNT_UNDEFINED = -1; @Override public void startDocument() throws SAXException { super.startDocument(); mArticleCount = COUNT_UNDEFINED; } public int getArticleCount() { return mArticleCount; } @Override public void onStartElement(String name, Attributes atts) { if (name.equals("articles")) { String articleCount = atts.getValue("total_articles"); if(!TextUtils.isEmpty(articleCount)) { mArticleCount = Integer.parseInt(articleCount); } } else if (name.equals("article")) { mCurrentDrink = new Drink(Integer.parseInt(atts.getValue("id").trim())); } else if (name.equals("supplier") && !TextUtils.isEmpty(atts.getValue("url").trim())) { mCurrentDrink.setSupplierUrl(atts.getValue("url").trim()); } else if (name.equals("volume")) { mCurrentVolume = new Volume(); String articleId = atts.getValue("sb_article_id").trim(); if (!TextUtils.isEmpty(articleId)) { mCurrentVolume.setArticleId(Integer.parseInt(articleId)); } mCurrentVolume.setPriceSek(atts.getValue("price").trim()); mCurrentVolume.setRetired(Integer.parseInt(atts.getValue("retired").trim())); } else if (name.equals("tag")) { mCurrentTag = new Tag(); mCurrentTag.setId(Integer.parseInt(atts.getValue("id"))); mCurrentTag.setType(atts.getValue("type")); } else if (name.equals("producer")) { String producerId = atts.getValue("id"); if(producerId != null) { mCurrentDrink.setProducerId(Integer.parseInt(producerId.trim())); } else { mCurrentDrink.setProducerId(Producer.UNDEFINED_ID); } } } @Override public void onEndElement(String name, String result) { final String cleanedResult = result.replace("\n", ""); if (mCurrentDrink != null) { if (name.trim().equals("name")) { mCurrentDrink.setName(cleanedResult); } else if (name.equals("producer")) { mCurrentDrink.setProducer(cleanedResult); } else if (name.equals("supplier")) { mCurrentDrink.setSupplier(cleanedResult); } else if (name.equals("origin")) { mCurrentDrink.setOrigin(cleanedResult); } else if (name.equals("origin_country")) { mCurrentDrink.setOriginCountry(cleanedResult); } else if (name.equals("alc_percent")) { mCurrentDrink.setAlcoholPercent(cleanedResult); } else if (name.equals("year") && !TextUtils.isEmpty(cleanedResult)) { mCurrentDrink.setYear(Integer.parseInt(cleanedResult)); } else if (name.equals("volume")) { mCurrentVolume.setVolume(Integer.parseInt(cleanedResult)); mCurrentDrink.addVolume(mCurrentVolume); } else if (name.equals("tag")) { mCurrentTag.setName(cleanedResult); mCurrentDrink.addTag(mCurrentTag); mCurrentTag = null; } else if (name.equals("commercial_desc")) { // Use newline as <br>. That's why the distilled "result" variable // cannot be used. mCurrentDrink.setDescription(result.replaceAll("\n", "<br/>")); } else if (name.equals("avg_rating") && cleanedResult.length() > 0) { mCurrentDrink.setAverageRating(Float.parseFloat(cleanedResult)); } else if (name.equals("comments")) { mCurrentDrink.setCommentCount(Integer.parseInt(cleanedResult)); } else if (name.equals("small") && !TextUtils.isEmpty(cleanedResult)) { mCurrentDrink.setImageUrl(Drink.ImageSize.SMALL, result); } else if (name.equals("medium") && !TextUtils.isEmpty(cleanedResult)) { mCurrentDrink.setImageUrl(Drink.ImageSize.MEDIUM, result); } else if (name.equals("large") && !TextUtils.isEmpty(cleanedResult)) { mCurrentDrink.setImageUrl(Drink.ImageSize.LARGE, cleanedResult); } else if (name.equals("user_rating") && cleanedResult.length() > 0) { mCurrentDrink.setUserRating(Float.parseFloat(cleanedResult)); } else if (name.equals("comments")) { mCurrentDrink.setCommentCount(Integer.parseInt(cleanedResult)); } else if (name.equals("ratings")) { mCurrentDrink.setRatingCount(Integer.parseInt(cleanedResult)); } else if (name.equals("estimated_rating") && cleanedResult.length() > 0) { mCurrentDrink.setEstimatedRating(Float.parseFloat(cleanedResult)); } } if (name.trim().equals("article")) { mDrinks.add(mCurrentDrink); mCurrentDrink = null; } } @Override protected ArrayList<Drink> getContent() { return mDrinks; } }