A la découverte du Framework Avatar

Le 24 Septembre, Oracle a ouvert les sources de son nouveau Framework Avatar sans faire de bruit. Ce Framework permet de développer des Single Page Applications HTML5. Aujourd’hui, Node.js est le second projet le plus populaire sur GitHub. Les frameworks javascript comme Angularjs deviennent de plus en plus populaire. C’est dans ce contexte que Oracle dévoile son framework pour rentrer dans la course au Javascript. Penchons nous sur celui-ci.

Présentation générale

Avatar repose sur le projet Nashorn un projet développé actuellement dans OpenJDK et qui sera inclus dans Java 8, il a pour but de permettre d’intégrer du Javascript à l’intérieur des applications Java. Nashorn remplace Rhino déjà présent dans le JDK depuis la version 6.
Avec Avatar, il est maintenant possible d’implémenter les services côté serveur uniquement en Javascript à la manière de Node.js. Javascript ne remplace pas Java mais les deux langages deviennent complémentaires. Il est donc possible d’écrire les services en Java, en Javascript, ou les deux à la fois.
avatar-arch-ee2.png
Si vous ne savez pas ce qu’est SSE, c’est une fonctionnalité présente dans les recommandations de HTML5 qui permet au serveur de pousser des informations aux clients sans que ceux-ci aient demandé cette information. Cela permet aux données d’être à jour en temps réel.
Au niveau de l’accès aux données, Avatar utilise la notion de data provider et met à disposition un file provider et un JPA provider. D’autres provider sont prévus pour les versions futurs.
Avatar inclut une API Javascript pour s’interfacer avec JMS et envisage d’inclure d’autres API ‘natives’ pour s’interfacer avec d’autres technologies EE comme les EJB.
avatar-arch.png
Comme on peut le voir sur le diagramme, il est possible de lancer des modules Node.js directement via Avatar.
Maintenant que l’on en sait plus sur Avatar, nous allons voir pourquoi l’utiliser.

L’intérêt d’Avatar

Dans un premier temps, il est intéressant de connaître les motivations initiales d’Oracle de développer ce framework. Avec l’émergence du HTML5, Oracle veut d’abord convaincre que Java reste une solution intéressante pour développer des applications qui répondent aux nouveaux besoins.
Ensuite, si on regarde Node.js, on constate qu’il est devenu très populaire et il est de plus en plus utilisé depuis sa sortie, ce qui prouve qu’il y a une demande forte. Mais Node.js est basé sur Google v8 et certains modules peuvent nécessiter d’écrire du code natif en C, C++. Ce n’est pas le cas avec Avatar car il utilise la JVM et a donc l’avantage du ‘write once, run anywhere’.
La plupart des core modules Node.js fonctionnent avec Avatar et il est prévu qu’à terme, ils fonctionnent tous.
L’intégration de Phonegap existe déjà et montre bien que le marché des applications mobile est particulièrement visé par Oracle.
A chaque changement dans un fichier, l’application sera recompilée à la requête suivante. Cela permet un développement plus rapide. En pratique, ce n’est pas vraiment le cas et il faut espérer que cela sera corrigé dans les prochaines version. En production, les fichiers .js et .css sont automatiquement minifiés.
Voyons voir comment cela a été mis en œuvre.

Préparation de l’environnement

Pour utiliser Avatar, JDK 8 est nécessaire. Il est accessible uniquement en version béta car la sortie officielle est prévue en 2014.
Télécharger l’archive d’Avatar à l’adresse suivante : https://java.net/projects/avatar/downloads
Ajouter la variable d’environnement AVATAR_HOME et ajouter ${AVATAR_HOME}/glassfish4/bin à la variable PATH.
Le serveur d’application GlassFish est fourni de base avec Avatar et permet de manipuler le framework rapidement. C’est ce que nous allons faire dans cette article mais il faut préciser que le framework n’est pas lié à GlassFish et peut très bien être utilisé sur un autre serveur d’application.
Vous êtes maintenant prêt à utiliser Avatar.

Les outils en ligne de commande

Deux outils sont présents dans Avatar : avatar et asadmin.
avatar permet de compiler et créer des applications vides ou des applications de démonstration. Ainsi, il est possible de tester des exemples d’application utilisant REST, les websockets, SSE et des composants .
asadmin est un outil d’administration du serveur GlassFish. Il permet de lancer le serveur et de déployer les applications.
Nous allons donc utiliser ces deux outils pour créer une nouvelle application HelloWorld et lancer un serveur GlassFish :

avatar new HelloWorld
asadmin start-domain
asadmin deploy HelloWorld

Nous utilisons ces outils principalement pour initialiser le projet et gérer le déploiement de l’application sur le serveur GlassFish.

Implémentons un HelloWorld

Développons maintenant une application simple utilisant un service REST basique qui affiche ‘Hello #{name}’ et un service SSE qui affiche en temps réel l’heure et la date du serveur.
Dans le fichier HTML coté client, nous définissons les deux services (REST et SSE) et nous affichons tout simplement le résultat. L’utilisateur a la possibilité de modifier le nom via le service REST.
Les sources sont disponible ici.

<!DOCTYPE html>
<html>
    <head>
        <title>Demo</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    </head>
    <body>
	<script data-model="rest">
		var Server = function() { this.name = ''; };
	</script>
	<script data-model="push">
		var Updates = function() { this.hour = this.minute = this.second = this.day = this.Month = this.year = ''; };
	</script>
  	<script data-type="Server" data-instance="server" data-url="data/name"></script>
	<script data-type="Updates" data-instance="updates" data-url="push/time"></script>
	<h2>Service Rest</h2>
	<span id="output">Hello #{server.name}</span>
        <input size="24" id="name" data-value="#{server.name}"/>
        <button onclick="#{server.$put()}" id="set">Send</button>
	<h2>Service SSE</h2>
       	<output class="time">Time: </output><output class="time">#{updates.hour}:#{updates.minute}:#{updates.second}</output><br>
       	<output class="time">Date: </output><output class="time">#{updates.day}/#{updates.Month}/#{updates.year}</output><br>
    </body>
</html>

Dans le fichier html, les variables Avatar ont le format suivant : #{VARIABLE}. Les fonctions prédéfinies par le framework commencent par le caractère $, cela permet simplement de développer sans avoir de conflit avec les noms des fonctions du framework.
Dans le fichier javascript coté serveur, nous définissons une fonction qui retourne la date actuelle du serveur et nous l’utilisons dans la définition du service SSE. Ensuite nous définissons un service REST tout simple qui accepte les méthodes GET et PUT.

var avatar = require("org/glassfish/avatar");
var getTime = function() {
	var result = new Date();
	return {
		time: result.toISOString(),
		hour: result.getHours(),
		minute: result.getMinutes(),
		second: result.getSeconds(),
		day: result.getDate(),
		Month: result.getMonth()+1,//getMonth() returns 0-11
		year: result.getFullYear()
	};
};
avatar.registerRestService({
	url: "data/name",
	methods: ["GET", "PUT"]},
	function() {
		this.$onGet = function(request, response) {
			return response.$send({name:"World"});
		};
		this.$onPut = function(request, response) {
			return response.$send({name:request.data.name});
		};
	}
);
avatar.registerPushService({
	url: "push/time"},
	function() {
		this.$onOpen = this.$onTimeout = function(context) {
			context.$setTimeout(1000);
			return context.$sendMessage(getTime());
		};
	}
);

C’est aussi simple que ça. Il suffit maintenant de déployer et de tester.

Ce qu’il manque

  • Un gros avantage de Node.js est NPM qui permet d’installer des modules Node.js très facilement. Un APM est prévu pour le projet Avatar mais n’est pas disponible pour le moment.
  • Avatar vient de sortir et la communauté autour du framework est petite voire inexistante.
  • Le modèle doit être défini à la fois coté serveur et coté client.
  • L’accès à la base de données se limite à l’utilisation de JPA.
  • La documentation et les ressources en règle générale sont très limitées. L’équipe de développement elle-même n’hésite pas à dire que la documentation manque de cohérence pour certaines choses. Ils y travaillent et nous pouvont voir des ajouts/modifications sur le site très régulièrement.
  • Les logs sont difficiles à lire et l’origine du problème pas toujours facile à comprendre.
  • Pour ceux qui développent sur Windows, les outils en ligne de commande ne fonctionnent pas pour le moment et ce n’est pas précisé sur leur site.
  • Encore une fois, tout cela est amené à évoluer. Il faudra donc suivre l’évolution du framework pour savoir si ces points seront améliorés.

Conclusion

Le framework vient d’être ouvert au public, il n’est pas terminé et cela se ressent. La documentation n’est pas complète et même vide pour certains points. La version Early Access a été téléchargée moins de 1000 fois en 10 jours (même si le nombre de téléchargements par jours a tendance à augmenter avec le temps).
Nous pouvons comprendre pourquoi certains choisiront Avatar à la place de Node.js mais ce n’est pas le seul concurrent à l’heure actuelle. Il y a aussi Vert.x lancé depuis 2012 qui utilise aussi la JVM et qui a l’avantage d’être polyglotte et beaucoup plus abouti à l’heure actuelle qu’Avatar. Il reste plus qu’à attendre la sortie d’une version finale pour se faire une meilleure idée du framework. En attendant, Node.js et Vert.x ont encore de beaux jours devant eux.

2 réflexions sur “A la découverte du Framework Avatar

  • 11 octobre 2013 à 19 h 11 min
    Permalien

    Bonjour,

    >Un gros avantage de Node.js est NPM qui permet d’installer des modules Node.js très facilement et cela n’existe pas pour Avatar.js.

    Il semble qu’il y ait un… apm (Avatar Package Manager), équivalent de npm. (cf https://avatar-js.java.net/doc/pres…)

    Enfin, je pense qu’il faut bien dire Avatar car Avatar.js est un « sous-projet » (nashorn <=> Rhino ou V8, avatar.js <=> Node.js, Avatar <=> Node.js+eco-système, express, etc.)

    avatar.js : https://avatar-js.java.net/, https://java.net/projects/avatar-js
    avatar : https://avatar.java.net/

    sauf mauvaise compréhension de ma part…
    sbs

    Répondre
  • 15 octobre 2013 à 10 h 12 min
    Permalien

    Bonjour,
    Effectivement, un Avatar Package Manager a été prévu mais pour l’instant, je n’ai trouvé aucune trace sur le site d’Avatar. J’imagine que l’outil doit toujours être en cours de développement. Je vais quand même modifier l’article en conséquence, merci.
    Et vous avez raison pour Avatar.js, c’est bien un sous projet d’Avatar. Le site est mis à jour régulièrement et ils ont ajouté un lien vers ce sous-projet : https://avatar-js.java.net/ . Depuis l’écriture de ce billet, ils ont déjà beaucoup amélioré leur site, c’est encourageant.

    Répondre

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

%d blogueurs aiment cette page :