Please see/read below, and scroll down...sharing my code below. :)
Look for the 'delay...' method below, and how often it is called before 'every' google calendar API call/method. My delete events method skips all-day events except for the events that begin on or within the selected date (range).
private void addEventToCalendar(GoogleCalendarEvent eventToAdd) throws Exception {
try {
Event event = new Event();
event.setSummary(eventToAdd.getSummary());
event.setDescription(eventToAdd.getDescription());
event.setLocation(eventToAdd.getLocation());
DateTime startDateTime = new DateTime(eventToAdd.getStart(), TimeZone.getTimeZone("UTC"));
event.setStart(new EventDateTime().setDateTime(startDateTime));
DateTime endDateTime = new DateTime(eventToAdd.getEnd(), TimeZone.getTimeZone("UTC"));
event.setEnd(new EventDateTime().setDateTime(endDateTime));
oAuthRequestAccess();
delayIfNecessaryAndUpdateCounter();
client.events().insert(calendarEntry.getId(), event).execute();
} catch (GoogleJsonResponseException googleJsonException) {
addEventToLog(eventToAdd);
String msg = "caught the following exception: " +
googleJsonException.getDetails().toPrettyString();
throw googleJsonException;
} catch (Exception e) {
addEventToLog(eventToAdd);
String msg = "caught the following exception: " +
(e.getMessage() != null ? e.getMessage() : e.getLocalizedMessage());
throw e;
}
}
private void addEventToLog(GoogleCalendarEvent event) {
String description = (event.getDescription() != null ? event.getDescription() : "null"),
location = (event.getLocation() != null ? event.getLocation() : "null"),
log,
summary = (event.getSummary() != null ? event.getSummary() : "null");
log = "Start: " + (new org.joda.time.DateTime(event.getStart())).toString("MM/dd/yyyy") +
"; End: " + (new org.joda.time.DateTime(event.getEnd())).toString("MM/dd/yyyy") +
"\nSummary: " + summary +
"\nLocation: " + location +
"\nDescription: " + description;
}
/*
*
* Calendar API
* 5.0 requests/second/user
*/
private void delayIfNecessaryAndUpdateCounter() {
org.joda.time.DateTime dateTime, now;
now = org.joda.time.DateTime.now();
if (lastRequest == null ||
now.isAfter(new org.joda.time.DateTime(lastRequest).plusSeconds(5))) {
apiRequestCounter = 0;
}
else if (apiRequestCounter > 3) {
dateTime = org.joda.time.DateTime.now().plusSeconds(5);
now = org.joda.time.DateTime.now();
while (true) {
if (now.isAfter(dateTime)) {
break;
}
now = org.joda.time.DateTime.now();
}
apiRequestCounter = 0;
}
apiRequestCounter += 1;
lastRequest = new Date();
}
public void deleteAndAddEvents(Date start, Date end,
List<GoogleCalendarEvent> eventsToAdd) throws Exception {
deleteEventsViaRetries(start, end);
for (GoogleCalendarEvent event : eventsToAdd) {
addEventToCalendar(event);
}
}
/*
* One of the following should meet requirement of delete via retries:
*
* 1. delete events UNTIL NO events deleted (deleteEvents(...) returns false)
* 2. delete events AT LEAST 3 to 5 times
*/
public void deleteEventsViaRetries(Date start, Date end) throws Exception {
// delete events until no events deleted
while (true) {
if (!deleteEvents(start, end)) {
break;
}
}
}
private Boolean deleteEvents(Date start, Date end) throws Exception {
Boolean eventsDeleted = false;
try {
// will be used to only delete events that start on argument start date
DateTime startDateTime = new DateTime(start, TimeZone.getTimeZone("UTC"));
DateTime endDateTime = new DateTime(end, TimeZone.getTimeZone("UTC"));
String eventDate, startDate, endDate;
// RFC 3339 date format (e.g. 2011-06-03T10:00:00.000-07:00)
startDate = startDateTime.toStringRfc3339();
startDate = startDate.substring(0, 10);
endDate = endDateTime.toStringRfc3339();
endDate = endDate.substring(0, 10);
Boolean deleteARangeOfDates = true;
if (startDate.equals(endDate)) {
deleteARangeOfDates = false;
}
org.joda.time.DateTime timeMin, timeMax;
timeMin = new org.joda.time.DateTime(start).withHourOfDay(0).withMinuteOfHour(0);
if (end != null) {
timeMax = new org.joda.time.DateTime(end).withHourOfDay(23).withMinuteOfHour(59);
}
else {
timeMax = new org.joda.time.DateTime(start).withHourOfDay(23).withMinuteOfHour(59);
}
oAuthRequestAccess();
delayIfNecessaryAndUpdateCounter();
Events events = client.events().list(calendarEntry.getId())
.setTimeMin(new DateTime(timeMin.toDate(), TimeZone.getTimeZone("UTC")))
.setTimeMax(new DateTime(timeMax.toDate(), TimeZone.getTimeZone("UTC")))
.execute();
//
logger.info("GoogleCalendarUtil.updateEventsOnSingleDate(): existing EVENTS to delete = " + events.getItems().size());
if (events.getItems() != null && !events.getItems().isEmpty()) {
while (true) {
for (Event event : events.getItems()) {
eventDate = event.getStart().getDateTime().toStringRfc3339();
eventDate = eventDate.substring(0, 10);
/*
* 1. when NOT deleting a range of dates, then only delete events
* that start on argument start date
* 2. when deleting a range of dates, then only delete events
* that start on or after argument start date
*/
if (deleteARangeOfDates) {
if (eventDate.compareTo(startDate) >= 0) {
delayIfNecessaryAndUpdateCounter();
client.events().delete(calendarEntry.getId(), event.getId()).execute();
eventsDeleted = true;
}
}
else {
if (startDate.equals(eventDate)) {
delayIfNecessaryAndUpdateCounter();
client.events().delete(calendarEntry.getId(), event.getId()).execute();
eventsDeleted = true;
}
}
}
String pageToken = events.getNextPageToken();
if (pageToken != null && !pageToken.isEmpty()) {
delayIfNecessaryAndUpdateCounter();
events = client.events().list(calendarEntry.getId()).setPageToken(pageToken).execute();
} else {
break;
}
}
}
} catch (GoogleJsonResponseException googleJsonException) {
String msg = "GoogleCalendarUtil.deleteEvents(): " +
googleJsonException.getDetails().toPrettyString();
throw googleJsonException;
} catch (Exception e) {
String msg = "GoogleCalendarUtil.deleteEvents(): " + e.getMessage();
throw e;
} finally {
// cleanup
}
return eventsDeleted;
}