/* 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.photos.PicasawebService;
import com.google.gdata.data.OtherContent;
import com.google.gdata.data.PlainTextConstruct;
import com.google.gdata.data.photos.AlbumEntry;
import com.google.gdata.data.photos.CommentEntry;
import com.google.gdata.data.photos.GphotoEntry;
import com.google.gdata.data.photos.PhotoEntry;
import com.google.gdata.data.photos.TagEntry;
import com.google.gdata.util.ContentType;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Date;
import java.util.List;
/**
* A Command-line application using the PicasawebClient to make calls to the
* Picasa Web Album GData API.
*
*
*/
public class PicasawebCommandLine extends PicasawebClient {
// Input stream for reading user input.
private static final BufferedReader IN
= new BufferedReader(new InputStreamReader(System.in));
/**
* Constructs the command line application.
*/
public PicasawebCommandLine(PicasawebService service, String uname,
String passwd) {
super(service, uname, passwd);
}
/**
* Main loop, runs the client application against the standard service, and
* asks the user for their username and password.
*/
public static void main(String[] args) throws Exception {
try {
PicasawebService service = new PicasawebService("exampleClient");
String uname, passwd;
if (args.length == 2) {
uname = args[0];
passwd = args[1];
} else if (args.length != 0) {
println("Syntax: PicasawebCommandLine <username> <password>");
return;
} else {
uname = getString("Username");
passwd = getString("Password");
}
new PicasawebCommandLine(service, uname, passwd).mainLoop();
} catch (ExitException ee) {
println("Exiting...");
}
}
private void mainLoop() throws Exception {
while (true) {
println("Main Menu:");
println("0) Exit Program");
println("1) Show albums");
println("2) Show user tags");
int choice = getInt("Action");
switch (choice) {
case -1:
continue;
case 0:
return;
case 1:
showAlbums();
break;
case 2:
showUserTags();
break;
default:
println("Invalid choice " + choice);
break;
}
}
}
private void showAlbums() throws Exception {
List<AlbumEntry> albums = getAlbums();
int count = 1;
if (albums.size() == 0) {
println("No albums found.");
} else {
for (AlbumEntry entry : albums) {
println("Album " + count++ + ") " + entry.getTitle().getPlainText());
println(entry.getDescription().getPlainText());
}
}
while (true) {
println("Album Menu:");
println("0) Exit to main menu");
println("1) Show an album's photos");
println("2) Show an album's tags");
println("3) Create a new album");
println("4) Delete an album");
int choice = getInt("Action");
switch (choice) {
case -1:
continue;
case 0:
return;
case 1:
showAlbumPhotos(albums);
break;
case 2:
showAlbumTags(albums);
break;
case 3:
createAlbum();
showAlbums();
return;
case 4:
deleteEntry(albums, "album");
showAlbums();
return;
default:
println("Invalid choice " + choice);
break;
}
}
}
private void showUserTags() throws Exception {
printTags(getTags());
}
private void showAlbumTags(List<AlbumEntry> albums) throws Exception {
AlbumEntry albumEntry;
try {
albumEntry = getEntry(albums, "album");
} catch (ExitException ee) {
return;
}
printTags(getTags(albumEntry));
}
private void createAlbum() throws Exception {
AlbumEntry album = new AlbumEntry();
String title = getString("Title");
album.setTitle(new PlainTextConstruct(title));
String description = getString("Description");
album.setDescription(new PlainTextConstruct(description));
String access = "";
while (!access.equals("public") && !access.equals("private")) {
access = getString("Access (public | private)");
}
album.setAccess(access);
String location = getString("Location");
album.setLocation(location);
album.setDate(new Date());
insertAlbum(album);
}
private void createComment(PhotoEntry photoEntry) throws Exception {
CommentEntry comment = new CommentEntry();
String gphotoId = photoEntry.getGphotoId();
comment.setPhotoId(Long.parseLong(gphotoId));
comment.setTitle(new PlainTextConstruct("Inserted Comment"));
String commentStr = getString("Comment");
comment.setContent(new PlainTextConstruct(commentStr));
insert(photoEntry, comment);
}
private void showAlbumPhotos(List<AlbumEntry> albums) throws Exception {
AlbumEntry albumEntry;
try {
albumEntry = getEntry(albums, "album");
} catch (ExitException ee) {
return;
}
List<PhotoEntry> photos = getPhotos(albumEntry);
int count = 1;
if (photos.size() == 0) {
println("No photos found.");
} else {
for (PhotoEntry entry : photos) {
println("Photo " + count++ + ") " + entry.getTitle().getPlainText());
println(entry.getDescription().getPlainText());
}
}
while (true) {
println("Photo Menu:");
println("0) Exit to album menu");
println("1) Show photo comments");
println("2) Show photo tags");
println("3) Create a new photo");
println("4) Delete a photo");
int choice = getInt("Action");
switch (choice) {
case -1:
continue;
case 0:
return;
case 1:
showPhotoComments(albumEntry, photos);
break;
case 2:
showPhotoTags(albumEntry, photos);
break;
case 3:
createPhoto(albumEntry);
break;
case 4:
deleteEntry(photos, "photo");
break;
default:
println("Invalid choice " + choice);
break;
}
}
}
private void createPhoto(AlbumEntry albumEntry) throws Exception {
PhotoEntry photo = new PhotoEntry();
String title = getString("Title");
photo.setTitle(new PlainTextConstruct(title));
String description = getString("Description");
photo.setDescription(new PlainTextConstruct(description));
photo.setTimestamp(new Date());
OtherContent content = new OtherContent();
File file = null;
while (file == null || !file.canRead()) {
file = new File(getString("Photo location"));
}
content.setBytes(getBytes(file));
content.setMimeType(new ContentType("image/jpeg"));
photo.setContent(content);
insert(albumEntry, photo);
}
private byte[] getBytes(File file) throws FileNotFoundException, IOException {
byte[] result = new byte[(int) file.length()];
new FileInputStream(file).read(result);
return result;
}
private void showPhotoTags(AlbumEntry albumEntry, List<PhotoEntry> photos)
throws Exception {
PhotoEntry photoEntry;
try {
photoEntry = getEntry(photos, "photo");
} catch (ExitException ee) {
return;
}
List<TagEntry> photoTags = getTags(photoEntry);
printTags(photoTags);
while (true) {
println("Tag Menu:");
println("0) Exit to photo menu");
println("1) Add a tag");
println("2) Delete a tag");
int choice = getInt("Action");
switch (choice) {
case -1:
continue;
case 0:
return;
case 1:
createTag(photoEntry);
showPhotoTags(albumEntry, photos);
return;
case 2:
deleteEntry(photoTags, "tag");
showPhotoTags(albumEntry, photos);
return;
default:
println("Invalid choice " + choice);
break;
}
}
}
private void printTags(List<TagEntry> tags) throws Exception {
int count = 1;
if (tags.size() == 0) {
println("No tags found.");
} else {
for (TagEntry tag : tags) {
String tagWeight = tag.getWeight() == null
? "" : " Weight: " + tag.getWeight();
println("Tag " + count++ + ") " + tag.getTitle().getPlainText()
+ tagWeight);
}
}
}
private void createTag(PhotoEntry photoEntry) throws Exception {
TagEntry tag = new TagEntry();
String title = getString("Tag");
tag.setTitle(new PlainTextConstruct(title));
insert(photoEntry, tag);
}
private void showPhotoComments(AlbumEntry albumEntry, List<PhotoEntry> photos)
throws Exception {
PhotoEntry photoEntry;
try {
photoEntry = getEntry(photos, "photo");
} catch (ExitException ee) {
return;
}
List<CommentEntry> comments = getComments(photoEntry);
int count = 1;
if (comments.size() == 0) {
println("No comments found.");
} else {
for (CommentEntry comment : comments) {
println("Comment " + count++ + ") " + comment.getTitle().getPlainText());
println(comment.getPlainTextContent());
}
}
while (true) {
println("Comment Menu:");
println("0) Exit to photo menu");
println("1) Add a comment");
println("2) Delete a comment");
int choice = getInt("Action");
switch (choice) {
case -1:
continue;
case 0:
return;
case 1:
createComment(photoEntry);
showPhotoComments(albumEntry, photos);
return;
case 2:
deleteEntry(comments, "comment");
showPhotoComments(albumEntry, photos);
return;
default:
println("Invalid choice " + choice);
break;
}
}
}
private void deleteEntry(List<? extends GphotoEntry> entries, String name)
throws Exception {
GphotoEntry entry;
try {
entry = getEntry(entries, name);
} catch (ExitException ee) {
return;
}
entry.delete();
}
private <T extends GphotoEntry> T getEntry(List<T> entries, String name)
throws Exception {
while (true) {
int index = getInt("which " + name) - 1;
if (index >= 0 && index < entries.size()) {
return entries.get(index);
} else {
println("Invalid index " + index);
}
}
}
private static int getInt(String name) throws ExitException, IOException {
while (true) {
String input = getString(name);
try {
return Integer.parseInt(input);
} catch (NumberFormatException nfe) {
println("Invalid number " + input);
}
}
}
private static String getString(String name) throws ExitException,
IOException {
print("Please enter ");
print(name);
println(":");
System.out.flush();
String result = IN.readLine();
result = result.trim();
if (result.length() == 0) {
return "-1";
}
return result;
}
private static void print(String str) {
System.out.print(str);
}
private static void println(String str) {
System.out.println(str);
}
private static class ExitException extends Exception {
// Empty, just used to exit quickly.
}
}