package com.joelapenna.foursquared.appwidget.stats;
import android.content.Context;
import com.joelapenna.foursquared.R;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.net.URL;
/**
* @author Nick Burton (charlesnicholasburton [at] gmail.com)
*/
public class HTMLParser extends DefaultHandler{
private Context mContext;
private UserRank mUserRank;
private String mUserName;
private String mRankString;
private String mPointsString;
private String mLastCell;
private StringBuffer mStatBuffer = new StringBuffer();
private boolean mIsPoints = false;
private boolean mIsUser = false;
private boolean mIsTData = false;
private boolean mFoundUser = false;
public HTMLParser(Context context,String uName){
mContext = context;
mUserName = uName;
}
public UserRank getUserRank() {
return mUserRank;
}
public void parse(String urlString) throws FoursquareHelper.ParseException {
SAXParserFactory spf = SAXParserFactory.newInstance();
try {
URL url = new URL(urlString);
url.openConnection();
SAXParser sp = spf.newSAXParser();
XMLReader xr = sp.getXMLReader();
xr.setContentHandler(this);
xr.parse(new InputSource(url.openStream()));
} catch (Exception e){
throw new FoursquareHelper.ParseException("Problem parsing API response", e);
}
}
@Override
public void startElement(String namespaceURI, String localName,
String qName, Attributes atts) throws SAXException {
if (localName.equals("td")){
mLastCell = mStatBuffer.toString();
mStatBuffer = new StringBuffer();
mIsTData = true;
String attr = atts.getValue("class");
if( attr != null ){
if( attr.equals("mini")){
mIsPoints = true;
}
}
}
}
@Override
public void characters (char[] chars, int start, int length) throws SAXException
{
if (mIsTData){
mStatBuffer.append(chars,start,length);
}
}
@Override
public void endElement(String namespaceURI, String localName, String qName)
throws SAXException {
if(localName.equals("td")){
if(mIsPoints){
mPointsString = mStatBuffer.toString();
if(mIsUser){
RankParser parser = new RankParser(mRankString,mPointsString);
mUserRank = parser.getUserRank();
mIsUser = false;
mFoundUser = true;
}
mIsPoints = false;
}
if( mStatBuffer.toString().equals(mUserName)){
mIsUser = true;
mRankString = mLastCell.replace(".", "");
}
mIsTData = false;
}
}
public void endDocument() throws SAXException {
String blankText = mContext.getString(R.string.stats_widget_blank_stats_text);
if(!mFoundUser){
mUserRank = new UserRank(blankText,blankText);
}
}
}