/* * Book Catalog - Catalog your book collection. * * Copyright (C) 2009 Joshua Walters * URL: http://joshwalters.com * * This file is part of Book Catalog. * * Book Catalog 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. * * Book Catalog 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 Book Catalog. If not, see . */ package com.joshwalters.bookcatalog.isbnlookup; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.List; import com.google.gdata.client.books.BooksService; import com.google.gdata.client.books.VolumeQuery; import com.google.gdata.data.books.VolumeEntry; import com.google.gdata.data.books.VolumeFeed; import com.google.gdata.data.dublincore.Creator; import com.google.gdata.data.dublincore.Subject; import com.google.gdata.data.dublincore.Title; import com.google.gdata.util.ServiceException; /** * Performs book lookup with GData. * * @author Josh Walters */ public class GDataISBNLookup extends ISBNLookup { /** * Used for looking up the book. */ private BooksService service; /** * The URL for the Google volumes feed. */ public final String FEED_URL = "http://books.google.com/books/feeds/volumes"; /** * Sets up the book service. */ public GDataISBNLookup() { service = new BooksService("BookCatalog-1.0"); } /** * Searches for a book. */ public void searchBooks(String barcode) throws NoBookFound, InvalidSearchTerms { // Clear all the book data fields emptyDataFields(); // Purify the barcode, get the price if possible, and return just the // ISBN ISBN = purifyBarcode(barcode); // Perform the query VolumeQuery query; try { query = new VolumeQuery(new URL(FEED_URL)); query.setFullTextQuery(ISBN); // Only return one result query.setMaxResults(1); VolumeFeed volumeFeed = service.query(query, VolumeFeed.class); // Process the result processVolumeFeed(volumeFeed); } catch (MalformedURLException e) { // Print the error to the error stream System.err.println(e.getMessage()); } catch (IOException e) { // Print the error to the error stream System.err.println(e.getMessage()); } catch (ServiceException e) { // Print the error to the error stream System.err.println(e.getMessage()); } } /** * Processes the result feed to get the book data. * * @param volumeFeed * @throws IOException * @throws ServiceException * @throws NoBookFound */ private void processVolumeFeed(VolumeFeed volumeFeed) throws IOException, ServiceException, NoBookFound { List volumeEntries = volumeFeed.getEntries(); if (volumeEntries.size() == 0) { throw new NoBookFound(); } // Send the data to be stored in the class storeVolumeEntry(volumeEntries.get(0)); } /** * Store the data in the class variables. * * @param entry * @throws IOException * @throws ServiceException */ private void storeVolumeEntry(VolumeEntry entry) throws IOException, ServiceException { // Get the book title(s). for (Title t : entry.getTitles()) { if (title == null) { title = t.getValue(); } else { title += ", " + t.getValue(); } } // Get the book creator(s). for (Creator c : entry.getCreators()) { if (author == null) { author = c.getValue(); } else { author += ", " + c.getValue(); } } // Get the book date. if (entry.getDates().size() > 0) { date = entry.getDates().get(0).getValue(); } // Get the book description. if (entry.getDescriptions().size() > 0) { description = entry.getDescriptions().get(0).getValue(); } // Get the book subject(s). for (Subject s : entry.getSubjects()) { if (subject == null) { subject = s.getValue(); } else { subject += ", " + s.getValue(); } } // Get the book publisher. if (entry.getPublishers().size() > 0) { publisher = entry.getPublishers().get(0).getValue(); } } }