/*
* Copyright (C) 2012 Jamie Nicol <jamie@thenicols.net>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.jamienicol.episodes.tvdb;
import android.sax.Element;
import android.sax.EndElementListener;
import android.sax.EndTextElementListener;
import android.sax.RootElement;
import android.sax.StartElementListener;
import android.util.Log;
import java.io.InputStream;
import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
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.XMLReaderFactory;
class SearchShowsParser
{
private static final String TAG = "SearchShowsParser";
// show which is currently being parsed
Show current;
// shows which have finished being parsed
List<Show> parsed;
public List<Show> parse(InputStream inputStream) {
try {
InputSource inputSource = new InputSource(inputStream);
XMLReader xmlReader = XMLReaderFactory.createXMLReader("org.xmlpull.v1.sax2.Driver");
RootElement rootElement = new RootElement("Data");
Element seriesElement = rootElement.getChild("Series");
seriesElement.setStartElementListener(new StartElementListener() {
public void start(Attributes attributes) {
Log.i(TAG, "Begin parsing show");
current = new Show();
}
});
seriesElement.setEndElementListener(new EndElementListener() {
public void end() {
Log.i(TAG, "End parsing show");
parsed.add(current);
current = null;
}
});
Element idElement = seriesElement.requireChild("id");
idElement.setEndTextElementListener(new EndTextElementListener() {
public void end(String body) {
int id = Integer.parseInt(body);
Log.i(TAG, String.format("Parsed ID: %d", id));
current.setId(id);
}
});
Element nameElement = seriesElement.requireChild("SeriesName");
nameElement.setEndTextElementListener(new EndTextElementListener() {
public void end(String body) {
Log.i(TAG, String.format("Parsed name: %s", body));
current.setName(body);
}
});
Element languageElement = seriesElement.requireChild("language");
languageElement.setEndTextElementListener(new EndTextElementListener() {
public void end(String body) {
Log.i(TAG, String.format("Parsed language: %s", body));
current.setLanguage(body);
}
});
Element overviewElement = seriesElement.getChild("Overview");
overviewElement.setEndTextElementListener(new EndTextElementListener() {
public void end(String body) {
Log.i(TAG, String.format("Parsed overview: %s", body));
current.setOverview(body);
}
});
Element firstAiredElement = seriesElement.getChild("FirstAired");
firstAiredElement.setEndTextElementListener(new EndTextElementListener() {
public void end(String body) {
try {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd",
Locale.US);
Date firstAired = df.parse(body);
Log.i(TAG, String.format("Parsed first aired date: %s",
firstAired.toString()));
current.setFirstAired(firstAired);
} catch (ParseException e) {
Log.w(TAG, "Error parsing first aired date: " + e.toString());
current.setFirstAired(null);
}
}
});
xmlReader.setContentHandler(rootElement.getContentHandler());
current = null;
parsed = new LinkedList<Show>();
xmlReader.parse(inputSource);
return parsed;
} catch (SAXException e) {
Log.w(TAG, "SAXException - parse: " + e.toString());
return null;
} catch (IOException e) {
Log.w(TAG, "IOException - parse: " + e.toString());
return null;
}
}
}