Revue de Presse Xebia

Revue de Presse Xebia

La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.

Actualité éditeurs / SSII

Le coin de la technique

Actualité éditeurs / SSII

SpringOne2GX 2010 – Les annonces de SpringSource

La semaine dernière se tenait la conférence SpringOne 2GX à Chicago. Cette conférence a été le théâtre de nombreuses annonces du duo SpringSource/Vmware. Cette actualité est notamment relayée sur le blog de Rod Johnson.

Code2Cloud

SpringSource présente ici une forge logicielle mettant en oeuvre des services tels que :

  • un système de bug tracking basé sur Bugzilla,
  • utilisation du système de bug tracking avec Mylyn
  • la gestion du code source avec Git, le système de contrôle de version distribué phare du moment,
  • de l’intégration continue avec Hudson,
  • une intégration de cette nouvelle plateforme avec STS.

Code2Cloud a pour ambition de simplifier la vie des développeurs tout en augmentant leur productivité en leur permettant de se focaliser sur les aspects métiers. Nous ne manquerons pas de suivre l’actualité de ce projet et de l’évaluer dès que la Developer Preview sera disponible. Cette preview ne devrait pas être disponible avant le début 2011 (cf FAQ).
Pour ceux qui se posaient la question, le code de ce projet sera fournit sous les termes de la GPL.

Preview de Spring 3.1

De nombreuses évolutions nous attendent dans la version 3.1 du framework Spring avec au menu :

  • le support des servlet 3.0,
  • les profils d’environnement permettant de charger des propriétés différentes selon que l’on soit sur un environnement de développement, de recette ou de production (ce principe est notamment utilisé dans Grails par exemple),
  • une couche d’abstraction pour l’accès aux systèmes de cache (EhCache et GemFire dans un premier temps) et une nouvelle annotation @Cacheable,
  • un effort a aussi été réalisé afin de diminuer le nombre de configuration qu’il est possible de réaliser en xml mais pas en utilisant des annotations.

Cette version semble prévue pour le début de l’année 2011 (la roadmap s’arrête actuellement mi-janvier 2011 avec la 3.1M2).

Mais SpringSource annonce de nouveaux projets venant s’ajouter au portefeuille. Les voici:

Spring Data

SpringSource s’attaque avec Spring Data aux bases de données NoSql. L’idée est de fournir un moyen simple d’accès aux bases de données non relationnelles ainsi qu’à des technologies telles que Oracle RAC.
Le projet Spring Data contient de nombreux sous projets permettant notamment l’accès aux bases de données orientées :

Le projet propose un système de templating bien connu des développeurs utilisant le framework Spring, pour permettre l’accès à ces bases de données.

Spring Mobile

Ce projet a pour but de fournir un meilleur support pour l’écriture d’applications destinées aux terminaux mobiles. Il repose sur des évolutions de Spring MVC et un partenariat avec Google autour de GWT.

Spring Social

Ce projet doit simplifier les interactions avec des services des réseaux sociaux tels que Twitter, Facebook ou encore LinkedIn. Spring Social fournira :

  • un Social Network Template permettant d’interagir avec les réseaux sociaux supportés (LinkedInTemplate, FacebookTemplate …),
  • une intégration OAuth pour la gestion des autorisations (une request factory signera les requêtes REST avec les informations d’autorisation OAuth requises)
  • le mécanisme nécessaire à l’extraction du Facebook User ID.

SpringSource fournit un exemple d’application permettant de voir comment fonctionne ce nouveau projet.

Spring Payment Services

Ce projet facilitera l’intégration de services de paiement dans les applications Spring. Ce projet réalisé en partenariat avec Visa qui fournit l’expertise métier aux développeurs de SpringSource vise à permettre différents types de paiements (paiement en ligne, paiement mobile, paiement de personne à personne …) via différents fournisseurs de services de paiement (donc pas uniquement Visa). Spring Payment Services étant encore en incubation, il est possible que les API subissent un lifting plus ou moins prononcé. Il est donc préférable de l’utiliser uniquement pour évaluation à l’heure actuelle.

Spring ROO 1.1.0

En restant toujours dans l’écosystème de SpringSource, Spring Roo 1.1.0 vient de sortir après 10 mois de gestation.

Spring Roo est un outil de haute productivité de SpringSource pour développer rapidement des applications Java. Par l’intermédiaire d’un shell, intégré à SpringSource Tool Suite, on peut en quelques commandes construire le squelette d’un projet, avec pojos et classes de tests, puis ajouter ensuite tout un ensemble de fonctionnalités liées à des frameworks tels que Spring MVC, Hibernate, JMS (la liste est longue)… Spring Roo s’appuie massivement sur les annotations et AspectJ pour générer les sources.

Parmi les nouvelles fonctionnalités:

  • du reverse engineering incrémental à partir de la base de données. On génère les entités à partir de la base de données. Si le modèle évolue ensuite, les entités seront enrichies mais en gardant les éventuelles modifications que le développeur a pu ajouter depuis la dernière génération.
  • des améliorations avec Spring MVC. Spring Roo utilise des fichiers JSPX (JSP XML compatible) au lieu de JSP ce qui lui permet à présent de pouvoir faire des aller-retours (round-trip) avec le modèle pour mettre à jour un champ par exemple.
  • une meilleure intégration de GWT et de Google App Engine.
  • une intégration de Apache Solr, le serveur de recherche derrière Apache Lucene, garantissant la réindéxation des éléments lorsqu’une entité est insérée, mise à jour ou effacée.
  • des nouvelles annotations comme @RooJson qui ajoute deux méthodes de sérialisation/désérialisation à votre classe et @RooSerializable pour maintenir le serialVersionUID.

Le projet a lui-même subi des changements au niveau de son développement. Outre le passage à OSGI, ses sources sont maintenant sous Git (tout comme Hibernate récemment) et le projet a un nouveau logo. SpringSource a également mis à jour la plupart des librairies (JPA 2, Spring Framework, Spring Security, Spring Web Flow, Log4j, ActiveMQ, AspectJ et GWT).

Se plaçant comme une alternative à des outils comme Grails pour la haute productivité, il a le très grand avantage d’être full java. Par ailleurs, son shell, avec ses aides et ses complétions, est très réussi. A voir maintenant s’ils arrivent à convaincre plus de projets à migrer sur cette solution. Pour ceux qui aimerait en savoir plus, Spring Roo in Action va paraître chez Manning au printemps 2011.

Sortie de GWT 2.1

Après des mois d’attente, nous avons accueilli avec joie la sortie de GWT-2.1 jeudi dernier. Cette version arrive avec beaucoup de nouveautés; au menu un framework Editor, RequestFactory, MVP, Nouveaux widgets et bien plus. Bruce Johnson et son équipe ont voulu que cette version de GWT soit celle de la maturité. GWT 2.1 a pour objectif de bien répondre aux besoins des applications d’entreprise et les applications de haute scalabilité. C’est la version qui marie RAD, RIA et scalabilité.
Parmi les nouveautés on trouve:

  • le framework Editor: Ce nouveau framework assure le binding entre les vues et le modèle. Vous aurez moins de code à écrire afin de peupler vos interfaces graphiques avec le contenu de vos POJO et vice versa.
  • Le framework RequestFactory : Une alternative de GWT-RPC permettant de créer des applications CRUD. RequestFactory n’a pas pour but de remplacer GWT-RPC, mais plutôt de simplifier la mise en place de la couche d’accès aux données entre le client et le serveur.
  • Le framework MVP (Places et activities): Enfin un framework interne qui implémente le pattern Model-View-Presenter en se basant sur les Places (notion de Lieu ou de place dans l’application) et les Activities (une activity c’est ce que peut faire un utilisateur dans une région de la page)
  • Data présentation widgets (cell widgets): des composants orientés données ont été ajoutés toujours dans le but de permettre aux applications d’entreprises qui manipulent des millions d’enregistrements de faire des rendus rapides et efficaces (CellList, CellTable, CellTree, CellBrowser…).
  • Sécurité: afin d’améliorer la sécurité des applications GWT, une nouvelle librairie voit le jour. Disponible sous le package com.google.gwt.safehtml et autour de l’interface SafeHTML. Cette librairie veut limiter les vulnérabilités liées au XSS (Cross-Site-Scripting).
  • Logging coté client : java.util.logging est maintenant émulé dans le GWT-SDK il est désormais possible de créer des logs de la même manière que coté serveur et de les voir affichés dans une popup coté client. Les logs sont configurés non pas via fichier de propriétés mais plutôt via le descripteur .gwt.xml.
  • SpeedTracer : passe d’un outil de monitoring côté client à un outil de monitoring client-serveur. Il est possible dorénavant de voir avec la même interface les performances du serveur et du client (s’appuyant entre autre sur Spring Insight).

D’autres nouveautés ont été apportées comme l’amélioration de l’intégration entre m2eclipse et le plugin Eclipse de Google (meilleure reconnaissance du classpath) et une intégration (plutôt moyenne à mon avis) avec Spring-roo…

Mozilla Rainbow: enregistrement audio et video dans le browser

Mozilla a récemment annoncé une nouvelle extension pour Firefox: Rainbow. Son rôle est de permettre au browser d’accéder aux capacités d’enregistrement audio & vidéo des ordinateurs et de les mettre à disposition à travers une API Javascript. Pour ce faire, Mozilla s’appuie sur des librairies cross-platform comme:

Mais l’intérêt de cette news réside peu dans l’extension elle-même qui est encore très loin d’être exploitable (ne fonctionne que sous Mac OS pour l’instant). Elle se situe plutôt dans la perspective apportée: il semble que l’on se dirige de plus en plus vers un monde où le navigateur aura accès aux matériels des machines. Lors d’un récent XKE (notre journée mensuelle d’échange) nous avions parlé de HTML5 vs Flash et l’un des problèmes que nous avions évoqué était que la technologie pour faire ne serait-ce qu’un simple chat vidéo en simple HTML/Javascript n’existait pas encore. Il semble maintenant que l’on s’en rapproche de plus en plus! Alors certes, ce n’est pas pour aujourd’hui… Ce n’est pas non plus pour demain car pour obtenir une API standard à plusieurs navigateurs, il faudra que les participants se mettent d’accord: Ericsson, par exemple, a commencé à jouer avec la balise device qui n’est pas encore standardisée et sur laquelle travaille le Whatwg, alors que l’implémentation de Mozilla semble ne pas passer par cette balise (du moins pour l’instant). Bref, on a le temps de voir arriver toutes ces bonnes choses, mais autant s’y préparer dès maintenant: le futur réside dans le navigateur !

Le coin de la technique

jOOQ 1.4.2, ou comment faire du SQL object

jOOQ, pour Java Oriented Object Querying, est un framework de persistance qui veut se démarquer des autres. En effet, son créateur Lukas Eder est parti de deux constats:

  • le modèle relationnel est aujourd’hui quasi omniprésent dans les SI. De plus, le langage SQL nous permet de répondre à toutes nos attentes en terme d’interrogation de bases de données,
  • une bonne partie des projets sur lesquels nous travaillons possèdent une base de données legacy dont il n’est souvent pas possible d’apporter quelconques modifications.

Mais alors pourquoi utiliser des outils de persistance complexes rajoutant une abstraction au SQL ? Question tout à fait légitime et pleine de bons sens.

Si vous êtes dans ce cas de figure, vous pouvez télécharger ce petit outil ici (même si vous ne l’êtes pas, je ne pense pas qu’il y ait d’inconvénient à ce que vous le testiez…). Puis, générez vos entités à partir de votre modèle relationnel en exécutant un générateur qui va parser votre base et détecter les entités ainsi que leurs relations. Ensuite, il vous suffira de créer vos requêtes en utilisant l’une des deux manières possibles. Voici un exemple pour illustrer ces propos:

Nous souhaitons exécuter la requête suivante avec jOOQ:

Book.sql
-- Select all books by authors born after 1920 from a catalogue:
SELECT *
FROM t_author a
JOIN t_book b ON a.id = b.author_id
WHERE a.year_of_birth > 1920
ORDER BY b.title
  • Modèle objet:
AuthorDao.java
// Instanciate your factory using a JDBC connection or datasource,
// and specify the SQL dialect you're using. Of course you can
// have several factories in your application.
Factory create = new Factory(datasource, SQLDialect.MYSQL);

// Create the query using generated, type-safe objects. You could
// write even less code with static imports!
SelectQuery q = create.selectQuery();
q.addFrom(TAuthor.T_AUTHOR);
q.addJoin(TBook.T_BOOK, TAuthor.ID, TBook.AUTHOR_ID);
q.addCompareCondition(TAuthor.YEAR_OF_BIRTH, 1920, Comparator.GREATER);
q.addOrderBy(TBook.TITLE);
  • DSL SQL:
AuthorDao.java
// Do it all "on one line".
SelectQuery q = create.select()
.from(T_AUTHOR)
.join(T_BOOK).on(TAuthor.ID.equal(TBook.AUTHOR_ID))
.where(TAuthor.YEAR_OF_BIRTH.greaterThan(1920))
.orderBy(TBook.TITLE).getQuery();

Ensuite, vous pourrez exécuter et récupérer vos résultats mapper sur vos objets grâce à jOOQ comme suit:

AuthorDao.java
// Similar query, but don't join books to authors.
// Note the generic type that is added to your query:
SimpleSelectQuery q = create.select(T_AUTHOR)
.where(TAuthor.YEAR_OF_BIRTH.greaterThan(1920))
.orderBy(TAuthor.LAST_NAME).getQuery();

// When executing this query, also Result holds a generic type:
q.execute();
Result result = q.getResult();
for (TAuthorRecord record : result) {

    // With generate record classes, you can use generated getters and setters:
    String firstName = record.getFirstName();
    String lastName = record.getLastName();

    System.out.println("Author : " + firstName + " " + lastName + " wrote : ");

    // Use generated foreign key navigation methods
    for (TBookRecord book : record.getTBooks()) {
        System.out.println("  Book : " + book.getTitle());
    }
}

Enfin, l’API fournie permet d’exécuter des opérations de CRUD assez facilement:

AuthorDao.java
// Create a new record and insert it into the database
TBookRecord book = create.newRecord(T_BOOK);
book.setTitle("My first book");
book.store();

// Update it with new values
book.setPublishedIn(2010);
book.store();

// Delete it
book.delete();

Vous trouverez tous les exemples cités ci-dessus sur le site officiel.

Plutôt sympa, ce framework démarre d’une idée intéressante en se situant entre les requêtes sql brutes via jdbc mais qui sont difficiles à maintenir et les frameworks tels que Hibernate ou iBatis, un peu trop haut niveau. Pour ne rien gâcher la roadmap du projet est visible ainsi que les tickets de bugs et l’avancement de chaque sprint, et bien que l’auteur soit seul sur ce projet, il le fait évoluer à un rythme soutenu.

Billets sur le même thème :

2 Responses

  • Nouvelles intéressantes, j’ai vraiment l’impression que l’offre de produits SpringSource a explosé depuis quelques temps..

    A propos de jOOQ, au premier abord, j’ai du mal à voir ce qu’il apporte de réellement différent. L’API Criteria, combinée à Hibernate Metamodel, permet d’écrire des requêtes complètement typesafe (cf http://in.relation.to/12805.lace), tout en bénéficiant de la stabilité et la maturité du framework.

    Il est clair que le DSL utilisé par Hibernate n’est pas forcément le plus lisible, l’approche « construire autour d’hibernate » me paraît cependant plus pérenne que créer un ORM « light » de plus. Il serait intéressant d’adapter le DSL de jOOQ à Hibernate. Et hibernate embarque aussi un outil de génération des POJO à partir du schéma.

  • Merci pour le référencement. Pour ceux intéressés, je viens d’ajouter beaucoup plus de détails à propos des exemples.

    Les cas d’utilisation de Hibernate (y inclus CriteriaQuery) et jOOQ peuvent être orthogonal, les buts ne sont pas exactement les mêmes. En plus, une bonne intégration avec Hibernate/JPA est sur la « feature roadmap », bien evidemment.

Laisser un commentaire