Better error trapping with Movie.getInfo and DOMHelper

master
Omertron 15 years ago
parent 367fb6b3f0
commit 868a4ac7a9

@ -127,7 +127,7 @@ public class TheMovieDb {
Document doc = null; Document doc = null;
try { try {
String searchUrl = buildSearchUrl("Movie.search", URLEncoder.encode(movieTitle, "UTF-8"), validateLanguage(language)); String searchUrl = buildSearchUrl("Movie.search", URLEncoder.encode(movieTitle, "UTF-8"), language);
doc = DOMHelper.getEventDocFromUrl(searchUrl); doc = DOMHelper.getEventDocFromUrl(searchUrl);
NodeList nlMovies = doc.getElementsByTagName("movie"); NodeList nlMovies = doc.getElementsByTagName("movie");
if (nlMovies == null) { if (nlMovies == null) {
@ -168,7 +168,7 @@ public class TheMovieDb {
Document doc = null; Document doc = null;
try { try {
String searchUrl = buildSearchUrl("Movie.imdbLookup", imdbID, validateLanguage(language)); String searchUrl = buildSearchUrl("Movie.imdbLookup", imdbID, language);
doc = DOMHelper.getEventDocFromUrl(searchUrl); doc = DOMHelper.getEventDocFromUrl(searchUrl);
NodeList nlMovies = doc.getElementsByTagName("movie"); NodeList nlMovies = doc.getElementsByTagName("movie");
@ -214,16 +214,26 @@ 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) {
// If the tmdbID is null, then exit // If the tmdbID is invalid, then exit
if (!isValidString(tmdbID)) if (!isValidString(tmdbID))
return movie; return movie;
Document doc = null; Document doc = null;
try { try {
String searchUrl = buildSearchUrl("Movie.getInfo", tmdbID, validateLanguage(language)); String searchUrl = buildSearchUrl("Movie.getInfo", tmdbID, language);
doc = DOMHelper.getEventDocFromUrl(searchUrl); doc = DOMHelper.getEventDocFromUrl(searchUrl);
if (doc == null && !language.equalsIgnoreCase(defaultLanguage)) {
logger.fine("Trying to get the default version");
Thread.dumpStack();
searchUrl = buildSearchUrl("Movie.getInfo", tmdbID, defaultLanguage);
}
if (doc == null) {
return movie;
}
NodeList nlMovies = doc.getElementsByTagName("movie"); NodeList nlMovies = doc.getElementsByTagName("movie");
if (nlMovies == null) { if (nlMovies == null) {
return movie; return movie;
@ -237,7 +247,7 @@ public class TheMovieDb {
} }
} }
} catch (Exception error) { } catch (Exception error) {
logger.severe("TheMovieDb Error: " + error.getMessage()); logger.severe("Error: " + error.getMessage());
} }
return movie; return movie;
} }
@ -263,7 +273,7 @@ public class TheMovieDb {
Document doc = null; Document doc = null;
try { try {
String searchUrl = buildSearchUrl("Movie.getImages", searchTerm, validateLanguage(language)); String searchUrl = buildSearchUrl("Movie.getImages", searchTerm, language);
doc = DOMHelper.getEventDocFromUrl(searchUrl); doc = DOMHelper.getEventDocFromUrl(searchUrl);
NodeList nlMovies = doc.getElementsByTagName("movie"); NodeList nlMovies = doc.getElementsByTagName("movie");
@ -303,7 +313,7 @@ public class TheMovieDb {
Document doc = null; Document doc = null;
try { try {
String searchUrl = buildSearchUrl("Person.search", personName, validateLanguage(language)); String searchUrl = buildSearchUrl("Person.search", personName, language);
doc = DOMHelper.getEventDocFromUrl(searchUrl); doc = DOMHelper.getEventDocFromUrl(searchUrl);
person = DOMParser.parsePersonInfo(doc); person = DOMParser.parsePersonInfo(doc);
} catch (Exception error) { } catch (Exception error) {
@ -330,7 +340,7 @@ public class TheMovieDb {
Document doc = null; Document doc = null;
try { try {
String searchUrl = buildSearchUrl("Person.getInfo", personID, validateLanguage(language)); String searchUrl = buildSearchUrl("Person.getInfo", personID, language);
doc = DOMHelper.getEventDocFromUrl(searchUrl); doc = DOMHelper.getEventDocFromUrl(searchUrl);
person = DOMParser.parsePersonInfo(doc); person = DOMParser.parsePersonInfo(doc);
} catch (Exception error) { } catch (Exception error) {
@ -358,7 +368,7 @@ public class TheMovieDb {
Document doc = null; Document doc = null;
try { try {
String searchUrl = buildSearchUrl("Person.getVersion", personID, validateLanguage(language)); String searchUrl = buildSearchUrl("Person.getVersion", personID, language);
doc = DOMHelper.getEventDocFromUrl(searchUrl); doc = DOMHelper.getEventDocFromUrl(searchUrl);
person = DOMParser.parsePersonGetVersion(doc); person = DOMParser.parsePersonGetVersion(doc);
} catch (Exception error) { } catch (Exception error) {
@ -368,33 +378,6 @@ public class TheMovieDb {
return person; return person;
} }
/**
* 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 language
* @return
*/
private String validateLanguage(String language) {
if (!isValidString(language)) {
return defaultLanguage;
} else {
/*
* Rather than check every conceivable language, we'll just validate the format of the language
* The language should either be 2 or 5 characters "xx" or "xx-YY"
* http://api.themoviedb.org/2.1/language-tags
*/
if (language.length() == 2) {
return language.toLowerCase();
} else if (language.length() == 5) {
return language.substring(1, 2).toLowerCase() + "-" + language.substring(4, 5).toUpperCase();
} else {
// The format of the language is wrong, so just cut the first two characters and use that
// The site will take care of invalid languages
return language.substring(1, 2).toLowerCase();
}
}
}
/** /**
* Check the string passed to see if it contains a value. * Check the string passed to see if it contains a value.
* @param testString The string to test * @param testString The string to test

@ -15,6 +15,7 @@ package com.moviejukebox.themoviedb.tools;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.logging.Logger;
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilderFactory;
@ -26,12 +27,15 @@ import org.w3c.dom.Node;
import org.w3c.dom.NodeList; import org.w3c.dom.NodeList;
import org.xml.sax.SAXException; import org.xml.sax.SAXException;
import com.moviejukebox.themoviedb.TheMovieDb;
/** /**
* Generic set of routines to process the DOM model data * Generic set of routines to process the DOM model data
* @author Stuart * @author Stuart
* *
*/ */
public class DOMHelper { public class DOMHelper {
static Logger logger = TheMovieDb.getLogger();
/** /**
* Gets the string value of the tag element name passed * Gets the string value of the tag element name passed
@ -66,14 +70,35 @@ public class DOMHelper {
throws IOException, ParserConfigurationException, SAXException { throws IOException, ParserConfigurationException, SAXException {
Document doc = null; Document doc = null;
InputStream in = null; InputStream in = null;
String webPage = null;
try { try {
String webPage = WebBrowser.request(url); boolean validWebPage = false;
webPage = WebBrowser.request(url);
// There seems to be an error with some of the web pages that returns garbage
if (webPage.startsWith("<?xml version")) {
// This looks like a valid web page
validWebPage = true;
} else {
logger.fine("Error with API Call for: " + url);
return null;
}
if (validWebPage) {
in = new ByteArrayInputStream(webPage.getBytes("UTF-8")); in = new ByteArrayInputStream(webPage.getBytes("UTF-8"));
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder(); DocumentBuilder db = dbf.newDocumentBuilder();
doc = db.parse(in); doc = db.parse(in);
doc.getDocumentElement().normalize(); doc.getDocumentElement().normalize();
}
} catch (Exception error) {
logger.fine("Error parsing: " + url);
// Some sort of error occurred getting the data, so clear the document
doc = null;
} finally { } finally {
if (in != null) { if (in != null) {
in.close(); in.close();

Loading…
Cancel
Save