/* 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.calendar; import com.google.gdata.client.calendar.CalendarService; import com.google.gdata.data.PlainTextConstruct; import com.google.gdata.data.calendar.CalendarEntry; import com.google.gdata.data.calendar.CalendarFeed; import com.google.gdata.data.calendar.ColorProperty; import com.google.gdata.data.calendar.HiddenProperty; import com.google.gdata.data.calendar.SelectedProperty; import com.google.gdata.data.calendar.TimeZoneProperty; import com.google.gdata.data.extensions.Where; import com.google.gdata.util.AuthenticationException; import com.google.gdata.util.ServiceException; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; /** * Demonstrates interactions with the Calendar data API's calendar feeds using * the Java client library: * * <ul> * <li>Retrieving the metafeed list of all the user's calendars</li> * <li>Retrieving the allcalendars list of calendars</li> * <li>Retrieving the owncalendars list of calendars</li> * <li>Creating a new calendar</li> * <li>Updating an existing calendar</li> * <li>Deleting a calendar</li> * <li>Subscribing to an existing calendar</li> * <li>Updating a subscription</li> * <li>Deleting a subscription</li> * </ul> */ public class CalendarFeedDemo { // The base URL for a user's calendar metafeed (needs a username appended). private static final String METAFEED_URL_BASE = "https://www.google.com/calendar/feeds/"; // The string to add to the user's metafeedUrl to access the allcalendars // feed. private static final String ALLCALENDARS_FEED_URL_SUFFIX = "/allcalendars/full"; // The string to add to the user's metafeedUrl to access the owncalendars // feed. private static final String OWNCALENDARS_FEED_URL_SUFFIX = "/owncalendars/full"; // The URL for the metafeed of the specified user. // (e.g. http://www.google.com/feeds/calendar/jdoe@gmail.com) private static URL metafeedUrl = null; // The URL for the allcalendars feed of the specified user. // (e.g. http://www.googe.com/feeds/calendar/jdoe@gmail.com/allcalendars/full) private static URL allcalendarsFeedUrl = null; // The URL for the owncalendars feed of the specified user. // (e.g. http://www.googe.com/feeds/calendar/jdoe@gmail.com/owncalendars/full) private static URL owncalendarsFeedUrl = null; // The calendar ID of the public Google Doodles calendar private static final String DOODLES_CALENDAR_ID = "c4o4i7m2lbamc4k26sc2vokh5g%40group.calendar.google.com"; // The HEX representation of red, blue and green private static final String RED = "#A32929"; private static final String BLUE = "#2952A3"; private static final String GREEN = "#0D7813"; /** * Utility classes should not have a public or default constructor. */ protected CalendarFeedDemo() { } /** * Prints the titles of calendars in the feed specified by the given URL. * * @param service An authenticated CalendarService object. * @param feedUrl The URL of a calendar 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. */ private static void printUserCalendars(CalendarService service, URL feedUrl) throws IOException, ServiceException { // Send the request and receive the response: CalendarFeed resultFeed = service.getFeed(feedUrl, CalendarFeed.class); // Print the title of each calendar for (int i = 0; i < resultFeed.getEntries().size(); i++) { CalendarEntry entry = resultFeed.getEntries().get(i); System.out.println("\t" + entry.getTitle().getPlainText()); } } /** * Creates a new secondary calendar using the owncalendars feed. * * @param service An authenticated CalendarService object. * @return The newly created calendar entry. * @throws IOException If there is a problem communicating with the server. * @throws ServiceException If the service is unable to handle the request. */ private static CalendarEntry createCalendar(CalendarService service) throws IOException, ServiceException { System.out.println("Creating a secondary calendar"); // Create the calendar CalendarEntry calendar = new CalendarEntry(); calendar.setTitle(new PlainTextConstruct("Little League Schedule")); calendar.setSummary(new PlainTextConstruct( "This calendar contains the practice schedule and game times.")); calendar.setTimeZone(new TimeZoneProperty("America/Los_Angeles")); calendar.setHidden(HiddenProperty.FALSE); calendar.setColor(new ColorProperty(BLUE)); calendar.addLocation(new Where("", "", "Oakland")); // Insert the calendar return service.insert(owncalendarsFeedUrl, calendar); } /** * Updates the title, color, and selected properties of the given calendar * entry using the owncalendars feed. Note that the title can only be updated * with the owncalendars feed. * * @param calendar The calendar entry to update. * @return The newly updated calendar entry. * @throws IOException If there is a problem communicating with the server. * @throws ServiceException If the service is unable to handle the request. */ private static CalendarEntry updateCalendar(CalendarEntry calendar) throws IOException, ServiceException { System.out.println("Updating the secondary calendar"); calendar.setTitle(new PlainTextConstruct("New title")); calendar.setColor(new ColorProperty(GREEN)); calendar.setSelected(SelectedProperty.TRUE); return calendar.update(); } /** * Deletes the given calendar entry. * * @param calendar The calendar entry to delete. * @throws IOException If there is a problem communicating with the server. * @throws ServiceException If the service is unable to handle the request. */ private static void deleteCalendar(CalendarEntry calendar) throws IOException, ServiceException { System.out.println("Deleting the secondary calendar"); calendar.delete(); } /** * Subscribes to the public Google Doodles calendar using the allcalendars * feed. * * @param service An authenticated CalendarService object. * @return The newly created calendar entry. * @throws IOException If there is a problem communicating with the server. * @throws ServiceException If the service is unable to handle the request. */ private static CalendarEntry createSubscription(CalendarService service) throws IOException, ServiceException { System.out.println("Subscribing to the Google Doodles calendar"); CalendarEntry calendar = new CalendarEntry(); calendar.setId(DOODLES_CALENDAR_ID); return service.insert(allcalendarsFeedUrl, calendar); } /** * Updated the color property of the given calendar entry. * * @param calendar The calendar entry to update. * @return The newly updated calendar entry. * @throws IOException If there is a problem communicating with the server. * @throws ServiceException If the service is unable to handle the request. */ private static CalendarEntry updateSubscription(CalendarEntry calendar) throws IOException, ServiceException { System.out.println("Updating the display color of the Doodles calendar"); calendar.setColor(new ColorProperty(RED)); return calendar.update(); } /** * Deletes the given calendar entry. * * @param calendar The calendar entry to delete * @throws IOException If there is a problem communicating with the server. * @throws ServiceException If the service is unable to handle the request. */ private static void deleteSubscription(CalendarEntry calendar) throws IOException, ServiceException { System.out.println("Deleting the subscription to the Doodles calendar"); calendar.delete(); } /** * Instantiates a CalendarService object and uses the command line arguments * to authenticate. The CalendarService object is used to demonstrate * interactions with the Calendar data API's calendar feeds. * * @param args Must be length 2 and contain a valid username/password */ public static void main(String[] args) { // Set username and password from command-line arguments. if (args.length != 2) { usage(); return; } String userName = args[0]; String userPassword = args[1]; // Create necessary URL objects try { metafeedUrl = new URL(METAFEED_URL_BASE + userName); allcalendarsFeedUrl = new URL(METAFEED_URL_BASE + userName + ALLCALENDARS_FEED_URL_SUFFIX); owncalendarsFeedUrl = new URL(METAFEED_URL_BASE + userName + OWNCALENDARS_FEED_URL_SUFFIX); } catch (MalformedURLException e) { // Bad URL System.err.println("Uh oh - you've got an invalid URL."); e.printStackTrace(); return; } // Create CalendarService and authenticate using ClientLogin CalendarService service = new CalendarService("demo-CalendarFeedDemo-1"); try { service.setUserCredentials(userName, userPassword); } catch (AuthenticationException e) { // Invalid credentials e.printStackTrace(); } // Demonstrate retrieving various calendar feeds. try { System.out.println("Calendars in metafeed"); printUserCalendars(service, metafeedUrl); System.out.println("Calendars in allcalendars feed"); printUserCalendars(service, allcalendarsFeedUrl); System.out.println("Calendars in owncalendars feed"); printUserCalendars(service, owncalendarsFeedUrl); // Create a new secondary calendar, update it, then delete it. CalendarEntry newCalendar = createCalendar(service); CalendarEntry updatedCalendar = updateCalendar(newCalendar); deleteCalendar(newCalendar); // Subscribe to the Google Doodles calendar, update the personalization // settings, then delete the subscription. CalendarEntry newSubscription = createSubscription(service); CalendarEntry updatedSubscription = updateSubscription(newSubscription); deleteSubscription(newSubscription); } 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: CalendarFeedDemo <username> <password>"); System.out.println("\nThe username and password are used for " + "authentication. The sample application will modify the specified " + "user's calendars so you may want to use a test account."); } }