Inital commit

This commit is contained in:
Tilman
2011-10-26 09:44:02 +02:00
commit 5971f4b417
1813 changed files with 737837 additions and 0 deletions
+471
View File
@@ -0,0 +1,471 @@
/* Copyright (c) 2008 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package sample.books;
import com.google.gdata.client.Service;
import com.google.gdata.client.books.BooksService;
import com.google.gdata.client.books.VolumeQuery;
import sample.util.SimpleCommandLineParser;
import com.google.gdata.data.Category;
import com.google.gdata.data.books.BooksCategory;
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.Title;
import com.google.gdata.data.extensions.Rating;
import com.google.gdata.util.AuthenticationException;
import com.google.gdata.util.ServiceException;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.List;
/**
* Demonstrates Books API operations using the Java client library.
*/
public class BooksClient {
protected BooksClient() {}
/**
* Input stream for reading user input.
*/
private static final BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(System.in));
/**
* The name of the server hosting the YouTube GDATA feeds.
*/
public static final String BOOKS_GDATA_SERVER = "http://books.google.com";
/**
* The URL of the volumes feed
*/
public static final String VOLUMES_FEED = BOOKS_GDATA_SERVER
+ "/books/feeds/volumes";
/**
* The URL of the user library feeds
*/
public static final String USER_LIBRARY_FEED = BOOKS_GDATA_SERVER
+ "/books/feeds/users/me/collections/library/volumes";
/**
* The URL of the user annotation feed
*/
public static final String USER_ANNOTATION_FEED = BOOKS_GDATA_SERVER
+ "/books/feeds/users/me/volumes";
/**
* Searches the VOLUMES_FEED for search terms and print each resulting
* VolumeEntry.
*
* @param service a BooksService object.
* @param authenticated whether the user is authenticated.
* @throws ServiceException
* If the service is unable to handle the request.
* @throws IOException error sending request or reading the feed.
*/
private static void searchVolumes(BooksService service,
boolean authenticated)
throws IOException, ServiceException {
VolumeQuery query = new VolumeQuery(new URL(VOLUMES_FEED));
// exclude no-preview book (by default, they are included)
query.setMinViewability(VolumeQuery.MinViewability.PARTIAL);
System.out.println("\nEnter search terms: ");
String searchTerms = readLine();
System.out.println();
query.setFullTextQuery(searchTerms);
printUnderlined("Running Search for '" + searchTerms + "'");
VolumeFeed volumeFeed = service.query(query, VolumeFeed.class);
printVolumeFeed(volumeFeed);
if (authenticated) {
handleSearchVolumes(service, volumeFeed);
}
}
/**
* Handle options after displaying a search feed, specifically reviewing or
* adding to the user's library.
*
* @param service a BooksService object.
* @param volumeFeed a volume feed object.
* @throws ServiceException
* If the service is unable to handle the request.
* @throws IOException error sending request or reading the feed.
*/
private static void handleSearchVolumes(BooksService service,
VolumeFeed volumeFeed)
throws IOException, ServiceException {
while (true) {
System.out.println("\nWhat would you like to do?");
System.out.println("\t1) Add a volume to my library");
System.out.println("\t2) Submit a rating for a volume");
System.out.println("\t0) Back to main menu");
System.out.println("\nEnter Number (0-2): ");
int choice = readInt();
String volumeId;
switch (choice) {
case 1:
volumeId = readVolumeId(volumeFeed);
if (!volumeId.equals("")) {
addToLibrary(service, volumeId);
}
break;
case 2:
volumeId = readVolumeId(volumeFeed);
System.out.println("Please input a rating value (1-5)");
int rating = readInt();
if (rating >= 1 && rating <= 5 && !volumeId.equals("")) {
addRating(service, volumeId, rating);
}
break;
case 0:
default:
return;
}
}
}
/**
* Prints a String, a newline, and a number of '-' characters equal to the
* String's length.
*
* @param stringToUnderline - the string to print underlined
*/
private static void printUnderlined(String stringToUnderline) {
System.out.println(stringToUnderline);
for (int i = 0; i < stringToUnderline.length(); ++i) {
System.out.print("-");
}
System.out.println("\n");
}
/**
* Adds a volume to the user's library
*
* @param service a BooksService object.
* @param volumeId The volume id to insert
* @throws IOException Error sending request or reading the feed.
* @throws ServiceException If the service is unable to handle the request.
*/
private static void addToLibrary(BooksService service, String volumeId)
throws IOException, ServiceException {
VolumeEntry newEntry = new VolumeEntry();
newEntry.setId(volumeId);
try {
service.insert(new URL(USER_LIBRARY_FEED), newEntry);
} catch (ServiceException se) {
System.out.println("There was an error adding your volume.\n");
return;
}
System.out.println("Added " + volumeId);
}
/**
* Adds a rating for a volume
*
* @param service a BooksService object.
* @param volumeId The volume id to rate
* @param value The rating to insert
* @throws IOException Error sending request or reading the feed.
* @throws ServiceException If the service is unable to handle the request.
*/
private static void addRating(BooksService service,
String volumeId, int value)
throws IOException, ServiceException {
VolumeEntry newEntry = new VolumeEntry();
newEntry.setId(volumeId);
Rating rating = new Rating();
rating.setMin(1);
rating.setMax(5);
rating.setValue(value);
newEntry.setRating(rating);
try {
service.insert(new URL(USER_ANNOTATION_FEED), newEntry);
} catch (ServiceException se) {
System.out.println("There was an error adding your rating.\n");
return;
}
System.out.println("Added rating for " + volumeId);
}
/**
* Prints a VolumeEntry
*
* @param entry The VolumeEntry to be printed
* @throws IOException Error sending request or reading the feed.
* @throws ServiceException If the service is unable to handle the request.
*/
private static void printVolumeEntry(VolumeEntry entry) throws IOException,
ServiceException {
System.out.print("Title: ");
for (Title t : entry.getTitles()) {
System.out.print(t.getValue() + "\t");
}
System.out.println();
System.out.print("Author: ");
for (Creator c : entry.getCreators()) {
System.out.print(c.getValue() + "\t");
}
System.out.println();
if (entry.hasRating()) {
System.out.println("Rating: " + entry.getRating().getAverage());
}
if (entry.hasReview()) {
System.out.println("Review: " + entry.getReview().getValue());
}
boolean firstLabel = true;
if (entry.getCategories().size() > 0) {
for (Category c : entry.getCategories()) {
if (c.getScheme() == BooksCategory.Scheme.LABELS_SCHEME) {
if (firstLabel) {
System.out.print("Labels: ");
firstLabel = false;
}
System.out.print(c.getTerm() + "\t");
}
}
if (!firstLabel) {
System.out.println();
}
}
if (entry.hasViewability()) {
System.out.println("Viewability: " + entry.getViewability().getValue());
}
System.out.println();
}
/**
* Show the feed of user annotations.
*
* @param service A BooksService object.
* @throws IOException Error sending request or reading the feed.
* @throws ServiceException If the service is unable to handle the request.
*/
private static void showUserAnnotations(Service service)
throws IOException, ServiceException {
VolumeFeed volumeFeed = service.getFeed(new URL(USER_ANNOTATION_FEED),
VolumeFeed.class);
printVolumeFeed(volumeFeed);
}
/**
* Show the feed of user annotations.
*
* @param service A BooksService object.
* @throws IOException Error sending request or reading the feed.
* @throws ServiceException If the service is unable to handle the request.
*/
private static void showUserLibrary(Service service)
throws IOException, ServiceException {
VolumeFeed volumeFeed = service.getFeed(new URL(USER_LIBRARY_FEED),
VolumeFeed.class);
printVolumeFeed(volumeFeed);
}
/**
* Reads a line of text from the standard input.
*
* @throws IOException If unable to read a line from the standard input.
* @return A line of text read from the standard input.
*/
private static String readLine() throws IOException {
return bufferedReader.readLine();
}
/**
* Reads a line of text from the standard input and returns the parsed
* integer representation.
*
* @throws IOException If unable to read a line from the standard input.
* @return An integer read from the standard input.
*/
private static int readInt() throws IOException {
String input = readLine();
try {
return Integer.parseInt(input);
} catch (NumberFormatException nfe) {
return 0;
}
}
/**
* Solicits the user for the index of a volume in a list
*
* @param volumeFeed A volume Feed.
* @return String containing a volume ID.
* @throws IOException If there are problems reading user input.
*/
private static String readVolumeId(VolumeFeed volumeFeed) throws IOException {
System.out.println("Input the index of one of the volumes listed above (1-"
+ volumeFeed.getEntries().size() + ")");
int input = readInt();
if (input == 0) {
return "";
}
return volumeFeed.getEntries().get(input - 1).getId();
}
/**
* Displays a menu of the main activities a user can perform.
*/
private static void printMenu() {
System.out.println("\n");
System.out.println("Choose one of the following demo options:");
System.out.println("\t1) Search for books");
System.out.println("\t2) My list of books (requires authentication)");
System.out.println("\t3) My annotations (requires authentication)");
System.out.println("\t0) Exit");
System.out.println("\nEnter Number (0-3): ");
}
/**
* Shows the usage of how to run the sample from the command-line.
*/
private static void printUsage() {
System.out.println("Usage:\n java BooksClient.jar");
System.out.println("or with authentication:\n java BooksClient.jar "
+ " --username <user@gmail.com> " + " --password <pass> ");
}
/**
* Print a volume feed of entries as a numbered list
*
* @param volumeFeed A feed of volumes
* @throws IOException Error sending request or reading the feed.
* @throws ServiceException If the service is unable to handle the request.
*/
private static void printVolumeFeed(VolumeFeed volumeFeed)
throws IOException, ServiceException {
String title = volumeFeed.getTitle().getPlainText();
System.out.println(title);
List<VolumeEntry> volumeEntries = volumeFeed.getEntries();
if (volumeEntries.size() == 0) {
System.out.println("This feed contains no entries.");
return;
}
System.out.println("Results " + volumeFeed.getStartIndex() + " - " +
(volumeFeed.getStartIndex() + volumeEntries.size() - 1) +
" of " + volumeFeed.getTotalResults());
System.out.println();
int count = 1;
for (VolumeEntry entry : volumeEntries) {
System.out.println("(Volume #" + String.valueOf(count) + ")");
printVolumeEntry(entry);
count++;
}
System.out.println();
}
/**
* BooksClient is a sample command line application that
* demonstrates many features of the Books Data API using the Java Client
* library.
*
* This sample demonstrates both search and social activities in the API.
* Social activities are only available to authenticated users.
*
* @param args Used to pass the username and password of a test account.
*/
public static void main(String[] args) {
SimpleCommandLineParser parser = new SimpleCommandLineParser(args);
String username = parser.getValue("username", "user", "u");
String password = parser.getValue("password", "pass", "p");
boolean help = parser.containsKey("help", "h");
boolean authenticated = (username != null) && (password != null);
if (help) {
printUsage();
System.exit(1);
}
BooksService service = new BooksService("gdataSample-Books-1");
if (authenticated) {
try {
service.setUserCredentials(username, password);
} catch (AuthenticationException e) {
System.out.println("Invalid login credentials.");
System.exit(1);
}
}
while (true) {
try {
printMenu();
int choice = readInt();
switch (choice) {
case 1:
// Search for books
searchVolumes(service, authenticated);
break;
case 2:
// View the user's library
if (authenticated) {
showUserLibrary(service);
} else {
System.out.println("You need to specify a user account");
printUsage();
}
break;
case 3:
// View the user's annotations
if (authenticated) {
showUserAnnotations(service);
} else {
System.out.println("You need to specify a user account");
printUsage();
}
break;
case 0:
default:
System.out.println("Bye!");
System.exit(0);
}
} catch (IOException e) {
// Communications error
System.err.println(
"There was a problem communicating with the service.");
e.printStackTrace();
} catch (ServiceException e) {
// Server side error
System.err.println("The server had a problem handling your request.");
e.printStackTrace();
}
}
}
}
+23
View File
@@ -0,0 +1,23 @@
Google Books Data API Java Samples - README.txt
-------------------------------------------------
The Java Books sample is a simple application that shows sample usage
of the various feeds that comprise the Book Search Data API. It works
in two modes. On the one hand as a readonly sample that allows
anonymous searching for volumes; on the other hand as an authenticated
application that performs read and write on the user's annotation and
my library feeds.
The application can be built and run using the provided Ant build file found at
gdata/java/build-samples.xml. The sample can be run in the following manner:
1. Invoke the samples using the appropriate command line:
ant -f gdata/java/build-samples.xml sample.books.run
or
ant -f gdata/java/build-samples.xml sample.books.run --username
<username> --password <password>
Binary file not shown.