Délivrant tout type de contenu, une application web développée avec le framework web agile Grails peut aussi servir un gadget universel UWA : c'est à la fois générer la page XHTML qui le contiendra, mais aussi permettre au gadget d'appeler, via AJAX, les actions d'un contrôleur Grails de l'application web.
L'exemple du gadget simple BoxWidget décrit dans cet article est par ailleurs enregistré dans l'écosystème des gadgets Netvibes ; il peut être installé sans modification sur plusieurs plateformes de gadgets, et peut également être inclus dans n'importe quelle page web comme ci-dessous :
L'API UWA
Netvibes propose aux développeurs, un framework appelé UWA (Universal Widget API) permettant l'écriture de gadgets grâce aux standards du Web tels que XHTML, CSS et AJAX. L'intérêt de cette API est repris dans la formule déjà connue « Write once, run everywhere », mais appliquée ici aux gadgets : en effet, un gadget développé avec UWA est de fait compatible avec plusieurs plateformes de gadgets (iGoogle, Windows Vista, Apple Dashboard, Live.com, Opera, etc.).
Un gadget UWA est défini par un document XHTML, et contient du code JavaScript qui lui permet de communiquer avec des services externes au moyen d'appels en AJAX. A la suite d'un tel appel, le gadget peut par exemple ajuster son affichage de manière dynamique.
UWA propose aussi plusieurs modèles d'affichage pour vos données, se présentant ainsi sous la forme de grilles, listes, classeurs à onglet, ou encore de plusieurs pages liées par navigation.
Le gadget BoxWidget
Le but du gadget BoxWidget est de donner des informations sur la quantité de mémoire utilisée par l'application web ; plus précisément le pourcentage de mémoire utilisée par rapport à celle qui a été allouée à l'application web, au sein de la machine virtuelle Java.
Le graphe présenté est, quant à lui, une image générée par un appel en ligne à l'API Google Chart ; nous en donnons plus de détails plus loin.
Comme nous l'avons mentionné plus haut, le document XHTML définissant le gadget BoxWidget est généré de manière dynamique par une vue GSP : l'intérêt de cette approche est que nous pouvons avoir recours aux tags de Grails pour y inclure par exemple des liens pointant vers des actions Grails.
En l'occurrence, le tag createLink (utilisé sous forme d'appel de fonction) apparaissant dans le code JavaScript ci-dessous, permet de récupérer des données au format JSON, par invocation de l'action memoire (du contrôleur WidgetController) :
UWA.Data.getJson('${createLink(base: 'http://www.grailsworks.com', action: "memoire")}', boxWidget.display);
}
onLoad est la première fonction JavaScript du gadget à être appelée ; ici, la fonction qui y est associée réclame des données structurées au format JSON à partir de l'URL http://www.grailsworks.com/grailsbox/widget/memoire (qui sera produite lors de la génération de la page grâce au tag createLink). Les données ainsi obtenues sont alors transmises à la fonction JavaScript boxWidget.display qui a pour but de mettre à jour l'affichage du gadget :
widget.setBody('<div><img alt="Mémoire allouée" src="http://chart.apis.google.com/chart?cht=gom&chs=200x100&chd=t:' + data.valeur + '&chco=ffffff,ff0000" /><br/><span>' + data.texte + '</span></div>');
}
Cette fonction rafraîchit l'affichage du gadget en incluant un graphe Google de type Google-o-meter et un texte.
Voyons comment les données data.valeur, la valeur du pourcentage pour le graphe, et data.texte, sont transmises par la partie serveur, c'est-à-dire l'action Grails memoire :
// Voir http://blog.codebeach.com/2008/02/determine-available-memory-in-java.html
def runtime = Runtime.runtime
long maxMemory = runtime.maxMemory()
long allocatedMemory = runtime.totalMemory()
def tailleFormat = NumberFormat.getInstance(Locale.FRENCH)
def pourcentageFormat = NumberFormat.getPercentInstance(Locale.FRENCH)
def data = [valeur: 100.0*allocatedMemory/maxMemory, texte: "${pourcentageFormat.format(allocatedMemory/maxMemory)} (${tailleFormat.format(allocatedMemory/1024.0)} Ko)"] as JSON
render data
}
Passons le traitement réalisé dans l'implémentation de cette action ; celle-ci retourne des données JSON au moyen de la variable data, qui est le résultat de la conversion d'une map Groovy, comportant les clés valeur et texte, au format JSON.
Voici un exemple de ce que peut renvoyer l'action memoire :
{"valeur":90.6833824975,"texte":"91% (59 024 Ko)"}
Le gadget BoxWidget constitue bien un exemple de surveillance d’un service distant, accessible à partir de toutes sortes de plateformes !