Open data, les calendriers

android

Dans cet article nous verrons comment récupérer les données d’un google agenda afin de le rendre exploitable par une application android ou java. Je l’utilise moi même pour le système d’intelligence artificiel qui contrôle ma maison. Je peux ainsi prévoir mes prochains rendez vous et connaitre mes rendez vous de la journée lorsque je me lève. Afin de réaliser le parsing des données, j’utilise la librairie iCal4j qui est assez bien documenté et pour lequel le net regorge d’exemple.

Le format iCalendar

Le format est iCal est un format qui permet de représenter les agendas. Il s’agit d’un format normalisé. La page Wikipedia à ce sujet est assez bien réalisée et je vous laisse le soin de la visualiser.

Google propose d’exporter vos agendas dans ce format. Vous ne devriez pas rencontrez de difficulté si vous suivez les instructions des services de google à cette adresse. Attention à bien lire jusqu’au bout et à partager votre agenda (le rendre public) pour pouvoir accèder aux données.

Vous devez maintenant avoir un lien iCal qui ressemble à celui ci : « https://www.google.com/calendar/ical/mon.compte%40gmail.com/public/basic.ics »

Quelques exemples

Si vous avez pris le temps de lire la page Wikipedia, vous connaissez maintenant les différents composants que l’ont peux récupérer. Si vous ne l’avez pas encore fait je vous invite à le faire, c’est très rapide et ceci vous permettra de comprendre comment fonctionne le standard.

J’aimerai récupérer mon prochain rendez vous afin de l’afficher par exemple. Si celui ci a lieu dans plus de 7 jours, alors je n’en prends pas compte et indique à l’utilisateur qu’il n’a pas de rendez vous prévu dans les 7 prochains jours.

Pour cela il est nécessaire de :

  1. Récupérer un flux vers l’url de mon google agenda au format iCal
  2. Parser ce flux de données
  3. Filtrer les données pour récupérer les VEVENTs qui ont lieu dans les 7 prochains jours
  4. Afficher le premier VEVENT ou bien un message si il n’y a pas de rendez vous dans les 7 prochains jours

ce qui donne le code correspondant :

//1 Récupérer le flux de icalendar à partir de mon google agenda
URL googleCalendar = new URL("https://www.google.com/calendar/ical/mon.compte%40gmail.com/public/basic.ics");
BufferedReader in = new BufferedReader(new InputStreamReader(googleCalendar.openStream()));
 
//2 Parser le flux de données
CalendarBuilder builder = new CalendarBuilder();
Calendar calendar = builder.build(in);
 
//3 Filtrer les données pour récupérer les VEVENTs qui ont lieu dans les 7 prochains jours
Period period = new Period(new DateTime(today.getTime()), new Dur(7, 0, 0, 0));
Filter filter = new Filter(new PeriodRule(period));
Collection<?> eventsToday = filter.filter(calendar.getComponents(Component.VEVENT));
 
//4 Afficher le premier VEVENT ou bien un message si il n'y a pas de rendez vous dans les 7 prochains jours
Iterator<?> i = eventsToday.iterator();
if (!i.hasNext()) {
   System.out.println("Pas de rendez vous dans les 7 prochains jours");
} else {
   Component component = (Component) i.next();
 
   DateTime dateStart = new DateTime(component.getProperty("DTSTART").getValue());
   //DateTime dateEnd = new DateTime(component.getProperty("DTEND").getValue());
   String description = component.getProperty("DESCRIPTION").getValue();
   String location = component.getProperty("LOCATION").getValue();
   String name = component.getProperty("SUMMARY").getValue();
DateFormat formater = new SimpleDateFormat("dd MMMM yyyy 'à' hh 'heure et' mm 'minutes'",new Locale("FR", "fr"));
 
sentence = "Vous avez rendez-vous " + name + " le " + formater.format(dateStart) + ".";
if(null != location && !location.isEmpty()) {
   sentence = sentence + " Il se tiendra à " + location + ".";
}
 
if(null != description && !description.isEmpty()) {
   sentence = sentence + " La description asocié est " + description + ".";
}
 
System.out.println(sentence);

Afin d’obtenir d’avantage d’exemples, je vous invite à parcourir la page du wiki de iCal4j : http://wiki.modularity.net.au/ical4j/index.php?title=Examples
Vous y trouverez des exemples pour ajouter / récupérer des VEVENT, VCARD, générer un iCal etc…

Installation d’un Web Services sous Eclipse

Cet article va traiter uniquement de l’installation du Web Service. Un prochain article présentera le fonctionnement entre un Android et le Web Service.

Vous devez déjà avoir installé un serveur Tomcat. (J’ai écrit un article ici)

On utilisera comme web service le Apache Axis2.

La définition de Wikipédia :

Apache Axis2 is a core engine for Web services. It is a complete re-design and re-write of the widely used Apache Axis SOAP stack. Implementations of Axis2 are available in Java and C.

Axis2 not only provides the capability to add Web services interfaces to Web applications, but can also function as a standalone server application.

On va commencer par le télécharger ici

La dernière version pour moi est actuellement : 1.6.2 Release

On décompresse l’archive dans le répertoire /opt/ (et on met les droits utilisateurs)

$ unzip axis2-1.6.2-bin.zip
$ chown -R pierre:pierre axis2-1.6.2

Une fois l’archive décompressée, on va dans Eclipse :
Window > Preferences > Web Services > Axis2 Preferences.

On sélectionne le chemin où on a extrait notre archive : /opt/axis2-1.6.2
Et si tout va bien on a : Axis2 runtime loaded successfully

Après on va dans Server and Runtime (toujours dans Window > Preferences > Web Services).

On choisit notre serveur Tomcat avec la version désirée et on le met en Web Service : Apache Axis2

L’installation du Web Service est fonctionnel.

Création d’un projet pour tester notre Web Service.

File > New > Dynamic Web Project

On sélectionne la version du module à 2.5 Car la version 3.0 n’est pas compatible avec Axis2.

On va modifier notre configuration afin d’ajouter Axis2 Web Services (Core et Extensions).

Ci-dessous la configuration a réaliser :
ConfigurationAxis2WS

Si vous désirez pour les prochaines fois vous pouvez créer une configuration dédiée en cliquant sur « Save as ».

On peut cliquer sur terminer.

Je vais créer une classe Login qui aura une méthode login et prendra deux paramètres (un nom et mot de passe).

Voici le code :

public class Login {
 
	public String login(String username, String password){
		System.out.println("Appel WS : " + username +" "+ password);
		if(username.equals("oversimple") &amp;&amp; password.equals("oversimple")){
			return "Mot de passe OK";
		}
		return "Mot de passe KO";
	}
}

Une fois la classe créée, clic droit dessus > Web Services > Create Web Service :
On laisse la configuration par défaut c’est à dire :
Service implementation : Login et on laisse à l’état démarré
Client type : Java Proxy et on laisse à aucun client.

On termine. Il faut patienter environ une minute.

Notre serveur est démarré : On peut allé sur la page suivante : http://localhost:8080/Oversimple/ et cliquer sur « Services »
On peut voir notre service :
Axis2

On a un web service qui fonctionne, dans un prochain article je vais vous présenter le fonctionnement avec Android (ksoap2).

Installation du Serveur Apache Tomcat avec Eclipse

Avec Julien, on avait besoin besoin d’un serveur Tomcat pour notre Eclipse.

Pour ça on a besoin :

  • Un Eclipse Java EE (Disponible en téléchargement ici | Choisir Eclipse IDE for Java EE Developers )
  • Un Serveur Apache Tomcat (Disponible en téléchargement ici | Rubrique Download et choisir la version)

On se retrouve donc avec une archive Eclipse Java EE et une archive pour le serveur tomcat.

J’ai effectué l’installation sous Linux mais le principe est identique sous Windows.

On commence par extraire l’archive tomcat dans le repertoire /opt:
Si ZIP :

cd /opt && unzip apache-tomcat-7.0.39.zip

Si TAR.GZ :

 tar xzvf apache-tomcat-7.0.39.tar.gz -C /opt

Attention : Il faut que votre archive soit avec les droits de l’utilisateur et non les droits root. (sinon des problèmes apparaissent avec Eclipse).

On peut configurer notre serveur tomcat mais cela est optionnel pour le fonctionnement avec eclipse.
Cette étape est nécessaire quand on désire le déployer manuellement par exemple.

Le fichier de configuration est :

/opt/apache-tomcat-7.0.39/conf/tomcat-users.xml

J’ai ajouté les informations suivantes (entre les balises tomcat-users :

<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="oversimple" password="oversimple" roles="admin-gui,manager-gui"/>

L’utilisateur est oversimple et son mot de passe est oversimple.

Pour démarrer tomcat il faut exécuter le script bin/startup.sh (ou .bat son Windows) et l’éteindre bin/shutdown.sh.

Après ce petit écart sur la configuration de tomcat, on va configurer notre eclipse.

On décompresse notre archive et puis on exécute le binaire Eclipse.

Une fois notre workspace choisi, il faut configurer pour la première fois notre serveur Tomcat.

Dans Eclipse :

Window > Preferences | Server > Runtime Environments

On ajoute un serveur (add) et on sélectionne un Apache Tomcat vX.0 (cela correspond à la version que vous avez téléchargé précédemment). Après avoir cliqué sur Next on sélectionne notre répertoire apache-tomcat. Dans mon cas : /opt/apache-tomcat-7.0.39

Après on sélectionne la vue Server. (Window > Show View > Other … Server).

On crée un nouveau serveur et on ajoute des projets JEE. Si aucun projet présent, on peut l’ajouter par la suite.

Pour l’ajouter par la suite, on effectue un clic droit sur notre serveur et « Add and Remove… ».

It’s oversimple isn’t it?