/* 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.Query;
import com.google.gdata.client.calendar.CalendarQuery;
import com.google.gdata.client.calendar.CalendarService;
import com.google.gdata.data.DateTime;
import com.google.gdata.data.calendar.CalendarEventEntry;
import com.google.gdata.data.calendar.CalendarEventFeed;
import com.google.gdata.data.extensions.Who;
import com.google.gdata.util.ServiceException;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.URL;
/**
* Demonstrates partial query and patch capabilities in Calendar Data API by
* <ul>
* <li>Retrieving current attendeeStatus for the authenticated user using partial
* query and
* <li>update the attendeeStatus using partial patch.
* </ul>
*
*
*/
public class EventFeedPartialDemo {
private static final String CALENDAR_FEEDS_PREFIX =
"https://www.google.com/calendar/feeds/";
/** Input stream for reading user input. */
private static final BufferedReader IN
= new BufferedReader(new InputStreamReader(System.in));
/** Output stream to print output. */
private static final PrintStream OUT = System.out;
/** Service instance to talk to calendar server */
private final CalendarService service;
/** Constructor */
private EventFeedPartialDemo(CalendarService service) {
this.service = service;
}
/**
* Displays a menu of the main activities a user can perform.
*/
private void printMenu() {
OUT.println("\n");
OUT.println("Choose one of the following demo options:");
OUT.println("\t1) Retrieve my next week's events");
OUT.println("\t2) Update my attendee status for an event");
OUT.println("\t0) Exit");
OUT.println("\nEnter Number (0-2): ");
}
/**
* Prints user's attendeeStatus for next week's events.
*
* @param uname username whose attendeeStatus is required.
*/
private void printAttendeeStatus(String uname)
throws IOException, ServiceException {
String eventsFeedUrl = CALENDAR_FEEDS_PREFIX
+ uname + "/private/composite";
String fields = "entry(@gd:etag,id,title,gd:who[@email='" + uname + "'])";
CalendarQuery partialQuery = new CalendarQuery(new URL(eventsFeedUrl));
partialQuery.setFields(fields);
DateTime startTime = DateTime.now();
partialQuery.setMinimumStartTime(startTime);
partialQuery.setMaximumStartTime(
new DateTime(startTime.getValue() + 604800000, startTime.getTzShift()));
CalendarEventFeed events = service.query(
partialQuery, CalendarEventFeed.class);
for (CalendarEventEntry event : events.getEntries()) {
String eventId = event.getId()
.substring(event.getId().lastIndexOf("/") + 1);
String attendeeStatus =
event.getParticipants().get(0).getAttendeeStatus();
OUT.println(eventId + ": " + event.getTitle().getPlainText()
+ ": (" + (attendeeStatus != null ? attendeeStatus : "no status")
+ ")");
}
}
/**
* Updates user's response for a specific event using partial patch.
*
* @param uname username whose attendeeStatus need to be updated.
*/
private void updateAttendeeStatus(String uname)
throws IOException, ServiceException {
OUT.println("Enter the id of event to update: ");
String eventId = IN.readLine();
OUT.println("Enter event response (1:Yes, 2:No, 3:Maybe)");
String selection;
switch(readInt()) {
case 1:
selection = Who.AttendeeStatus.EVENT_ACCEPTED;
break;
case 2:
selection = Who.AttendeeStatus.EVENT_DECLINED;
break;
case 3:
selection = Who.AttendeeStatus.EVENT_TENTATIVE;
break;
default:
OUT.println("Invalid selection.");
return;
}
// URL of calendar entry to update.
String eventEntryUrl = CALENDAR_FEEDS_PREFIX + uname
+ "/private/full/" + eventId;
// Selection criteria to fetch only the attendee status of specified user.
String selectAttendee =
"@gd:etag,title,gd:who[@email='" + uname + "']";
Query partialQuery = new Query(new URL(eventEntryUrl));
partialQuery.setFields(selectAttendee);
CalendarEventEntry event = service.getEntry(partialQuery.getUrl(),
CalendarEventEntry.class);
// The participant list will contain exactly one attendee matching
// above partial query selection criteria.
event.getParticipants().get(0).setAttendeeStatus(selection);
// Field selection to update attendeeStatus only.
String toUpdateFields = "gd:who/gd:attendeeStatus";
// Make patch request which returns full representation for the event.
event = service.patch(
new URL(eventEntryUrl), toUpdateFields, event);
// Print the updated attendee status.
OUT.println(event.getTitle().getPlainText() + " updated to: "
+ event.getParticipants().get(0).getAttendeeStatus());
}
/** Program entry point */
public static void main(String args[]) throws IOException, ServiceException {
// Set username and password from command-line arguments.
if (args.length != 2) {
usage();
return;
}
String uname = args[0];
String upassword = args[1];
CalendarService myService = new CalendarService(
"gdata-CalendarPartialDemo");
myService.setUserCredentials(uname, upassword);
EventFeedPartialDemo demo = new EventFeedPartialDemo(myService);
while (true) {
try {
demo.printMenu();
int choice = readInt();
switch (choice) {
case 1:
// Prints out the user's uploaded videos
demo.printAttendeeStatus(uname);
break;
case 2:
demo.updateAttendeeStatus(uname);
break;
case 0:
System.exit(1);
break;
}
} 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() {
OUT.println("Syntax: EventFeedPartialDemo <username> <password>");
OUT.println("\nThe username and password are used for "
+ "authentication. The sample application will retrieve list of"
+ "user's calendar events and provides option to change event response."
);
}
/**
* Reads a line of text from the standard input.
*
* @throws IOException If unable to read a line from the standard input.
* @return A line of text read from the standard input.
*/
private static String readLine() throws IOException {
return IN.readLine();
}
/**
* Reads a line of text from the standard input and returns the parsed
* integer representation.
*
* @throws IOException If unable to read a line from the standard input.
* @return An integer read from the standard input.
*/
private static int readInt() throws IOException {
String input = readLine();
try {
return Integer.parseInt(input);
} catch (NumberFormatException nfe) {
return 0;
}
}
}