250 lines
7.8 KiB
Java
250 lines
7.8 KiB
Java
/* 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;
|
|
}
|
|
}
|
|
|
|
}
|