Notre nouveau partenaire Benchmark Group, société entre autres éditrice du Journal du Net et de L’Internaute, commercialise désormais notre formation sur le développement mobile multi-plates-formes.
Notre nouveau partenaire Benchmark Group, société entre autres éditrice du Journal du Net et de L’Internaute, commercialise désormais notre formation sur le développement mobile multi-plates-formes.
Dunod et la plateforme de feuilletage de nouvelle génération en ligne Divvaroom publient notre livre « Android – Développer des applications mobiles sur les Google Phone ».
L’outil de visualisation Flash est plutôt bien fait et le format DivvaBook fullmedia séduisant. Une belle invitation à la lecture non ?
Aujourd’hui je viens vous faire partager une très belle expérience projet. Je vous parlerai donc d’un projet que nous avons réalisé pour notre client Pierre et Vacances, qui a su nous faire confiance jusqu’au bout pour le développement et l’infogérance de son extranet commercial.
Faire des choix en matière d’architecture logiciel en 2010 peut être un exercice difficile, c’est pourquoi l’approche de DocDoku en matière de choix techniques est basée sur les principes suivants :
Dans le cadre de l’extranet commercial développé pour Pierre et Vacances, les grands principes architecturaux retenus ont été les suivants :
Tout ceci est en production évidemment depuis la fin octobre 2009.
Agilement.
J’ai eu le plaisir il y a quelques jours de recevoir, de la main même de l’auteur à l’occasion d’un déjeuner, le livre Programmation GWT 2.
J’ai préféré attendre d’avoir bien parcouru le livre avant d’écrire ce billet. J’aime autant le dire tout de suite : ce livre est LA référence sur GWT 2. Tout y est : les incontournables services RPC, l’intégration JEE, l’UiBinder, la communication avec le monde JavaScript mais aussi les Designs Patterns MVC (Model View Controller) ou MVP (Model View Presenter).
Au niveau de l’approche, la grande force du livre de Sami Jaber est qu’il est didactique et pointu à la fois, il convient donc aussi bien aux débutants qui veulent plonger dans le monde AJAX avec GWT qu’aux développeurs chevronnés. Un signe qui ne trompe pas sur la qualité de l’ouvrage : nos consultants qui ont près de 2 ans d’expériences sur GWT se l’arrachent !
Si le recours à un ORM (Object-Relational Mapping) permet des gains de productivité et facilite la maintenance des applications, ce type de framework introduit néanmoins des problématiques nouvelles, qui, pour être évitées, exigent une très bonne connaissance des mécanismes internes au moteur de mapping.
Parmi ces difficultés classiques, on peut citer la gestion du cache d’objets.
La validation finale de la spécification de JEE 1.6 (JSR 316) qui inclut la version 2 de JPA, intégrant des évolutions appréciables en matière de prise en compte du cache, est l’occasion de revenir ici un peu sur le sujet.
En réalité les ORM possèdent deux caches distincts :
Le cache de premier niveau est rattaché à l’objet EntityManager, il s’agit en fait du « persistence context » qui lui est associé. Pour rappel, c’est à partir d’une instance d’EntityManager que les entités (les objets persistés en base de données) sont créés, récupérés ou encore supprimés. La classe EntityManager est définie par l’API standard JPA, elle est l’équivalente de la classe Session dans l’API native Hibernate.
Le contexte de persistance regroupe un ensemble d’entités en garantissant que pour une même entité il n’y aura qu’une seule instance d’objet. En prenant garde à ne pas dupliquer les objets de même identité, le contexte de persistance agit donc comme un cache d’objets : les recherches, qu’elles soient faites au travers d’une Query ou avec la méthode find(Class<T> entityClass, Object primaryKey), retourneront toujours les mêmes instances d’objets, piochées dans le cache, pour matérialiser un même enregistrement en base. Le contexte de persistance est lié à la transaction en cours, il sera vidé à la conclusion de celle-ci.
Le fonctionnement du contexte de persistance qui vient d’être décrit est celui qui est le plus couramment employé, il s’agit du mode PersistenceContextType.TRANSACTION. Néanmoins, il existe un autre mode dit « étendu », le paramétrage du contexte de persistance se fait dans le code Java, lors de l’injection de l’EntityManager :
@PersistenceContext(type=PersistenceContextType.EXTENDED)
private EntityManager em;
Dans cette configuration, le PersistenceContext n’aura pas une durée de vie corrélée à la transaction mais au Stateful Session Bean dans lequel il est déclaré. Ainsi, le cache d’objets sera maintenu sur plusieurs transactions à la base de données. Ce type de contexte de persistance peut par exemple être utilisé pour alimenter en données une page web requêtant en AJAX.
En dessous de ce cache placé sous la direction des EntityManagers se trouve un autre cache dit de second niveau. Ce cache est global à la JVM ou plus exactement à l’EntityManagerFactory. Il peut aussi être configuré au niveau cluster, dans ce cas le cache sera répliqué sur chaque JVM. Le cache de second niveau est donc partagé entre les EntityManagers qui iront l’interroger, si l’entité recherché n’est pas présent dans leur propre contexte de persistance, avant de se résigner à taper dans la base de données.
Si les règles régissant le cache de premier niveau sont relativement limpides, celles gouvernant le cache de 2ème niveau le sont un peu moins et le développeur peut légitimement se poser de nombreuses questions :
De manière générale, les réponses à ces questions dépendent avant tout de l’implémentation JPA choisie. D’ailleurs, si EclipseLink et TopLink activent par défaut un cache de second niveau ce n’est pas le cas d’Hibernate. Ce dernier a par contre été très tôt pensé de façon modulaire et accepte divers « cache provider » comme EhCache, OS Cache ou encore JBoss Cache. Chaque système de cache vient avec ses options et ses fichiers de paramétrages, il est souvent possible de les spécifier dans le fichier persistence.xml entre la balise <properties> ou dans le code par la méthode Query.setHint(String hintName, Object value).
En ce qui concerne les changements opérés dans la base sans passer par les couches de persistance de l’ORM ; là le résultat est identique quelque soit le framework : le cache de niveau 2 se retrouve obsolète et cela tant que l’entité en question ne sera pas rechargé. La plupart des caches d’objets utilisant des SoftReferences ou des WeakReferences, l’éviction de l’objet se produira à un moment indéterminé, au gré des pérégrinations du garbage collector. Pour ceux ne pouvant se contenter du caractère aléatoire des références faibles et qui veulent expressément déclencher le rafraichissement des données la classe EntityManager propose heureusement la méthode refresh qui s’utilise habituellement ainsi :
MonEntity e = em.find(MonEntity.class, id);
try {
em.refresh(e);
} catch(EntityNotFoundException ex){
e = null;
}
Toutefois, ce n’est que depuis la version 2 de JPA que le cache L2 est officiellement mentionné dans la spécification. Dans cette API, une classe Cache accompagnée de ses méthodes « evict » a fait son apparition et certains points de configuration ont été standardisés.
Il y aurait encore beaucoup à dire sur les caches d’entités et plusieurs billets seraient nécessaires, c’est pourquoi je conclurai simplement en invitant tous les développeurs et architectes à regarder sous le capon de leur framework de persistance et à ne pas se laisser « endormir » par la simplicité trompeuse de l’API JPA.
Nicolas Martignole, Architecte Java/J2EE et membre du Paris JUG, nous fait part de ses impressions après lecture du livre de Florent sur Android : http://www.touilleur-express.fr/2009/12/06/retour-sur-le-livre-android-par-florent-garin/

Découvrez le tutoriel écrit par Florent sur Développez.com pour créer un client XMPP Android : http://florentgarin.developpez.com
L’hébergeur bien connu OVH propose, sur ses serveurs dédiés, un large choix d’OS parmi lesquels figure une distribution Linux pré-conçue pour accueillir des environnements virtualisés. Il s’agit en fait d’une Debian Etch 4.0 32bit avec VMware server 1.08 configuré pour tourner au-dessus. Pour ceux désireux d’affecter leur machine à un usage exclusif de host VMware et voulant privilégier les performances il faudra plutôt choisir l’OS VMware ESXi qui lui est un hyperviseur natif.
J’ai très récemment eu à mettre en place un serveur virtualisé Windows 2003 sur la distribution « VMware server » d’OVH. A cette occasion, j’ai constaté que les guides de l’hébergeur manquaient quelques peu de précisions et, qui plus est, sur des éléments capitaux.
Les tutoriels en question sont les suivants :
http://guides.ovh.com/vmware
http://guides.ovh.com/AjouterAliasIp
OVH, pour des raisons de sécurité, interdit l’usage du « bridged networking », nous avons donc le choix entre le « NAT » et le « host-only » où grâce à une IP failover le guest aura pleinement accès au réseau.
Même si en principe le choix du mode de connexion peut être changé par la suite, sélectionner malencontreusement le mode « bridged networking » engendre des modifications dans plusieurs fichiers de configuration qui s’avèrent difficile à défaire même en corrigeant l’option réseau. Il faut donc bien veiller à ne jamais choisir le mode « bridged networking » sur un serveur OVH.
Le paramétrage de la machine host ne pose pas de difficulté particulière. Là où ça se corse, c’est au niveau du guest Windows 2003 Server. Le tutoriel OVH oublie de mentionner un paramètre essentiel : la passerelle de la machine guest doit être elle-même, c’est à dire, elle doit avoir pour valeur l’IP failover qui est également l’adresse de la machine guest ! Ainsi va la virtualisation, la machine guest se sert du host pour communiquer avec le monde extérieur, toutefois cette configuration qui peut sembler étrange dans un contexte plus classique aurait méritée d’être ici explicitement notifiée.
Un grand merci à Olivier Rafal pour son article dans le MondeInformatique à l’occasion de la sortie du livre de Florent sur Android :

Avec Dassault Systèmes, nous initions notre premier billet de cette nouvelle catégorie qui est « Nos clients ».
C’est un des plaisirs de notre activité ; nous sommes amenés à entrer au sein de diverses entreprises aux métiers très différents. Par exemple, notre dernier client SaaS (l’offre hébergée de notre l’outil collaboratif) est l’institut de massages traditionnels asiatiques Maxam.
Aujourd’hui, l’entreprise présentée est donc Dassault Systèmes. DS est une filiale du groupe Dassault, le célèbre fabriquant d’avions de chasse. DS est un éditeur de logiciels, il s’agit d’ailleurs du numéro 1 français, loin devant les autres. Leur cœur de métier est la 3D et l’un de leurs produits phares est le fameux logiciel de design Catia.
Catia est utilisé par de nombreux industriels dans le monde pour concevoir leurs produits : Airbus, Boeing, PSA, Toyota…
Dernièrement, au travers de leur nouvelle marque 3DVia, Dassault Systèmes a opéré une diversification intéressante, ils se lancent sur le marché grand public et ambitionnent de démocratiser la 3D.
Le site 3dvia.com est un espace communautaire, où les internautes peuvent faire partager leurs créations, c’est l’équivalent de youtube ou dailymotion mais pour la 3D.
Bref, Dassault Systèmes est une société innovante, en bonne santé financière (ceux qui étaient présents à la grandiose soirée d’inauguration de leur campus fin 2008 n’en ont aucun doute) et pour une fois elle n’est pas américaine !
Cette nouvelle version propose en effet de nombreuses nouvelles fonctionnalités :
N’hésitez pas à tester DocDoku en créant simplement et gratuitement votre compte DocDoku ici.
DocDoku a adopté une approche orientée service. Concrètement cela veut dire que toutes les actions accessibles par l’interface graphique le sont aussi par notre API WebServices.
Les url des wsdl sont les suivantes :
Pour interroger ou soumettre des commandes (réserver un document par exemple):
http://www.docdoku.net/webservices/DocDoku?wsdl
Pour le service de téléchargement de fichiers:
http://www.docdoku.net/UploadDownloadService?wsdl
Ces opérations sont réalisées sur l’environnement de démonstration « mydocdoku ».
C’est à l’occasion de la conférence internationale JavaOne organisée par Sun que nous avons officiellement annoncé notre passage en Open Source : GlassFish Technology Partner Showcase.
Vous pouvez désormais vous joindre à notre communauté.
De nouvelles fonctionnalités sont en effet désormais à votre disposition :
N’hésitez pas à découvrir toutes les fonctionnalités de DocDoku sur notre site, dans la rubrique produit.
Vous pouvez également tester DocDoku en créant simplement et gratuitement votre compte DocDoku ici.
Le choix d’inclure (précipitamment ?) JAXB au jdk 1.6 a des conséquences fâcheuses. En effet, la version de l’API intégrée au jdk est la 2.0, et très souvent il est indispensable de passer à la 2.1 pour bénéficier de fonctionnalités comme par exemple l’annotation XmlSeeAlso.
Pas de problème me diriez-vous, il suffit de rajouter -Djava.endorsed.dirs=jaxb-api.jar à la ligne de commande de java pour « patcher » le jdk.
Malheureusement, si votre application est distribuée au travers de Java Web Start, le mécanisme de classes « endorsed » ne fonctionne pas.
Pour s’en sortir une seule solution faire des acrobaties avec les ClassLoaders. Ce billet explique cela en détail. Dans le cadre d’une application swing, il faudra bien penser à appeler la méthode setContextClassLoader également sur le thread gérant les événements système comme ceci :
EventQueue eq = Toolkit.getDefaultToolkit().getSystemEventQueue();
eq.invokeAndWait(new Runnable() {
public void run() {
Thread.currentThread().setContextClassLoader(modifiedClassLoader);
}
});
C’est du sport mais ça marche !
Je suis en pleine refonte de l’application collaborative en ligne DocDoku.
Je migre d’une architecture customisée fondée sur de simples services RMI de base, tournant dans la même JVM que le moteur de servlet (tomcat), vers une architecture standard JEE 1.5 supportée notamment par les EJB 3 (glassfish).
Durant ce portage, je suis tombé sur un bug assez vicieux ; l’implémentation actuelle du protocole IIOP (jdk 1.5) ne sérialise pas correctement les type « enum ». En conséquence, une comparaison de deux enumérations dont l’une a été envoyée par le client, d’apparence identique, échoue lamentablement !
Seule alternative, comparer leur nom…
REST (REpresentational State Transfer) apparaît de plus en plus comme une alternative sérieuse à SOAP. A l’instar d’eBay ou d’Amazon de nombreux sites web proposent dorénavant leur API publique également sous forme d’interfaces REST.
Pour l’instant, le frein majeur à l’adoption de ce paradigme demeure le manque d’outil ou de formalisation. REST n’est aujourd’hui qu’un concept d’architecture logicielle.
Néanmoins, cela est peut être en train de changer grâce la spécification WADL (Web Application Description Language).
Grossièrement, WADL a pour objectif de définir un langage de description des interfaces de type REST. L’équivalent du WSDL dans le monde SOAP.
C’est une affaire à suivre, je sens bien qu’on a pas fini d’entendre parler de REST et de WADL.