A la découverte de l’api Google Agenda client

Cet article va vous présenter les fondamentaux pour accéder en java un Agenda Google avec l'api client. Cette API permet d'accéder à la plupart des services Google.

Préparation

Vous pouvez récupérer une version de cette api à l'adresse suivante: http://code.google.com/p/gdata-java-client/

Récupérez les dernières version des jar suivants:

gdata-src.java-x.xx.x.zip the google java client API.
gdata-samples.java-x.xx.x.zip the samples provided by google to use java client API).

Vous avez besoin des dépendances suivantes :

Dépendances

Requises:
-         JDK 5.0 ou supérieur.
-         Google Collections 1.0 ou supérieure. http://code.google.com/p/google-collections/
-         Apache ANT version 1.7.0 ou supérieure.

Optionnelles:
-         mail.jar Java Mail Api de Sun (version 1.4 ou supérieure). http://java.sun.com/products/javamail/
-         activation.jar Java Beans Activation Framework. De Sun http://java.sun.com/javase/technologies/desktop/javabeans/jaf/
-         servlet.jar Servlet API de Sun (version 2.3 ou supérieure). http://java.sun.com/products/servlet/

Une fois le téléchargement effectué, lancez la commande ant. Vous devez vérifier que ant est correctement configuré.

Pour ce faire, se reporter à l'adresse http://ant.apache.org/manual/index.html.

Configuration du Proxy

Pour ce faire vous aurez besoin de paramétrer les variable système suivantes :

http.proxyUser = nom d'utilisateur défini sur le proxy
http.proxyPassword = password de cet utilisateur
https.proxyHost = nom du proxy
https.proxyPort = port du proxy

Pour plus d'informations, se reporter à http://code.google.com/intl/fr/apis/calendar/data/2.0/developers_guide_protocol.html#AuthAuthSub

Ce paramétrage n'est utile que si vous vous connectez via un proxy.

Préparation des tests

Pour vous connecter vous aurez besoin des éléments suivants:

-         Si nécessaire les éléments suivants :

o       http.proxyUser
o       http.proxyPassword
o       https.proxyHost
o       https.proxyPort

-         Votre utilisateur google (par exemple  something@google.com)
-         Votre mot de passe google.

La récupération des informations de votre calendrier Google se fait par la connexion à des flux.

Pour la récupération de vous ou vos calendrier(s) il vous faut vous connecter à un des trois flux suivants:

-         Le flux méta : Il est privé, en lecture seule. Il contient une entrée pour chaque agenda  à laquelle l'utilisateur peut accéder. Le format de l'url méta est :
o       https://www.google.com/calendar/feeds/default

-         Le flux allcalendars : Il est privé accessible en lecture écriture. Il est utilisé pour gérer les souscriptions et la personnalisation d'un calendrier de l'utilisateur. Le format de l'url allcalendars est :
o       https://www.google.com/calendar/feeds/default/allcalendars/full

-         Le flux owncalendars: Il  est privé accessible en lecture écriture. Il peut être utilisé pour gérer les agendas que l'utilisateur possède. Le format de l'url owncalendars est :
o       https://www.google.com/calendar/feeds/default/owncalendars/full

Exemple de connexion à un calendrier

Pour récupérer les Agendas, il suffit de se connecter à une des URL ci-dessus:
public final class CustomAuthenticator extends Authenticator {
protected PasswordAuthentication getPasswordAuthentication() {
returnnew PasswordAuthentication(<http.proxyUser>, <http.proxyPassword>.toCharArray());
}
}

// Création du service calendar avec authentification
CalendarService myService = new CalendarService("service-1");
myService.setUserCredentials(<comptye_google>, <password_google>);

// Authentification proxy
myService.setUserCredentials(<proxu_user>, <proxy_password>); myService.setConnectTimeout(0);
myService.useSsl();

// Authentification proxy
Authenticator.setDefault(new CustomAuthenticator());

// Envoie de la requête est affichage de la réponse
URL feedUrl = new URL("https://www.google.com/calendar/feeds/default/allcalendars/full");
CalendarFeed resultFeed = myService.getFeed(feedUrl, CalendarFeed.class);
System.out.println("Agendas :");
for (int i = 0; i < resultFeed.getEntries().size(); i++) {
CalendarEntry entry = resultFeed.getEntries().get(i);
System.out.println("t" + entry.getTitle().getPlainText());
}

Récupération des événements

Pour accéder aux événements il faut se connecter au flux :

https://www.google.com/calendar/feeds/userID/visibility/projection

Avec :

Le code suivant permet donc de récupérer la liste de événements d'un utilisateur
URL feed = new URL("https://www.google.com/calendar/feeds/<user_google>/private/full");
CalendarService myService = new CalendarService("exemple-1");
myService.setUserCredentials(<user_google>, <password_google>);

// Envoyer la réponse et attendre le résultat
CalendarEventFeed myFeed = myService.getFeed(feed, CalendarEventFeed.class);

Récupération des événement par requêtes

On peut par exemple par ce biais récupérer la liste des événements entre deux dates ou deux heures:

URL feed = new URL("https://www.google.com/calendar/feeds/default/private/full");

CalendarQuery query = new CalendarQuery(feed);
query.setMinimumStartTime(DateTime.parseDateTime("2006-03-16T00:00:00"));
query.setMaximumStartTime(DateTime.parseDateTime("2006-03-24T23:59:59"));

CalendarService service = new CalendarService("exemple-1");
service.setUserCredentials(<user_google>, <password_google>);

// Send the request and receive the response:
CalendarEventFeed resultFeed = myService.query(myQuery, Feed.class);

Création

Création d'un événement de 30 minutes :

URL feed = new URL("https://www.google.com/calendar/feeds/<user_google>/private/full");
CalendarService service = new CalendarService("exemple-1");
service.setUserCredentials(<user_google>, <password_google>);
CalendarEventEntry entry = new CalendarEventEntry();
entry.setTitle(new PlainTextConstruct("Titre Evenement"));
entry.setContent(new PlainTextConstruct("Text Evenement."));
entry.setQuickAdd(false);
Calendar calendar = Calendar.getInstance();

// Début de l'événement : heure courante
DateTime start = new DateTime(calendar.getTime(), TimeZone.getDefault());
// Durée de l'événement : 30 minutes
calendar.add(Calendar.MINUTE, 30);
DateTime end = new DateTime(calendar.getTime(), TimeZone.getDefault());
When times = new When();
times.setStartTime(start);
times.setEndTime(end);
entry.addTime(times);
// Valider l'événement
return service.insert(feed, entry);

Création d'une série d'événements en mode batch

Ceci permet d'effectuer plusieurs actions sur un agenda en une seule requête

List<CalendarEventEntry> events = new ArrayList<CalendarEventEntry>();
CalendarEventEntry entry;
Calendar calendar = Calendar.getInstance();
When eventTimes;

DateTime start;
DateTime end;

// Premier jour de la semaine 0h00:00
calendar.set(DAY_OF_WEEK, MONDAY);
calendar.set(HOUR_OF_DAY, 0);
calendar.set(MINUTE, 0);
calendar.set(SECOND, 0);
calendar.set(MILLISECOND, 0);

for (int i = 0; i < 200; i++) {

    entry = new CalendarEventEntry();
    entry.setTitle(new PlainTextConstruct("Evenement-" + i));
    entry.setContent(new PlainTextConstruct("Ceci est le contenu de l'evenement-" + i));
    entry.setQuickAdd(false);

    start = new DateTime(calendar.getTime(), TimeZone.getDefault());

    // Evenement d'une durée de 30 minutes
    calendar.add(MINUTE, 30);
    end = new DateTime(calendar.getTime(), TimeZone.getDefault());

    eventTimes = new When();
    eventTimes.setStartTime(start);
    eventTimes.setEndTime(end);
    entry.addTime(eventTimes);

    events.add(entry);
}

CalendarEventFeed batchRequest = new CalendarEventFeed();

int i = 0;
for (CalendarEventEntry event : events) {
    BatchUtils.setBatchId(event, String.valueOf(i++));
    BatchUtils.setBatchOperationType(event, INSERT);
    batchRequest.getEntries().add(event);
}

CalendarEventFeed feed = service.getFeed(feed, CalendarEventFeed.class);
Link batchLink = feed.getLink(Link.Rel.FEED_BATCH, Link.Type.ATOM);
URL batchUrl = new URL(batchLink.getHref());

// Envoie de la requête
CalendarEventFeed batchResponse = service.batch(batchUrl, batchRequest);

if (check(batchResponse)) {
    log.debug("Evénements crées avec succés par batch.");
}

Suppression

Vous pouvez aussi de façon très simple supprimer des éléments : Agenda, Evenement...

Ceci est un exemple de suppression d'un événement.

// Supprimer un événement existant
URL delete = new URL(eventEntry.getEditLink().getHref());
service.delete(delete);

Vous devez au préalable interroger l'agenda pour récupérer l'id de l'évènement ou connaitre ce dernier.

Suppression des événements en mode batch. Comme pour la création, vous pouvez supprimer une série d'évènements en une seule requête. Ci-dessous un exemple de cette utilisation.

List<CalendarEventEntry> events = new ArrayList<CalendarEventEntry>();
calendar.set(DAY_OF_MONTH, 1);calendar.set(SECOND, 0);
calendar.set(MILLISECOND, 0);
DateTime startTime = new DateTime(calendar.getTime(), TimeZone.getDefault());
calendar.set(DAY_OF_MONTH, calendar.getActualMaximum(DAY_OF_MONTH));
calendar.set(HOUR_OF_DAY, calendar.getActualMaximum(HOUR_OF_DAY));
calendar.set(MINUTE, calendar.getActualMaximum(MINUTE));
calendar.set(SECOND, calendar.getActualMaximum(SECOND));
calendar.set(MILLISECOND, calendar.getActualMaximum(MILLISECOND));

DateTime endTime = new DateTime(calendar.getTime(), TimeZone.getDefault());

CalendarQuery query = new CalendarQuery(eventFeed);
query.setMinimumStartTime(startTime);
query.setMaximumStartTime(endTime);
query.setMaxResults(200);
CalendarEventFeed resultFeed = service.query(query, CalendarEventFeed.class);
for (CalendarEventEntry entry : resultFeed.getEntries()) {
    events.add(entry);
}

CalendarEventFeed batchRequest = new CalendarEventFeed();
int i = 0;
for (CalendarEventEntry toAdd : events) {
    BatchUtils.setBatchId(toAdd, String.valueOf(i++));
    BatchUtils.setBatchOperationType(toAdd, DELETE);
    batchRequest.getEntries().add(toAdd);
}
CalendarEventFeed feed = service.getFeed(eventFeed, CalendarEventFeed.class);
Link batchLink = feed.getLink(Link.Rel.FEED_BATCH, Link.Type.ATOM);
URL batchUrl = new URL(batchLink.getHref());
// Envoier la requête batch
CalendarEventFeed batchResponse = service.batch(batchUrl, batchRequest);

Pour plus d'informations d'exemple et autre, reportez vous à la documentation Google: http://code.google.com/intl/fr/apis/calendar/data/1.0/developers_guide_java.html

Un commentaire

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *