/* 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.sites;
import sample.util.SimpleCommandLineParser;
import com.google.gdata.data.sites.AttachmentEntry;
import com.google.gdata.data.sites.BaseContentEntry;
import com.google.gdata.data.sites.SiteEntry;
import com.google.gdata.util.AuthenticationException;
import com.google.gdata.util.InvalidEntryException;
import com.google.gdata.util.ServiceException;
import com.google.gdata.util.VersionConflictException;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
/**
* Sample command-line application that demonstrates the major functionality of
* the Google Sites Data API.
*
*
*/
public class SitesDemo {
private SitesHelper sitesHelper;
public static final String APP_NAME = "google-JavaSitesClientSample-v1.1";
/**
* The message for displaying the usage parameters.
*/
private static final String[] USAGE_MESSAGE = {
"Usage: java SitesDemo.jar --siteName <webspace name of Site> --username <email> "
+ "--password <pass>",
"Usage: java SitesDemo.jar --siteName <webspace name of Site> --token <AuthSub token>",
" [--domain] Google Apps domain (e.g. example.com)",
" [--log] Enable request logging tot stderr",
""
};
/**
* Welcome message.
*/
private static final String[] WELCOME_MESSAGE = {
"", "--Google Sites Data API Java Client Demo--",
"This app lets you fetch, upload, and download content to/from Google Sites.",
"Type 'help' for a list of commands.", ""
};
/**
* Help on all available commands.
*/
private static final String[] COMMAND_HELP_MESSAGE = {
"Commands:",
" sites [[lists the user's sites]]",
" newsite <title> <description> [theme] [[creates a new Google Site]]",
" copysite <title> <description> <source site> [[copies an existing Google Site]]",
" content [all|kind|kind1,kind2,kind3,...] [[lists the Site content]]",
" activity [[lists recent Site activity]]",
" create <kind> <title> [parentEntryId] [[create a new page]]",
" delete <entryId> [[delete page/item]]",
" upload <file_path> <parentEntryId> [description] [[uploads an attachment to a parent "
+ "page/filecabinet]]",
" download <entryId|\"all\"> <file_path> [[downloads an attachment or all the "
+ "Site's attachments to the folder "
+ "specified by file_path]]",
" revisions <entryId> [[lists revisions of an page/item]]",
" acls <siteName> [[lists the sharing permissions "
+ "for a site]]",
"",
" kinds [[lists possible values for page "
+ "kinds]]",
" help [[display this message, or info "
+ "about the specified command]]",
" exit [[exit the program]]"
};
/**
* Constructor
*
* @param appName Name of the application.
* @param domain The Google Apps domain of the hosted Site or "site".
* @param siteName The webspace name of the Site.
* @param username User's email address.
* @param password User's password.
* @param enableLogging Whether to enable HTTP/XML logging.
* @throws AuthenticationException
*/
public SitesDemo(String appName, String domain, String siteName, String username,
String password, boolean enableLogging) throws AuthenticationException {
sitesHelper = new SitesHelper(appName, domain, siteName, enableLogging);
sitesHelper.login(username, password);
}
/**
* Constructor
*
* @param appName Name of the application.
* @param domain The Google Apps domain of the hosted Site or "site".
* @param siteName The webspace name of the Site.
* @param authSubToken User's AuthSub session token.
* @param enableLogging Whether to enable HTTP/XML logging.
*/
public SitesDemo(String appName, String domain, String siteName, String authSubToken,
boolean enableLogging) {
sitesHelper = new SitesHelper(appName, domain, siteName, enableLogging);
sitesHelper.login(authSubToken);
}
/**
* Prints out a given message.
*
* @param msg the message to be printed.
*/
private static void printMessage(String[] msg) {
printMessage(msg, true);
}
/**
* Prints out a given message.
*
* @param msg the message to be printed.
* @param addNewline Whether to put a carriage return after every value.
*/
private static void printMessage(String[] msg, boolean addNewline) {
for (String s : msg) {
if (addNewline) {
System.out.println(s);
} else {
System.out.print(s + " ");
}
}
}
/**
* Prints out the supported page kinds.
*/
private void listSupportedKinds() {
System.out.print("\nSupported kind values: ");
printMessage(sitesHelper.KINDS, false);
System.out.println();
}
/**
* Reads and executes one command.
*
* @param reader to read input from the keyboard
* @return false if the user quits, true on exception
* @throws IOException
* @throws ServiceException
* @throws SitesException
*/
private boolean executeCommand(BufferedReader reader) throws IOException, ServiceException,
SitesException {
System.out.print("Command: ");
String[] args = parseCommand(reader.readLine());
String name = args[0];
if (name.equals("sites")) {
sitesHelper.getSiteFeed();
} else if (name.equals("newsite")) {
if (args.length < 3) {
System.out.flush();
throw new SitesException("Wrong number of args");
}
SiteEntry siteEntry = null;
if (args.length == 4) {
siteEntry = sitesHelper.createSite(args[1], args[2], args[3]);
} else if (args.length == 3) {
siteEntry = sitesHelper.createSite(args[1], args[2]);
}
System.out.println("Created!");
if (siteEntry.getHtmlLink() != null) {
System.out.println("View it at " + siteEntry.getHtmlLink().getHref());
}
} else if (name.equals("copysite")) {
if (args.length < 4) {
System.out.flush();
throw new SitesException("Wrong number of args");
}
SiteEntry siteEntry = siteEntry = sitesHelper.copySite(args[1], args[2], args[3]);
System.out.println("Created!");
if (siteEntry.getHtmlLink() != null) {
System.out.println("View it at " + siteEntry.getHtmlLink().getHref());
}
} else if (name.equals("content")) {
if (args.length == 1) {
sitesHelper.listSiteContents("all");
} else {
sitesHelper.listSiteContents(args[1]);
}
} else if (name.equals("activity")) {
sitesHelper.getActivityFeed();
} else if (name.equals("create")) {
if (args.length < 3) {
listSupportedKinds();
System.out.flush();
throw new SitesException("Wrong number of args");
}
try {
BaseContentEntry<?> newEntry;
if (args.length == 4) {
newEntry = sitesHelper.createPage(args[1], args[2], args[3]);
} else {
newEntry = sitesHelper.createPage(args[1], args[2]);
}
System.out.println("Created!");
if (newEntry.getHtmlLink() != null) {
System.out.println("View it at " + newEntry.getHtmlLink().getHref());
}
} catch (InvalidEntryException e) {
System.err.println(e.getResponseBody());
}
} else if (name.equals("delete")) {
if (args.length == 1) {
throw new SitesException("Wrong number of args");
}
sitesHelper.service.delete(new URL(sitesHelper.getContentFeedUrl() + args[1]), "*");
System.out.println("Removed!");
} else if (name.equals("upload")) {
if (args.length < 3) {
throw new SitesException("Wrong number of args");
}
try {
AttachmentEntry newEntry = null;
if (args.length == 4) {
newEntry = sitesHelper.uploadAttachment(
args[1], sitesHelper.getContentFeedUrl() + args[2], args[3]);
} else {
newEntry = sitesHelper.uploadAttachment(
args[1], sitesHelper.getContentFeedUrl() + args[2], "");
}
if (newEntry.getHtmlLink() != null) {
System.out.println("View it at " + newEntry.getHtmlLink().getHref());
}
} catch (VersionConflictException e) {
System.err.println(e.getResponseBody());
}
} else if (name.equals("download")) {
if (args.length < 3) {
throw new SitesException("Wrong number of args");
}
if (args[1].equals("all")) {
sitesHelper.downloadAllAttachments(args[2]);
} else {
sitesHelper.downloadAttachment(args[1], args[2]);
}
System.out.println("Done!");
} else if (name.equals("revisions")) {
if (args.length == 1) {
throw new SitesException("Wrong number of args");
}
sitesHelper.getRevisionFeed(args[1]);
} else if (name.equals("acls")) {
if (args.length == 1) {
throw new SitesException("Wrong number of args");
}
sitesHelper.getAclFeed(args[1]);
} else if (name.equals("kinds")) {
listSupportedKinds();
} else if (name.equals("help")) {
printMessage(COMMAND_HELP_MESSAGE);
} else if (name.startsWith("q") || name.startsWith("exit")) {
return false;
} else {
System.out.println("Unknown command. Type 'help' for a list of commands.");
}
return true;
}
/**
* Parses the command entered by the user into individual arguments.
*
* @param command the entire command entered by the user to be broken up into
* arguments.
*/
private String[] parseCommand(String command) {
// Special commands need to be handled differently
if (command.startsWith("create")) {
// Break into args (create, kind, title, parentEntryID)
return command.trim().split(" ", 4);
} else if (command.startsWith("upload")) {
// Break into args (upload, filepath, parentEntryID, description)
return command.trim().split(" ", 4);
}
// Split into n args using a space as the separator.
return command.trim().split(" ");
}
/**
* Starts up the demo and prompts for commands.
*
* @param username name of user to authenticate (e.g. user@gmail.com)
* @param password password to use for authentication
* @param feedUrl URL of the feed to connect to
* @throws ServiceException
* @throws IOException
*/
public void run() throws IOException, ServiceException {
printMessage(WELCOME_MESSAGE);
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
boolean run = true;
while (run) {
try {
run = executeCommand(reader);
} catch (SitesException e) {
System.err.println(e.getMessage());
printMessage(COMMAND_HELP_MESSAGE);
}
}
}
/**
* Runs the demo.
*
* @param args the command-line arguments
*
* @throws DocumentListException
* @throws ServiceException
* @throws IOException
*/
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");
String token = parser.getValue("token", "token", "t");
String domain = parser.getValue("domain", "d");
String siteName = parser.getValue("siteName", "site", "s");
boolean help = parser.containsKey("help", "h");
boolean logItUp = parser.containsKey("log", "l");
if (siteName == null || help) {
printMessage(USAGE_MESSAGE);
System.exit(1);
}
// If domain is set, use "site" for a non-Google Apps hosted Site.
if (domain == null) {
domain = "site";
}
SitesDemo demo = null;
try {
if (username != null && password != null) {
demo = new SitesDemo(APP_NAME, domain, siteName, username, password, logItUp);
} else if (token != null) {
demo = new SitesDemo(APP_NAME, domain, siteName, token, logItUp);
} else {
printMessage(USAGE_MESSAGE);
System.exit(1);
}
demo.run();
} catch (IOException e) {
e.printStackTrace();
} catch (AuthenticationException e) {
e.printStackTrace();
} catch (ServiceException e) {
e.printStackTrace();
}
}
}