package com.droidworks.xml; import java.io.InputStream; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import com.droidworks.syndication.FeedItem; import org.xml.sax.ContentHandler; import org.xml.sax.InputSource; import org.xml.sax.XMLReader; import android.util.Log; public abstract class Parser<T> { private final String mDefaultNameSpace; private boolean mIsFinished = false; private String mEncoding; // should i support multiple listeners? private OnItemParsedListener<T> mListener; // interface that gets called when an item is added public interface OnItemParsedListener<T> { public void onItemParsed(T item); } public Parser(String defaultNamespace) { mDefaultNameSpace = defaultNamespace; setupNodes(); } protected abstract void setupNodes(); protected abstract ContentHandler getContentHandler(); public void parse(InputStream stream) { mIsFinished = false; try { SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser sp = spf.newSAXParser(); /* Get the XMLReader of the SAXParser we created. */ XMLReader xr = sp.getXMLReader(); // TODO, just doing some testing xr.setContentHandler(getContentHandler()); InputSource is = new InputSource(stream); // set the encoding if requested. if (mEncoding != null) { is.setEncoding(mEncoding); } xr.parse(is); stream.close(); } catch (Exception e) { Log.e(getClass().getCanonicalName(), "Failure parsing document", e); } mIsFinished = true; } public String getDefaultNamespace() { return mDefaultNameSpace; } protected OnItemParsedListener<T> getListener() { return mListener; } public void registerListener(OnItemParsedListener<T> listener) { mListener = listener; } public void unregisterListener(OnItemParsedListener<T> listener) { mListener = null; } public void setEncoding(String encoding) { mEncoding = encoding; } /** * Has the parser completed? * * @return */ public boolean isFinished() { return mIsFinished; } }