Updated the reader to use a DOM Document rather than XML Reader

master
Omertron 16 years ago
parent 50221b7702
commit c1f2bb663a

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2004-2009 YAMJ Members * Copyright (c) 2004-2010 YAMJ Members
* http://code.google.com/p/moviejukebox/people/list * http://code.google.com/p/moviejukebox/people/list
* *
* Web: http://code.google.com/p/moviejukebox/ * Web: http://code.google.com/p/moviejukebox/
@ -13,25 +13,35 @@
package com.moviejukebox.themoviedb; package com.moviejukebox.themoviedb;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.util.Iterator;
import java.util.logging.ConsoleHandler; import java.util.logging.ConsoleHandler;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.xml.stream.XMLEventReader; import javax.xml.parsers.DocumentBuilder;
import javax.xml.stream.XMLStreamException; import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.stream.events.Attribute; import javax.xml.parsers.ParserConfigurationException;
import javax.xml.stream.events.EndElement;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;
import com.moviejukebox.themoviedb.model.*; import org.w3c.dom.Document;
import com.moviejukebox.themoviedb.tools.*; import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import com.moviejukebox.themoviedb.model.Artwork;
import com.moviejukebox.themoviedb.model.Category;
import com.moviejukebox.themoviedb.model.Country;
import com.moviejukebox.themoviedb.model.MovieDB;
import com.moviejukebox.themoviedb.model.Person;
import com.moviejukebox.themoviedb.tools.LogFormatter;
/** /**
* This is the main class for the API to connect to TheMovieDb.org The implementation is for v2.1 of the API as detailed here * This is the main class for the API to connect to TheMovieDb.org The implementation is for v2.1
* http://api.themoviedb.org/2.1/docs/ * of the API as detailed here http://api.themoviedb.org/2.1/docs/
* *
* @author Stuart.Boston * @author Stuart.Boston
* @version 1.1 * @version 1.1
@ -80,8 +90,8 @@ public class TheMovieDb {
* @return A movie bean with the data extracted * @return A movie bean with the data extracted
*/ */
public MovieDB moviedbSearch(String movieTitle, String language) { public MovieDB moviedbSearch(String movieTitle, String language) {
XMLEventReader xmlReader = null;
MovieDB movie = null; MovieDB movie = null;
Document doc = null;
language = validateLanguage(language); language = validateLanguage(language);
@ -91,12 +101,11 @@ public class TheMovieDb {
try { try {
String searchUrl = buildSearchUrl("Movie.search", URLEncoder.encode(movieTitle, "UTF-8"), language); String searchUrl = buildSearchUrl("Movie.search", URLEncoder.encode(movieTitle, "UTF-8"), language);
xmlReader = XMLHelper.getEventReader(searchUrl); doc = getEventDocFromUrl(searchUrl);
movie = parseMovieInfo(xmlReader); movie = parseMovieInfo(doc);
} catch (Exception error) { } catch (Exception error) {
System.err.println("ERROR: TheMovieDb API -> " + error.getMessage()); logger.severe("ERROR: " + error.getMessage());
} finally {
XMLHelper.closeEventReader(xmlReader);
} }
return movie; return movie;
} }
@ -109,8 +118,8 @@ public class TheMovieDb {
* @return A movie bean with the data extracted * @return A movie bean with the data extracted
*/ */
public MovieDB moviedbImdbLookup(String imdbID, String language) { public MovieDB moviedbImdbLookup(String imdbID, String language) {
XMLEventReader xmlReader = null;
MovieDB movie = null; MovieDB movie = null;
Document doc = null;
language = validateLanguage(language); language = validateLanguage(language);
@ -120,12 +129,14 @@ public class TheMovieDb {
try { try {
String searchUrl = buildSearchUrl("Movie.imdbLookup", imdbID, language); String searchUrl = buildSearchUrl("Movie.imdbLookup", imdbID, language);
xmlReader = XMLHelper.getEventReader(searchUrl); //xmlReader = XMLHelper.getEventReader(searchUrl);
movie = parseMovieInfo(xmlReader); //movie = parseMovieInfo(xmlReader);
doc = getEventDocFromUrl(searchUrl);
movie = parseMovieInfo(doc);
} catch (Exception error) { } catch (Exception error) {
System.err.println("ERROR: TheMovieDb API -> " + error.getMessage()); logger.severe("ERROR: " + error.getMessage());
} finally {
XMLHelper.closeEventReader(xmlReader);
} }
return movie; return movie;
} }
@ -155,7 +166,7 @@ public class TheMovieDb {
* @return A movie bean with all of the information * @return A movie bean with all of the information
*/ */
public MovieDB moviedbGetInfo(String tmdbID, MovieDB movie, String language) { public MovieDB moviedbGetInfo(String tmdbID, MovieDB movie, String language) {
XMLEventReader xmlReader = null; Document doc = null;
// If the tmdbID is null, then exit // If the tmdbID is null, then exit
if (tmdbID == null || tmdbID.equals("") || tmdbID.equalsIgnoreCase("UNKNOWN")) if (tmdbID == null || tmdbID.equals("") || tmdbID.equalsIgnoreCase("UNKNOWN"))
@ -165,12 +176,14 @@ public class TheMovieDb {
try { try {
String searchUrl = buildSearchUrl("Movie.getImages", tmdbID, language); String searchUrl = buildSearchUrl("Movie.getImages", tmdbID, language);
xmlReader = XMLHelper.getEventReader(searchUrl); //xmlReader = XMLHelper.getEventReader(searchUrl);
movie = parseMovieInfo(xmlReader); //movie = parseMovieInfo(xmlReader);
doc = getEventDocFromUrl(searchUrl);
movie = parseMovieInfo(doc);
} catch (Exception error) { } catch (Exception error) {
System.err.println("ERROR: TheMovieDb API -> " + error.getMessage()); logger.severe("ERROR: " + error.getMessage());
} finally {
XMLHelper.closeEventReader(xmlReader);
} }
return movie; return movie;
} }
@ -189,7 +202,7 @@ public class TheMovieDb {
* @return * @return
*/ */
public MovieDB moviedbGetImages(String searchTerm, MovieDB movie, String language) { public MovieDB moviedbGetImages(String searchTerm, MovieDB movie, String language) {
XMLEventReader xmlReader = null; Document doc = null;
// If the searchTerm is null, then exit // If the searchTerm is null, then exit
if (searchTerm == null || searchTerm.equals("") || searchTerm.equalsIgnoreCase("UNKNOWN")) if (searchTerm == null || searchTerm.equals("") || searchTerm.equalsIgnoreCase("UNKNOWN"))
@ -199,410 +212,236 @@ public class TheMovieDb {
try { try {
String searchUrl = buildSearchUrl("Movie.getImages", searchTerm, language); String searchUrl = buildSearchUrl("Movie.getImages", searchTerm, language);
xmlReader = XMLHelper.getEventReader(searchUrl); //xmlReader = XMLHelper.getEventReader(searchUrl);
movie = parseMovieInfo(xmlReader); //movie = parseMovieInfo(xmlReader);
doc = getEventDocFromUrl(searchUrl);
movie = parseMovieInfo(doc);
} catch (Exception error) { } catch (Exception error) {
System.err.println("ERROR: TheMovieDb API -> " + error.getMessage()); logger.severe("ERROR: " + error.getMessage());
} finally {
XMLHelper.closeEventReader(xmlReader);
} }
return movie; return movie;
} }
/** /**
* Search the XML passed and decode to a movieDB bean * This function will check the passed language against a list of known themoviedb.org languages
* * Currently the only available language is English "en" and so that is what this function returns
* @param xmlReader * @param language
* The XML stream read from TheMovieDB.org * @return
* @return a MovieDB bean with the data
* @throws XMLStreamException
*/ */
// TODO Waring if match is low (i.e. score != 1.0) private String validateLanguage(String language) {
@SuppressWarnings("unchecked") if (language == null) {
public MovieDB parseMovieInfo(XMLEventReader xmlReader) throws XMLStreamException { language = defaultLanguage;
} else {
language = defaultLanguage;
}
return language;
}
public MovieDB parseMovieInfo(Document doc) {
// Borrowed from http://www.java-tips.org/java-se-tips/javax.xml.parsers/how-to-read-xml-file-in-java.html
MovieDB movie = null; MovieDB movie = null;
NodeList movieNodeList, subNodeList;
Node movieNode, subNode;
Element movieElement, subElement;
try { try {
while (xmlReader.hasNext()) { movie = new MovieDB();
XMLEvent event = xmlReader.nextEvent(); movieNodeList = doc.getElementsByTagName("movie");
if (event.isStartElement()) { // Only get the first movie from the list
StartElement startElement = event.asStartElement(); movieNode = movieNodeList.item(0);
if (startElement.getName().getLocalPart().equalsIgnoreCase("movie")) { if (movieNode.getNodeType() == Node.ELEMENT_NODE) {
movie = new MovieDB(); movieElement = (Element) movieNode;
}
movie.setTitle(getValueFromElement(movieElement, "name"));
if (event.isStartElement()) { movie.setPopularity(getValueFromElement(movieElement, "popularity"));
if (event.asStartElement().getName().getLocalPart().equalsIgnoreCase("popularity")) { movie.setType(getValueFromElement(movieElement, "type"));
event = xmlReader.nextEvent(); movie.setId(getValueFromElement(movieElement, "id"));
movie.setPopularity(event.asCharacters().getData()); movie.setImdb(getValueFromElement(movieElement, "imdb_id"));
continue; movie.setUrl(getValueFromElement(movieElement, "url"));
} movie.setOverview(getValueFromElement(movieElement, "overview"));
} movie.setRating(getValueFromElement(movieElement, "rating"));
movie.setReleaseDate(getValueFromElement(movieElement, "released"));
if (event.isStartElement()) { movie.setRuntime(getValueFromElement(movieElement, "runtime"));
if (event.asStartElement().getName().getLocalPart().equalsIgnoreCase("name")) { movie.setBudget(getValueFromElement(movieElement, "budget"));
event = xmlReader.nextEvent(); movie.setRevenue(getValueFromElement(movieElement, "revenue"));
movie.setTitle(event.asCharacters().getData()); movie.setHomepage(getValueFromElement(movieElement, "homepage"));
continue; movie.setTrailer(getValueFromElement(movieElement, "trailer"));
}
} // Process the "categories"
subNodeList = doc.getElementsByTagName("categories");
if (event.isStartElement()) {
if (event.asStartElement().getName().getLocalPart().equalsIgnoreCase("type")) { for (int nodeLoop = 0; nodeLoop < subNodeList.getLength(); nodeLoop++) {
event = xmlReader.nextEvent(); subNode = subNodeList.item(nodeLoop);
movie.setType(event.asCharacters().getData()); if (subNode.getNodeType() == Node.ELEMENT_NODE) {
continue; subElement = (Element) subNode;
} Category category = new Category();
}
category.setType(getValueFromElement(subElement, "type"));
if (event.isStartElement()) { category.setUrl(getValueFromElement(subElement, "url"));
if (event.asStartElement().getName().getLocalPart().equalsIgnoreCase("id")) { category.setName(getValueFromElement(subElement, "name"));
event = xmlReader.nextEvent();
movie.setId(event.asCharacters().getData()); movie.addCategory(category);
continue;
}
}
if (event.isStartElement()) {
if (event.asStartElement().getName().getLocalPart().equalsIgnoreCase("imdb_id")) {
event = xmlReader.nextEvent();
movie.setImdb(event.asCharacters().getData());
continue;
}
}
if (event.isStartElement()) {
if (event.asStartElement().getName().getLocalPart().equalsIgnoreCase("url")) {
event = xmlReader.nextEvent();
movie.setUrl(event.asCharacters().getData());
continue;
}
}
if (event.isStartElement()) {
if (event.asStartElement().getName().getLocalPart().equalsIgnoreCase("overview")) {
event = xmlReader.nextEvent();
movie.setOverview(event.asCharacters().getData());
continue;
}
}
if (event.isStartElement()) {
if (event.asStartElement().getName().getLocalPart().equalsIgnoreCase("rating")) {
event = xmlReader.nextEvent();
movie.setRating(event.asCharacters().getData());
continue;
}
}
if (event.isStartElement()) {
if (event.asStartElement().getName().getLocalPart().equalsIgnoreCase("released")) {
event = xmlReader.nextEvent();
movie.setReleaseDate(event.asCharacters().getData());
continue;
}
}
if (event.isStartElement()) {
if (event.asStartElement().getName().getLocalPart().equalsIgnoreCase("runtime")) {
event = xmlReader.nextEvent();
movie.setRuntime(event.asCharacters().getData());
continue;
}
}
if (event.isStartElement()) {
if (event.asStartElement().getName().getLocalPart().equalsIgnoreCase("budget")) {
event = xmlReader.nextEvent();
movie.setBudget(event.asCharacters().getData());
continue;
}
}
if (event.isStartElement()) {
if (event.asStartElement().getName().getLocalPart().equalsIgnoreCase("revenue")) {
event = xmlReader.nextEvent();
movie.setRevenue(event.asCharacters().getData());
continue;
}
}
if (event.isStartElement()) {
if (event.asStartElement().getName().getLocalPart().equalsIgnoreCase("homepage")) {
event = xmlReader.nextEvent();
movie.setHomepage(event.asCharacters().getData());
continue;
}
}
if (event.isStartElement()) {
if (event.asStartElement().getName().getLocalPart().equalsIgnoreCase("trailer")) {
event = xmlReader.nextEvent();
movie.setTrailer(event.asCharacters().getData());
continue;
} }
} }
if (event.isStartElement()) { // Process the "countries"
if (event.asStartElement().getName().getLocalPart().equalsIgnoreCase("categories")) { subNodeList = doc.getElementsByTagName("countries");
event = xmlReader.nextEvent();
startElement = event.asStartElement(); for (int nodeLoop = 0; nodeLoop < subNodeList.getLength(); nodeLoop++) {
subNode = subNodeList.item(nodeLoop);
if (subNode.getNodeType() == Node.ELEMENT_NODE) {
subElement = (Element) subNode;
Country country = new Country();
while (!event.isEndElement() && !event.asEndElement().getName().getLocalPart().equalsIgnoreCase("category")) { country.setCode(getValueFromElement(subElement, "code"));
Category category = new Category(); country.setUrl(getValueFromElement(subElement, "url"));
Iterator<Attribute> attributes = startElement.getAttributes(); country.setName(getValueFromElement(subElement, "name"));
while (attributes.hasNext()) {
Attribute attribute = attributes.next(); movie.addProductionCountry(country);
if (attribute.getName().toString().equals("type"))
category.setType(attribute.getValue());
if (attribute.getName().toString().equals("url"))
category.setUrl(attribute.getValue());
if (attribute.getName().toString().equals("name"))
category.setName(attribute.getValue());
}
movie.addCategory(category);
}
} }
} }
if (event.isStartElement()) { // Process the "cast"
if (event.asStartElement().getName().getLocalPart().equalsIgnoreCase("countries")) { subNodeList = doc.getElementsByTagName("cast");
event = xmlReader.nextEvent();
startElement = event.asStartElement();
while (!event.isEndElement() && !event.asEndElement().getName().getLocalPart().equalsIgnoreCase("country")) {
Country country = new Country();
Iterator<Attribute> attributes = startElement.getAttributes();
while (attributes.hasNext()) {
Attribute attribute = attributes.next();
if (attribute.getName().toString().equals("code"))
country.setCode(attribute.getValue());
if (attribute.getName().toString().equals("url"))
country.setUrl(attribute.getValue());
if (attribute.getName().toString().equals("name"))
country.setName(attribute.getValue());
}
movie.addProductionCountry(country);
}
}
}
if (event.isStartElement()) { for (int nodeLoop = 0; nodeLoop < subNodeList.getLength(); nodeLoop++) {
if (event.asStartElement().getName().getLocalPart().equalsIgnoreCase("cast")) { subNode = subNodeList.item(nodeLoop);
event = xmlReader.nextEvent(); if (subNode.getNodeType() == Node.ELEMENT_NODE) {
startElement = event.asStartElement(); subElement = (Element) subNode;
Person person = new Person();
while (!event.isEndElement() && !event.asEndElement().getName().getLocalPart().equalsIgnoreCase("person")) {
Person person = new Person(); person.setUrl(getValueFromElement(subElement, "url"));
Iterator<Attribute> attributes = startElement.getAttributes(); person.setName(getValueFromElement(subElement, "name"));
while (attributes.hasNext()) { person.setJob(getValueFromElement(subElement, "job"));
Attribute attribute = attributes.next(); person.setCharacter(getValueFromElement(subElement, "character"));
if (attribute.getName().toString().equals("url")) person.setId(getValueFromElement(subElement, "id"));
person.setUrl(attribute.getValue());
if (attribute.getName().toString().equals("name")) movie.addPerson(person);
person.setName(attribute.getValue());
if (attribute.getName().toString().equals("job"))
person.setJob(attribute.getValue());
if (attribute.getName().toString().equals("character"))
person.setCharacter(attribute.getValue());
if (attribute.getName().toString().equals("id"))
person.setId(attribute.getValue());
}
movie.addPerson(person);
}
} }
} }
/* /*
* This processes the image elements. There are two formats to deal with: * This processes the image elements. There are two formats to deal with:
* Movie.imdbLookup, Movie.getInfo & Movie.search: * Movie.imdbLookup, Movie.getInfo & Movie.search:
* <images> * <images>
* <image type="poster" size="original" url="http://images.themoviedb.org/posters/60366/Fight_Club.jpg" id="60366"/> * <image type="poster" size="original" url="http://images.themoviedb.org/posters/60366/Fight_Club.jpg" id="60366"/>
* <image type="backdrop" size="original" url="http://images.themoviedb.org/backdrops/56444/bscap00144.jpg" id="56444"/> * <image type="backdrop" size="original" url="http://images.themoviedb.org/backdrops/56444/bscap00144.jpg" id="56444"/>
* </images> * </images>
* *
* Movie.getImages: * Movie.getImages:
* <images> * <images>
* <poster id="17066"> * <poster id="17066">
* <image url="http://images.themoviedb.org/posters/17066/Fight_Club.jpg" size="original"/> * <image url="http://images.themoviedb.org/posters/17066/Fight_Club.jpg" size="original"/>
* <image url="http://images.themoviedb.org/posters/17066/Fight_Club_thumb.jpg" size="thumb"/> * <image url="http://images.themoviedb.org/posters/17066/Fight_Club_thumb.jpg" size="thumb"/>
* <image url="http://images.themoviedb.org/posters/17066/Fight_Club_cover.jpg" size="cover"/> * <image url="http://images.themoviedb.org/posters/17066/Fight_Club_cover.jpg" size="cover"/>
* <image url="http://images.themoviedb.org/posters/17066/Fight_Club_mid.jpg" size="mid"/> * <image url="http://images.themoviedb.org/posters/17066/Fight_Club_mid.jpg" size="mid"/>
* </poster> * </poster>
* <backdrop id="18593"> * <backdrop id="18593">
* <image url="http://images.themoviedb.org/backdrops/18593/Fight_Club_on_the_street1.jpg" size="original"/> * <image url="http://images.themoviedb.org/backdrops/18593/Fight_Club_on_the_street1.jpg" size="original"/>
* <image url="http://images.themoviedb.org/backdrops/18593/Fight_Club_on_the_street1_poster.jpg" size="poster"/> * <image url="http://images.themoviedb.org/backdrops/18593/Fight_Club_on_the_street1_poster.jpg" size="poster"/>
* <image url="http://images.themoviedb.org/backdrops/18593/Fight_Club_on_the_street1_thumb.jpg" size="thumb"/> * <image url="http://images.themoviedb.org/backdrops/18593/Fight_Club_on_the_street1_thumb.jpg" size="thumb"/>
* </backdrop> * </backdrop>
* </images> * </images>
*/ */
if (checkStartEvent(event, "images")) { subNodeList = doc.getElementsByTagName("images");
event = xmlReader.nextEvent();
for (int nodeLoop = 0; nodeLoop < subNodeList.getLength(); nodeLoop++) {
subNode = subNodeList.item(nodeLoop);
while (!checkEndEvent(event, "images")) { if (subNode.getNodeType() == Node.ELEMENT_NODE) {
if (checkStartEvent(event, "image")) { System.out.println("Element Node: " + subNode.getNodeName() + " Attribs: " + subNode.hasAttributes() + " Children: " + subNode.hasChildNodes());
Artwork artwork = new Artwork();
Iterator<Attribute> attributes = event.asStartElement().getAttributes();
while (attributes.hasNext()) {
Attribute attribute = attributes.next();
if (attribute.getName().toString().equalsIgnoreCase("type"))
artwork.setType(attribute.getValue());
if (attribute.getName().toString().equalsIgnoreCase("size"))
artwork.setSize(attribute.getValue());
if (attribute.getName().toString().equalsIgnoreCase("url"))
artwork.setUrl(attribute.getValue());
if (attribute.getName().toString().equalsIgnoreCase("id"))
artwork.setId(attribute.getValue());
}
event = xmlReader.nextEvent(); // Skip the characters at the end of the attributes
movie.addArtwork(artwork);
}
if (checkStartEvent(event, "poster")) { NodeList artworkNodeList = subNode.getChildNodes();
Artwork artwork = new Artwork(); for (int artworkLoop = 0; artworkLoop < artworkNodeList.getLength(); artworkLoop++) {
String imageId = getImageId(event); Node artworkNode = artworkNodeList.item(artworkLoop);
event = xmlReader.nextEvent(); // Skip the characters at the end of the attributes if (artworkNode.getNodeType() == Node.ELEMENT_NODE) {
event = xmlReader.nextEvent(); subElement = (Element) artworkNode;
while (!checkEndEvent(event, "poster")) { if (subElement.getNodeName().equalsIgnoreCase("image")) {
artwork = new Artwork(); // This is the format used in Movie.imdbLookup, Movie.getInfo & Movie.search
artwork.setType(Artwork.ARTWORK_TYPE_POSTER); Artwork artwork = new Artwork();
artwork.setId(imageId); artwork.setType(subElement.getAttribute("type"));
artwork.setSize(subElement.getAttribute("size"));
if (checkStartEvent(event, "image")) { artwork.setUrl(subElement.getAttribute("url"));
Iterator<Attribute> attributes = event.asStartElement().getAttributes(); artwork.setId(subElement.getAttribute("id"));
while (attributes.hasNext()) {
Attribute attribute = attributes.next();
if (attribute.getName().toString().equalsIgnoreCase("url"))
artwork.setUrl(attribute.getValue());
if (attribute.getName().toString().equalsIgnoreCase("size"))
artwork.setSize(attribute.getValue());
}
event = xmlReader.nextEvent(); // Skip the characters at the end of the attributes
movie.addArtwork(artwork); movie.addArtwork(artwork);
} } else if (subElement.getNodeName().equalsIgnoreCase("backdrop") ||
event = xmlReader.nextEvent(); subElement.getNodeName().equalsIgnoreCase("poster")) {
} // This is the format used in Movie.getImages
} String artworkId = subElement.getAttribute("id");
String artworkType = subElement.getNodeName();
if (checkStartEvent(event, "backdrop")) {
Artwork artwork = new Artwork(); // We need to decode and loop round the child nodes to get the data
String imageId = getImageId(event); NodeList imageNodeList = subElement.getChildNodes();
event = xmlReader.nextEvent(); // Skip the characters at the end of the attributes for (int imageLoop = 0; imageLoop < imageNodeList.getLength(); imageLoop++) {
event = xmlReader.nextEvent(); Node imageNode = imageNodeList.item(imageLoop);
if (imageNode.getNodeType() == Node.ELEMENT_NODE) {
while (!checkEndEvent(event, "backdrop")) { Element imageElement = (Element) imageNode;
artwork = new Artwork(); Artwork artwork = new Artwork();
artwork.setType(Artwork.ARTWORK_TYPE_BACKDROP); artwork.setId(artworkId);
artwork.setId(imageId); artwork.setType(artworkType);
artwork.setUrl(imageElement.getAttribute("url"));
if (checkStartEvent(event, "image")) { artwork.setSize(imageElement.getAttribute("size"));
Iterator<Attribute> attributes = event.asStartElement().getAttributes(); movie.addArtwork(artwork);
while (attributes.hasNext()) { }
Attribute attribute = attributes.next();
if (attribute.getName().toString().equalsIgnoreCase("url"))
artwork.setUrl(attribute.getValue());
if (attribute.getName().toString().equalsIgnoreCase("size"))
artwork.setSize(attribute.getValue());
} }
event = xmlReader.nextEvent(); // Skip the characters at the end of the attributes } else {
movie.addArtwork(artwork); // This is a classic, it should never happen error
logger.severe("UNKNOWN Image type");
} }
event = xmlReader.nextEvent();
} }
} }
event = xmlReader.nextEvent(); }
} // While "images"
} // If "images"
} // if start element
if (event.isEndElement()) {
EndElement endElement = event.asEndElement();
if (endElement.getName().getLocalPart().equalsIgnoreCase("movie")) {
break;
} }
} }
}
} catch (Exception error) { } catch (Exception error) {
System.err.println("Error: " + error.getMessage()); logger.severe("ERROR: " + error.getMessage());
error.printStackTrace(); error.printStackTrace();
} }
return movie; return movie;
} }
/** /**
* Check to see if the event passed is a start element and matches the eventName * Gets the string value of the tag element name passed
* @param event * @param element
* @param endString * @param tagName
* @return True if the event is an end element and matches the eventName * @return
*/
private boolean checkStartEvent(XMLEvent event, String eventName) {
boolean validElement = false;
if (event.isStartElement()) {
if (event.asStartElement().getName().getLocalPart().equalsIgnoreCase(eventName)) {
validElement = true;
}
}
return validElement;
}
/**
* Check to see if the event passed is an end element and matches the eventName
* @param event
* @param endString
* @return True if the event is an end element and matches the eventName
*/ */
private boolean checkEndEvent(XMLEvent event, String eventName) { private String getValueFromElement(Element element, String tagName) {
boolean validElement = false; String returnValue = "";
if (event.isEndElement()) {
if (event.asEndElement().getName().getLocalPart().equalsIgnoreCase(eventName)) {
validElement = true;
}
}
return validElement;
}
/**
* Find the ID in the element attributes
* @param event
* @return the imageId
*/
@SuppressWarnings({"unchecked"})
private String getImageId(XMLEvent event) {
String imageId = null;
try { try {
// read the id attribute from the element NodeList elementNodeList = element.getElementsByTagName(tagName);
Iterator<Attribute> attributes = event.asStartElement().getAttributes(); Element tagElement = (Element) elementNodeList.item(0);
while (attributes.hasNext()) { NodeList tagNodeList = tagElement.getChildNodes();
Attribute attribute = attributes.next(); returnValue = ((Node) tagNodeList.item(0)).getNodeValue();
if (attribute.getName().toString().equalsIgnoreCase("id")) } catch (Exception ignore) {
imageId = attribute.getValue(); return returnValue;
}
} catch (Exception error) {
imageId = null;
} }
return imageId; return returnValue;
} }
/** /**
* This function will check the passed language against a list of known themoviedb.org languages * Get a DOM document from the supplied URL
* Currently the only available language is English "en" and so that is what this function returns * @param url
* @param language
* @return * @return
* @throws MalformedURLException
* @throws IOException
* @throws ParserConfigurationException
* @throws SAXException
*/ */
private String validateLanguage(String language) { public static Document getEventDocFromUrl(String url) throws MalformedURLException, IOException, ParserConfigurationException, SAXException {
if (language == null) { InputStream in = (new URL(url)).openStream();
language = defaultLanguage; DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
} else { DocumentBuilder db = dbf.newDocumentBuilder();
language = defaultLanguage; Document doc = db.parse(in);
} doc.getDocumentElement().normalize();
return language; return doc;
} }
} }

@ -1,61 +0,0 @@
/*
* Copyright (c) 2004-2009 YAMJ Members
* http://code.google.com/p/moviejukebox/people/list
*
* Web: http://code.google.com/p/moviejukebox/
*
* This software is licensed under a Creative Commons License
* See this page: http://code.google.com/p/moviejukebox/wiki/License
*
* For any reuse or distribution, you must make clear to others the
* license terms of this work.
*/
package com.moviejukebox.themoviedb.tools;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
/**
*
* @author altman.matthew (Original)
* @author stuart.boston
*/
public class XMLHelper {
public static XMLEventReader getEventReader(String url) throws IOException, XMLStreamException {
InputStream in = (new URL(url)).openStream();
return XMLInputFactory.newInstance().createXMLEventReader(in);
}
public static void closeEventReader(XMLEventReader reader) {
if (reader != null) {
try {
reader.close();
} catch (XMLStreamException ex) {
System.err.println("ERROR: TheMovieDb API -> " + ex.getMessage());
}
}
}
public static String getCData(XMLEventReader r) throws XMLStreamException {
StringBuffer sb = new StringBuffer();
while (r.peek().isCharacters()) {
sb.append(r.nextEvent().asCharacters().getData());
}
return sb.toString().trim();
}
public static int parseInt(XMLEventReader r) throws XMLStreamException {
int i = 0;
String val = getCData(r);
if (val != null && !val.isEmpty()) {
i = Integer.parseInt(val);
}
return i;
}
}
Loading…
Cancel
Save