diff options
Diffstat (limited to 'src/com/google/wireless/gdata/spreadsheets/client/SpreadsheetsClient.java')
-rwxr-xr-x | src/com/google/wireless/gdata/spreadsheets/client/SpreadsheetsClient.java | 236 |
1 files changed, 236 insertions, 0 deletions
diff --git a/src/com/google/wireless/gdata/spreadsheets/client/SpreadsheetsClient.java b/src/com/google/wireless/gdata/spreadsheets/client/SpreadsheetsClient.java new file mode 100755 index 0000000..388856d --- /dev/null +++ b/src/com/google/wireless/gdata/spreadsheets/client/SpreadsheetsClient.java @@ -0,0 +1,236 @@ +// Copyright 2007 The Android Open Source Project +package com.google.wireless.gdata.spreadsheets.client; + +import com.google.wireless.gdata.client.GDataClient; +import com.google.wireless.gdata.client.GDataParserFactory; +import com.google.wireless.gdata.client.GDataServiceClient; +import com.google.wireless.gdata.client.HttpException; +import com.google.wireless.gdata.data.Entry; +import com.google.wireless.gdata.data.StringUtils; +import com.google.wireless.gdata.parser.GDataParser; +import com.google.wireless.gdata.parser.ParseException; +import com.google.wireless.gdata.serializer.GDataSerializer; +import com.google.wireless.gdata.spreadsheets.data.CellEntry; +import com.google.wireless.gdata.spreadsheets.data.ListEntry; +import com.google.wireless.gdata.spreadsheets.data.SpreadsheetEntry; +import com.google.wireless.gdata.spreadsheets.data.WorksheetEntry; + +import java.io.IOException; +import java.io.InputStream; + +/** + * GDataServiceClient for accessing Google Spreadsheets. This client can + * access and parse all of the Spreadsheets feed types: Spreadsheets feed, + * Worksheets feed, List feed, and Cells feed. Read operations are supported + * on all feed types, but only the List and Cells feeds support write + * operations. (This is a limitation of the protocol, not this API. Such write + * access may be added to the protocol in the future, requiring changes to + * this implementation.) + * + * Only 'private' visibility and 'full' projections are currently supported. + */ +public class SpreadsheetsClient extends GDataServiceClient { + /** The name of the service, dictated to be 'wise' by the protocol. */ + private static final String SERVICE = "wise"; + + /** Standard base feed url for spreadsheets. */ + public static final String SPREADSHEETS_BASE_FEED_URL = + "http://spreadsheets.google.com/feeds/spreadsheets/private/full"; + + /** Base feed url for spreadsheets. */ + private final String baseFeedUrl; + + /** + * Create a new SpreadsheetsClient. + * + * @param client The GDataClient that should be used to authenticate + * requests, retrieve feeds, etc. + * @param spreadsheetFactory The GDataParserFactory that should be used to obtain GDataParsers + * used by this client. + * @param baseFeedUrl The base URL for spreadsheets feeds. + */ + public SpreadsheetsClient(GDataClient client, + GDataParserFactory spreadsheetFactory, + String baseFeedUrl) { + super(client, spreadsheetFactory); + this.baseFeedUrl = baseFeedUrl; + } + + /** + * Create a new SpreadsheetsClient. Uses the standard base URL for spreadsheets feeds. + * + * @param client The GDataClient that should be used to authenticate + * requests, retrieve feeds, etc. + */ + public SpreadsheetsClient(GDataClient client, + GDataParserFactory spreadsheetFactory) { + this(client, spreadsheetFactory, SPREADSHEETS_BASE_FEED_URL); + } + + /* (non-Javadoc) + * @see GDataServiceClient#getServiceName + */ + public String getServiceName() { + return SERVICE; + } + + /** + * Returns a parser for the specified feed type. + * + * @param feedEntryClass the Class of entry type that will be parsed. This lets this + * method figure out which parser to create. + * @param feedUri the URI of the feed to be fetched and parsed + * @param authToken the current authToken to use for the request @return a parser for the indicated feed + * @throws HttpException if an http error is encountered + * @throws ParseException if the response from the server could not be + * parsed + */ + private GDataParser getParserForTypedFeed(Class feedEntryClass, String feedUri, + String authToken) throws ParseException, IOException, HttpException { + GDataClient gDataClient = getGDataClient(); + GDataParserFactory gDataParserFactory = getGDataParserFactory(); + + InputStream is = gDataClient.getFeedAsStream(feedUri, authToken); + return gDataParserFactory.createParser(feedEntryClass, is); + } + + /* (non-javadoc) + * @see GDataServiceClient#createEntry + */ + public Entry createEntry(String feedUri, String authToken, Entry entry) + throws ParseException, IOException, HttpException { + + GDataParserFactory factory = getGDataParserFactory(); + GDataSerializer serializer = factory.createSerializer(entry); + + InputStream is = getGDataClient().createEntry(feedUri, authToken, serializer); + GDataParser parser = factory.createParser(entry.getClass(), is); + try { + return parser.parseStandaloneEntry(); + } finally { + parser.close(); + } + } + + /** + * Returns a parser for a Cells-based feed. + * + * @param feedUri the URI of the feed to be fetched and parsed + * @param authToken the current authToken to use for the request + * @return a parser for the indicated feed + * @throws HttpException if an http error is encountered + * @throws ParseException if the response from the server could not be + * parsed + */ + public GDataParser getParserForCellsFeed(String feedUri, String authToken) + throws ParseException, IOException, HttpException { + return getParserForTypedFeed(CellEntry.class, feedUri, authToken); + } + + /** + * Fetches a GDataParser for the indicated feed. The parser can be used to + * access the contents of URI. WARNING: because we cannot reliably infer + * the feed type from the URI alone, this method assumes the default feed + * type! This is probably NOT what you want. Please use the + * getParserFor[Type]Feed methods. + * + * @param feedEntryClass + * @param feedUri the URI of the feed to be fetched and parsed + * @param authToken the current authToken to use for the request + * @return a parser for the indicated feed + * @throws HttpException if an http error is encountered + * @throws ParseException if the response from the server could not be + * parsed + */ + public GDataParser getParserForFeed(Class feedEntryClass, String feedUri, String authToken) + throws ParseException, IOException, HttpException { + GDataClient gDataClient = getGDataClient(); + GDataParserFactory gDataParserFactory = getGDataParserFactory(); + InputStream is = gDataClient.getFeedAsStream(feedUri, authToken); + return gDataParserFactory.createParser(feedEntryClass, is); + } + + /** + * Returns a parser for a List (row-based) feed. + * + * @param feedUri the URI of the feed to be fetched and parsed + * @param authToken the current authToken to use for the request + * @return a parser for the indicated feed + * @throws HttpException if an http error is encountered + * @throws ParseException if the response from the server could not be + * parsed + */ + public GDataParser getParserForListFeed(String feedUri, String authToken) + throws ParseException, IOException, HttpException { + return getParserForTypedFeed(ListEntry.class, feedUri, authToken); + } + + /** + * Returns a parser for a Spreadsheets meta-feed. + * + * @param feedUri the URI of the feed to be fetched and parsed + * @param authToken the current authToken to use for the request + * @return a parser for the indicated feed + * @throws HttpException if an http error is encountered + * @throws ParseException if the response from the server could not be + * parsed + */ + public GDataParser getParserForSpreadsheetsFeed(String feedUri, String authToken) + throws ParseException, IOException, HttpException { + return getParserForTypedFeed(SpreadsheetEntry.class, feedUri, authToken); + } + + /** + * Returns a parser for a Worksheets meta-feed. + * + * @param feedUri the URI of the feed to be fetched and parsed + * @param authToken the current authToken to use for the request + * @return a parser for the indicated feed + * @throws HttpException if an http error is encountered + * @throws ParseException if the response from the server could not be + * parsed + */ + public GDataParser getParserForWorksheetsFeed(String feedUri, String authToken) + throws ParseException, IOException, HttpException { + return getParserForTypedFeed(WorksheetEntry.class, feedUri, authToken); + } + + /** + * Updates an entry. The URI to be updated is taken from + * <code>entry</code>. Note that only entries in List and Cells feeds + * can be updated, so <code>entry</code> must be of the corresponding + * type; other types will result in an exception. + * + * @param entry the entry to be updated; must include its URI + * @param authToken the current authToken to be used for the operation + * @return An Entry containing the re-parsed version of the entry returned + * by the server in response to the update. + * @throws HttpException if an http error is encountered + * @throws ParseException if the server returned an error, if the server's + * response was unparseable (unlikely), or if <code>entry</code> + * is of a read-only type + * @throws IOException on network error + */ + public Entry updateEntry(Entry entry, String authToken) + throws ParseException, IOException, HttpException { + GDataParserFactory factory = getGDataParserFactory(); + GDataSerializer serializer = factory.createSerializer(entry); + + String editUri = entry.getEditUri(); + if (StringUtils.isEmpty(editUri)) { + throw new ParseException("No edit URI -- cannot update."); + } + + InputStream is = getGDataClient().updateEntry(editUri, authToken, serializer); + GDataParser parser = factory.createParser(entry.getClass(), is); + try { + return parser.parseStandaloneEntry(); + } finally { + parser.close(); + } + } + + public String getBaseFeedUrl() { + return baseFeedUrl; + } +} |