/* 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.sidewiki;
import com.google.gdata.util.common.base.CharEscapers;
import com.google.gdata.client.sidewiki.SidewikiService;
import com.google.gdata.data.Content;
import com.google.gdata.data.IContent;
import com.google.gdata.data.ILink;
import com.google.gdata.data.TextContent;
import com.google.gdata.data.sidewiki.SidewikiAuthor;
import com.google.gdata.data.sidewiki.SidewikiEntry;
import com.google.gdata.data.sidewiki.SidewikiEntryFeed;
import com.google.gdata.data.sidewiki.SidewikiLink;
import com.google.gdata.util.AuthenticationException;
import com.google.gdata.util.ServiceException;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashSet;
import java.util.Set;
/**
* Demonstrates interactions with the Google Sidewiki Data API's entry feeds
* using the Java client library.
*/
public class SidewikiEntryFeedDemo {
// The base URL for all Google Sidewiki feeds.
private static final String SIDEWIKI_FEEDS_URL_BASE =
"https://www.google.com/sidewiki/feeds";
// The base URL for all Google Sidewiki entries feeds.
private static final String ENTRIES_FEEDS_URL_BASE =
SIDEWIKI_FEEDS_URL_BASE + "/entries";
// The suffix for Sidewiki entries by author feed format.
private static final String AUTHORS_FEED_URL_SUFFIX_FORMAT =
"/author/{author_id}/full?max-results=2";
// The suffix for Sidewiki entries for web page feed format.
private static final String WEBPAGE_FEED_URL_SUFFIX_FORMAT =
"/webpage/{url}/full?max-results=2";
/**
* Utility classes should not have a public or default constructor.
*/
private SidewikiEntryFeedDemo() {
}
/**
* Returns URL of the feed of entries written by author {@code authorId}.
*
* @param authorId author Profile ID
* @return URL of the feed of entries written by given author
* @throws MalformedURLException if error happens during URL construction
*/
private static URL getEntriesByAuthorFeedUrl(String authorId) throws MalformedURLException {
return new URL(ENTRIES_FEEDS_URL_BASE
+ AUTHORS_FEED_URL_SUFFIX_FORMAT.replace("{author_id}", authorId));
}
/**
* Returns URL of the feed of entries written for web page {@code webpage}.
*
* @param webpage unescaped web page URL
* @return URL of the feed of entries written for given web page
* @throws MalformedURLException if error happens during URL construction
*/
private static URL getEntriesForWebpageFeedUrl(String webpage) throws MalformedURLException {
return new URL(ENTRIES_FEEDS_URL_BASE
+ WEBPAGE_FEED_URL_SUFFIX_FORMAT.replace("{url}",
CharEscapers.uriEscaper().escape(webpage)));
}
/**
* Prints Sidewiki entries in the feed specified by the given URL.
*
* @param service an authenticated SidewikiService object
* @param feedUrl the URL of a Sidewiki entry feed to retrieve
* @throws IOException if there is a problem communicating with the server
* @throws ServiceException if the service is unable to handle the request
* @return a set of author IDs who wrote entries found in given feed
*/
private static Set<String> printSidewikiEntries(SidewikiService service, URL feedUrl)
throws IOException, ServiceException {
Set<String> authors = new HashSet<String>();
// Send the request and receive the response.
SidewikiEntryFeed resultFeed = service.getFeed(feedUrl, SidewikiEntryFeed.class);
// Print each Sidewiki entry.
System.out.println(resultFeed.getTitle().getPlainText());
for (int i = 0; i < resultFeed.getEntries().size(); i++) {
SidewikiEntry entry = resultFeed.getEntries().get(i);
printEntry(entry);
SidewikiAuthor author = (SidewikiAuthor) entry.getAuthors().get(0);
authors.add(author.getResourceId().getValue());
}
return authors;
}
/**
* Returns plain text representation of content {@code c}.
*
* @param c content object to convert to plain text
* @return content string or "{@code null}" if {@code c} is {@code null}
*/
private static String contentToString(Content c) {
if (c == null) {
return "null";
}
switch (c.getType()) {
case IContent.Type.TEXT:
return ((TextContent) c).getContent().getPlainText();
default:
return "(" + c.getType() + ")";
}
}
/**
* Prints Sidewiki entry to standard output, including its author,
* title and content.
*
* @param entry Sidewiki entry to print
*/
private static void printEntry(SidewikiEntry entry) {
SidewikiAuthor author = (SidewikiAuthor) entry.getAuthors().get(0);
System.out.println("Sidewiki entry by " + author.getName() + " about \""
+ entry.getLink(SidewikiLink.Rel.ORIGINAL_URL, ILink.Type.HTML).getHref() + "\":\n"
+ entry.getTitle().getPlainText() + "\" - \""
+ contentToString(entry.getContent()) + "\"\n");
}
/**
* Instantiates a SidewikiService object and uses the command line arguments
* to authenticate. The SidewikiService object is used to demonstrate
* interactions with the Google Sidewiki Data API's feeds.
*
* @param args must be length 3 and contain a valid username/password and web page url
*/
public static void main(String[] args) {
// Set username and password from command-line arguments.
if (args.length != 3) {
usage();
return;
}
String userName = args[0];
String userPassword = args[1];
String webpage = args[2];
// Create SidewikiService and authenticate using ClientLogin.
SidewikiService service = new SidewikiService("demo-SidewikiEntryFeedDemo-1");
try {
service.setUserCredentials(userName, userPassword);
} catch (AuthenticationException e) {
// Invalid credentials
e.printStackTrace();
return;
}
// Demonstrate retrieving Sidewiki entries written for web page or by some author.
try {
System.out.println("Entries for web page \"" + webpage + "\":");
URL webpageFeedUrl = getEntriesForWebpageFeedUrl(webpage);
Set<String> authorIds = printSidewikiEntries(service, webpageFeedUrl);
// Print entries written by each author found.
for (String authorId : authorIds) {
URL authorEntriesFeedUrl = getEntriesByAuthorFeedUrl(authorId);
printSidewikiEntries(service, authorEntriesFeedUrl);
}
// Print logged in user Sidewiki entries by using "me" keyword.
System.out.println("My Sidewiki entries:");
URL myEntriesFeedUrl = getEntriesByAuthorFeedUrl("me");
printSidewikiEntries(service, myEntriesFeedUrl);
} 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();
}
}
/**
* Prints the command line usage of this sample application.
*/
private static void usage() {
System.out.println("Syntax: SidewikiEntryFeedDemo <username> <password> <web page url>");
System.out.println("\nPrints entries written for given web page. "
+ "The username and password are used for authentication.");
}
}