/* 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.photos;
import com.google.gdata.client.Query;
import com.google.gdata.client.photos.PicasawebService;
import com.google.gdata.data.photos.AlbumEntry;
import com.google.gdata.data.photos.AlbumFeed;
import com.google.gdata.data.photos.GphotoEntry;
import com.google.gdata.util.ServiceException;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.URL;
/**
* Demo of partial response and partial patch to change location on photo
* albums.
*
*
*/
public class PicasawebPartialDemo {
/** Picasaweb feed url prefix. */
private static final String API_PREFIX
= "https://picasaweb.google.com/data/feed/api/user/";
/** Input stream for reading user input. */
private static final BufferedReader IN
= new BufferedReader(new InputStreamReader(System.in));
/** Output stream to write program output. */
private static final PrintStream OUT = System.out;
/** Picasaweb service to talk to the server */
private PicasawebService service;
/** Constructor */
private PicasawebPartialDemo(PicasawebService service) {
this.service = service;
}
/**
* Displays a menu of the main activities a user can perform.
*/
private void printMenu() {
OUT.println("\n");
OUT.println("Choose one of the following demo options:");
OUT.println("\t1) Retrieve my albums with location");
OUT.println("\t2) Update location for an album");
OUT.println("\t0) Exit");
OUT.println("\nEnter Number (0-2): ");
}
/**
* Demonstrates use of partial query to retrieve album title and location
* information for user's albums.
*/
private void printAlbumLocation(String uname)
throws IOException, ServiceException {
String albumsUrl = API_PREFIX + uname;
String fields = "entry(title,gphoto:id,gphoto:location)";
Query albumQuery = new Query(new URL(albumsUrl));
albumQuery.setFields(fields);
AlbumFeed feed = service.query(albumQuery, AlbumFeed.class);
for (GphotoEntry entry : feed.getEntries()) {
if (entry instanceof AlbumEntry) {
AlbumEntry albumEntry = (AlbumEntry) entry;
OUT.println(albumEntry.getGphotoId() + ":"
+ albumEntry.getTitle().getPlainText()
+ " (" + albumEntry.getLocation() + ")");
}
}
}
/**
* Demonstrates update operation using partial patch to update location
* string for specified album.
*/
private void updateAlbumLocation(String uname)
throws IOException, ServiceException {
OUT.println("Enter album id to update:");
String albumId = IN.readLine();
// Get the current album entry
String albumEntryUrl = API_PREFIX + uname + "/" + albumId;
String fields = "@gd:etag,gphoto:location";
Query patchQuery = new Query(new URL(albumEntryUrl));
patchQuery.setFields(fields);
AlbumEntry entry = service.getEntry(patchQuery.getUrl(), AlbumEntry.class);
OUT.println("Current location: " + entry.getLocation());
// Update the location in the album entry
OUT.println("Specify new location: ");
String newLocation = IN.readLine();
entry.setLocation(newLocation);
entry.setSelectedFields("gphoto:location");
AlbumEntry updated = service.patch(new URL(albumEntryUrl), fields, entry);
OUT.println("Location set to: " + updated.getLocation());
}
/** Program entry point. */
public static void main(String args[]) throws IOException, ServiceException {
// parse user input
String uname, passwd;
if (args.length == 2) {
uname = args[0];
passwd = args[1];
} else if (args.length != 0) {
OUT.println(
"Syntax: PicasawebCommandLine <username> <password>");
return;
} else {
uname = getString("Username");
passwd = getString("Password");
}
PicasawebService service = new PicasawebService("gdata-PhotosPartialDemo");
service.setUserCredentials(uname, passwd);
PicasawebPartialDemo demo = new PicasawebPartialDemo(service);
while (true) {
try {
demo.printMenu();
int choice = readInt();
switch (choice) {
case 1:
// Prints out the user's uploaded videos
demo.printAlbumLocation(uname);
break;
case 2:
demo.updateAlbumLocation(uname);
break;
case 0:
System.exit(1);
break;
}
} 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();
}
}
}
/** Reads a user string input. */
private static String getString(String name) throws IOException {
OUT.print("Please enter ");
OUT.print(name);
OUT.println(":");
OUT.flush();
String result = IN.readLine();
result = result.trim();
if (result.length() == 0) {
return "-1";
}
return result;
}
/**
* 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 IN.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;
}
}
}