package model.collector.chartlyrics;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.SocketException;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import model.collector.Lyrics;
public class XMLLyricsParser {
/**
* the logger
*/
private final Logger logger = Logger.getLogger(this.getClass().getName());
/**
* the lyrics
*/
private Lyrics lyrics;
/**
* the lyrics text buffer
*/
private StringBuffer lyricsBuffer;
/**
* gets the lyrics
*
* @return the lyrics
*/
public Lyrics getLyrics() {
return this.lyrics;
}
/**
* Constructor
*
* @param url
* the url where to find the xml code
*
* @throws MalformedURLException
* @throws XMLStreamException
* @throws IOException
* @throws SocketException
*/
public XMLLyricsParser(String url) throws MalformedURLException, XMLStreamException, IOException, SocketException {
logger.log(Level.FINER, "parse track xml. URL: " + url);
this.lyrics = new Lyrics();
this.lyricsBuffer = new StringBuffer();
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader parser = factory.createXMLStreamReader(new URL(url).openStream());
extract(parser);
}
/**
* extracs the lyrics
*
* @param parser
* the parser
*
* @throws XMLStreamException
*/
private void extract(XMLStreamReader parser) throws XMLStreamException {
while (parser.hasNext()) {
switch (parser.getEventType()) {
case XMLStreamConstants.START_ELEMENT: {
if (parser.getLocalName().equalsIgnoreCase("LyricSong")) {
parser.next();
if (parser.getEventType() == XMLStreamConstants.CHARACTERS)
this.lyrics.setTitle(parser.getText());
} else if (parser.getLocalName().equalsIgnoreCase("LyricArtist")) {
parser.next();
if (parser.getEventType() == XMLStreamConstants.CHARACTERS)
this.lyrics.setArtist(parser.getText());
} else if (parser.getLocalName().equalsIgnoreCase("Lyric")) {
extractLyrics(parser);
}
break;
}
case XMLStreamConstants.END_ELEMENT: {
if (parser.getLocalName().equalsIgnoreCase("GetLyricResult")) {
parser.close();
return;
}
break;
}
case XMLStreamConstants.END_DOCUMENT: {
logger.log(Level.FINER, "Document finished");
parser.close();
return;
}
}
parser.next();
}
}
/**
* extracts the lyrics
*
* @param parser
* the parser
*
* @throws XMLStreamException
*/
private void extractLyrics(XMLStreamReader parser) throws XMLStreamException {
while (parser.hasNext()) {
switch (parser.getEventType()) {
case XMLStreamConstants.CHARACTERS: {
lyricsBuffer.append(parser.getText());
break;
}
case XMLStreamConstants.END_ELEMENT: {
if (parser.getLocalName().equalsIgnoreCase("Lyric")) {
this.lyrics.setLyrics(lyricsBuffer.toString());
return;
}
}
}
parser.next();
}
}
}