insideIT.fr : le blog des architectes IT de SFEIR

Aller au contenu | Aller au menu | Aller à la recherche

jeudi 19 février 2009

Intégration de Guice avec les RemoteServiceServlet de GWT

La dernière version snapshot de Guice intégre des fonctionnalités intéressantes pour les Servlets, notamment de nouveaux Builders qui viennent du projet warp-servlet et qui permettent de configurer des mappings de Servlet ou de Filter directement dans un module. Vous pouvez obtenir les sources de l’exemple décrit dans cet article ici.

Au lieu de définir nos RemoteServiceServlet dans le web.xml (ce qui est désormais le cas avec GWT 1.6), nous allons déclarer un GuiceServletContextListener et un GuiceFilter :


 1 <?xmlversion="1.0"encoding="UTF-8"?>
2 <web-app>
3
4
<!-- Default page to serve -->
5 <welcome-file-list>
6 <welcome-filecda.html</welcome-file>
7 </welcome-file-list>
8
9
<listener>
10 <listener-classcom.sfeir.server.CdaGuiceServletConfig
11 </listener-class>
12 </listener>
13
14
<filter>
15 <filter-nameguiceFilter</filter-name>
16 <filter-classcom.google.inject.servlet.GuiceFilter
17 </filter-class>
18 </filter>
19
20
<filter-mapping>
21 <filter-nameguiceFilter</filter-name>
22 <url-pattern/*</url-pattern>
23 </filter-mapping>
24
25
</web-app

GuiceServletContextListener crée une instance d’Injector avec la méthode getInjector(), nous pouvons alors définir notre module en redéfinissant cette méthode :


 1 public class CdaGuiceServletConfig extends GuiceServletContextListener
 2 {
 3     @Override
 4     protected Injector getInjector()
 5     {
 6         return Guice.createInjector(new ServletModule()
 7         {
 8             @Override
 9             protectedvoid configureServlets()
10             {
11                 serve("/cda/echo").with(EchoServiceImpl.class);
12                 serve("/cda/spreadsheet").with(SpreadSheetServiceImpl.class);
13 ...

Nous utilisons pour cela une classe anonyme qui hérite de ServletModule : les méthodes «serve» et «filter» de cette dernière nous permettent de faire l’équivalent de huit lignes de XML pour déclarer une Servlet ou un Filter en une seule ligne de Java.

«serve» fonctionne directement avec les RemoteServiceServlet de GWT (il faut néanmoins ajouter y l’annotation Singleton), par contre les scopes Session et Request de la classe ServletScopes ne peuvent pas être utilisés : nous allons devoir hériter de la classe RemoteServiceServlet pour y ajouter notre propre Scope Session et par la même occasion ajouter un champ «injector» qui contiendra l’objet Injector créé par notre classe CdaGuiceServletConfig.

Dans notre ServletModule, nous rajoutons un appel à «bind» qui associe l’interface SpreadsheetManager à une implémentation :


 1                 bind(SpreadsheetManager.class).
2 to(SpreadsheetManagerImpl.class);

Ainsi l’appel de getInstance de l’object Injector avec SpreadsheetManager.class en paramètre renverra une instance de SpreadsheetManagerImpl.


 1 @Singleton
2 public class SpreadSheetServiceImpl extends GuiceRPCServlet implements SpreadSheetService
3 {
4
5
@Override
6 public List<String> fetchSpreadsheetList()
7 {
8 SpreadsheetManager manager = injector.getInstance(SpreadsheetManager.class);
9 ...

Par défaut, l’Injector de Guice renvoie toujours une nouvelle instance. Nous pouvons également utiliser l’annotation Singleton ou dans le cas présent notre propre annotation GwtSessionScoped afin qu’une même instance soit réutilisée, par exemple le temps d’une session.


 1                 bindScope(GwtSessionScoped.class,
2 GuiceRPCServlet.SESSION);
3 bind(GoogleService.class).toProvider(
4 SpreadsheetServiceProvider.class).
5 in(GwtSessionScoped.class);

Ainsi les champs injectés de type GoogleService seront créés une première fois puis récupérés dans la session en cours. Ce mécanisme fonctionne quand l’Injector de Guice est appelé, il est donc exclu de l’utiliser sur des champs d’une RemoteServiceServlet.


 1 public class SpreadsheetManagerImpl implements SpreadsheetManager
2 {
3 @Inject
4 private GoogleService service;
5
6
@Inject
7 @Named("user")
8 private String username;
9 @Inject
10 @Named("pass")
11 private String password;
12
13
@Override
14 public void authenticate()
15 {
16 try
17 {
18 service.setUserCredentials(username,password);
19 } ...

L’annotation Named est utile pour injecter objets de même type sans avoir à créer de nouvelle annotation. La méthode statique «named» crée cette annotation pour l’utiliser dans les instructions de binding.


 1                 bindConstant().annotatedWith(named("user")).
2 to("cappelle.florent@gmail.com");
3 bindConstant().annotatedWith(named("pass")).
4 to("*************");

Finalement, Guice permet aussi d’ajouter des fonctions transverses à nos services en «bindant» un intercepteur sur un ensemble de méthodes :


 1                 bindInterceptor(subclassesOf(SpreadsheetManager.class),
2 returns(subclassesOf(List.class)),
3 new LoggingInterceptor());

Ici, LoggingInterceptor est appliqué aux classes qui héritent de SpreadsheetManager et plus particulièrement aux méthodes de ces classes dont le retour est de type List. Les classes d’interception doivent implémenter MethodInterceptor de l’API aopalliance.

Vous aurez sans doute deviné que LoggingInterceptor fait un log des appels de méthode, la sécurité et les transactions étant les autres exemples typiques d’utilisation des MethodInterceptor.

En conclusion, Google Guice constitue une alternative intéressante à Spring pour l’injection de dépendance. Dans certains cas, on pourra également utiliser les méthodes de la classe SpringIntegration afin de réutiliser une configuration XML existante.

Liens :

How to : Spring Security (ex Acegi) and GWT

As you know, Spring Security (previously Acegi) provides an easy and robust solution to secure web applications. Thereby, web developers do not have to deal with all that stuff in their source code, but just have to configure Spring Security to enable authentication and authorization for their application.

As it works pretty good with 'conventional' application, things go less cool with applications like GWT ones. This is mainly due to the asynchronous calls.

Lire la suite...

mercredi 11 février 2009

Editing Google Spreadsheets rows with Google Data API and GWT

In a previous article (here), we saw how to display Google Spreadsheets content with the Google Data API Java client and CellFeed objects.

This time, the proof of concept application shown below uses ListEntry objects to fetch our worksheets content, using header names (see (1) and (2) in the following screenshot) and unique identifiers (see (3)) instead of x and y positioning system.

You will find the source code at the bottom.

The following piece of code shows how to fetch every row entries in a worksheet into a HashMap which maps each row identifier to its ListEntry object:


  1         Map<String, ListEntry> listEntries =
2 new HashMap<String, ListEntry>();
3 List<WorksheetRow> rows = new ArrayList<WorksheetRow>();
4 try
5 {
6 ListFeed feed = sService.getFeed(new URL(sheetFeedURL),
7 ListFeed.class);
8 for (ListEntry entry : feed.getEntries())
9 {
10 WorksheetRow clonedRow = new WorksheetRow();
11 clonedRow.setTitle(entry.getTitle().getPlainText());
12 clonedRow.setId(entry.getId().substring(
13 entry.getId().lastIndexOf('/') + 1));
14 listEntries.put(clonedRow.getId(), entry);
15 CustomElementCollection elementColl =
16 entry.getCustomElements();
17 WorksheetRow.CustomElement rowElement =
18 new WorksheetRow.CustomElement();
19 for (String value : elementColl.getTags())
20 {
21 rowElement.put(value,
22 elementColl.getValue(value));
23 }
24 clonedRow.setElement(rowElement);
25 rows.add(clonedRow);
26 }
27 getSession().setAttribute("listEntries", listEntries);
28 } catch (MalformedURLException e) ...

Each ListEntry object has a list of «Tag» (column names) and a HashMap which maps each tag name to its value in the current entry. Note that each column name is automatically made unique.

To update a row with a modified WorkSheetRow object, we get its associated ListEntry object and set every value of the WorkSheetRow object with the «setValueLocal» method.


  1     public void updateWorkSheetRow(WorksheetRow row) throws AuthException
2 {
3 Map<String, ListEntry> listEntries = (Map<String, ListEntry>) getSession().getAttribute("listEntries");
6 ListEntry entry = listEntries.get(row.getId());
7 for (String tag : row.getElement().keySet())
8 {
9 entry.getCustomElements().setValueLocal(tag, row.getElement().get(tag));
10 try
11 {
12 entry.update();
13 } catch (IOException e)...

Then we simply have to call the modified entry update method.

Going further

Row editing in Spreadsheets API is not limited to the ListEntry class: Indeed, there is also a ListQuery class which enables advanced selection for your Worksheets.

Listing in reverse order:

In order to list the rows in reverse order, you just have to set the «reverse» property of a ListQuery object to «true» and pass this object to the SpreadsheetService object


  1     ListQuery query = new ListQuery(listFeedUrl);
2 query.setReverse(true);
3 ListFeed feed = service.query(query, ListFeed.class);
4 for (ListEntry entry : feed.getEntries())
5 { ...

Full-text search:

For full-text search, use the «setFullTextQuery» method. Note that you can pass several strings.


  1     ListQuery query = new ListQuery(listFeedUrl);
2 query.setFullTextQuery("Florent Tue");
3 ListFeed feed = service.query(query, ListFeed.class);
4 for (ListEntry entry : feed.getEntries())
5 { ...

Structured query:

Structured queries can filter the list by a particular value to a column name. You can also set the ordering of the listing with a column name.


  1     ListQuery query = new ListQuery(listFeedUrl);
2 query.setSpreadsheetQuery("name = 'Florent'");
3 query.setOrderBy("column:name");
4 ListFeed feed = service.query(query, ListFeed.class);
5 for (ListEntry entry : feed.getEntries())
6 { ...

Useful Links:

Article related downloads:

jeudi 11 décembre 2008

Roadmap GWT (1.6 et après)

Encore un post intéressant sur le blog de l'équipe GWT !
Cette fois, le sujet est le futur... Au programme de GWT 1.6 (prévu pour le premier trimestre 2009) :

* New compiled file deployment structure
* Migration from Tomcat to Jetty hosted mode server
* Uniform event handlers
* DatePicker, LazyPanel migrated in from incubator
* String performance improvements
* Compiler performance improvements

Et pour l'après 1.6 :

* Developer Guided Code splitting
* Analysis of compiled code, aka Story of your compile (SOYC)
* In-browser hosted mode, aka Out-of-process Hosted Mode (OOPHM)
* UI Binder
* Client Bundle
* RPC performance improvements

What's ahead for Google Web Toolkit

mercredi 10 décembre 2008

Google Visualization API pour GWT

La famille des APIs Google pour GWT s'agrandit avec la librairie Google Visualization pour GWT. L'annonce est encore chaude sur le blog de l'équipe GWT.

Le but de l'API Google Visualization est de permettre d'accéder à de multiples sources de données structurées pour les afficher, en choisissant parmi une large sélection de visualisations.

mercredi 3 décembre 2008

Release de SmartGWT

Sanjiv, le créateur de GWT-Ext vient de sortir la première release de SmartGWT. Sanjiv a réussi à sortir un wrapping de la librairie JavaScript SmartClient en à peine 4 mois !

SmartGWT reprend les principales fonctionnalités de GWT-Ext auxquelles s'ajoutent un databinding puissant, d'avantages de widgets (notamment le composant Calendar, un Google Agenda simplifié) et de meilleures performances d'affichage. Sanjiv a su prendre du recul par rapport à sa précédente expérience, et présente une librairie mieux adaptée au développement d'applications de gestion. Allez voir les sources, vous verrez que l'utilisation des composants graphiques et des datasources se fait de façon beaucoup plus simple qu'auparavant.

Utilisation d'une grille éditable à la volée

A cela s'ajoute une très grande réactivité de l'équipe : critiqués sur leurs styles un peu old school, ils sont déjà en train d'y remédier.

Quelques indicateurs :

  • GWT-Ext incite à passer sur SmartGWT : lien
  • Evolution du nombre de posts du google group GWT-Ext : lien

mardi 25 novembre 2008

Rejoignez nous le 4 décembre !

SFEIR et l'association G-EFREI Technologies organisent une grande conférence le jeudi 4 décembre 2008 à l'EFREI.

Au programme, des présentations et des ateliers traitant de RIA, Cloud Computing et mobilité.

Parmi les intervenants, Didier Girard parlera des RIA via une présentation de GWT, Christian Fauré de Cloud Computing et Jieren Wu de mobilité avec Android.

L'évènement est gratuit et ouvert à tous, reservez dès maintenant votre place en remplissant le formulaire ci-dessous.

Pour davantage d'informations et savoir comment vous rendre à cet évènement, c'est par ici.


vendredi 14 novembre 2008

Joda-Time pour GWT : Goda-Time

Pour les utilisateurs de GWT appréciant l'API Joda-Time, bonne nouvelle !

Goda-Time, a GWT port of Joda-Time, has just been forked from gwittir. Goda-Time is looking for volunteers.

Description du projet :

GWT port of Joda-Time

Originally found in the gwittir project. As of Nov 12th 2008 kebernet, the owner of gwittir, has been silent for 5 months. Goda-Time needed its own project anyway. I ripped Goda-Time out of the gwittir source tree and made it compile on its own.

Goda-Time still needs help with cleanup and unit tests. Goda-Time needs volunteers. Send a message to the group to indicate your interest.

En français :
Après une longue inactivité du projet Gwittir qui comprend une ébauche du port de l'API Joda-Time pour GWT, voici le projet Goda-Time qui reprend cette ébauche avec pour but de la compléter.
Ce projet est ouvert, toute participation est la bienvenue.

Goda-Time

mercredi 15 octobre 2008

Jetty or Tomcat for GWT 1.6 ?

Bruce Johnson (tech lead of the Google Web Toolkit ) :

The GWT team has started putting together a 1.6 roadmap, which we'll publish as soon as we have it nailed down. Two of the areas we want to work on for 1.6 are some improvements to hosted mode startup time and a friendlier output directory structure (something that looks more .war-like).

As part of this effort, we've all but decided to switch the hosted mode embedded HTTP server from Tomcat to Jetty. Would this break you? (And if so, how mad would you be if we did it anyway?)

Less than two months after the release of GWT 1.5, the GWT team is already asking the community for its opinion for GWT improvement for 1.6 roadmap. In this post, Bruce Johnson is asking the community if it would rather have Jetty or Tomcat as the hosted mode embedded HTTP. Unfortunately, I do not know Jetty enough to have an opinion. But if you know both Jetty and Tomcat, you should not hesitate to participate in this debate.

GWT et accessibilité

Google Web Toolkit Blog :

As described in our earlier article outlining ARIA support in GWT1.5, widgets now include basic support for W3C ARIA, an emerging set of Web standards that enable AJAX applications to work smoothly with screenreaders. But there is more to using an application than interacting with individual user interface widgets — overall usability is determined by the complete user experience.

We have improved the usability of Google Health for screenreader users by enhancing the built-in support available in GWT 1.5 via JavaScript. The resulting user experience enables users of screenreaders and self-voicing browsers to easily navigate the interface to obtain relevant auditory feedback.

Pour les personnes intéressées par la problématique d'accessibilité dans une application GWT, Google vient d’annoncer l’ajout de cette fonctionnalité dans Google Health. Pour rappel, Google Health est une application de gestion de dossiers médicaux états-uniens développée avec GWT.

mardi 14 octobre 2008

PureMVC Multicore for Java (compatible with GWT)

The first version of the PureMVC Multicore framework for Java which is compatible with GWT has been relased here under Creative Commons Attribution 3.0 license. For those who do not know MVC, you should look at Wikipedia. Then, if you want to know more about PureMVC, you should continue with the conceptual diagram and best practices. These documents demonstrate the Singleton version, they are a good introduction to PureMVC concepts.

lundi 29 septembre 2008

Google Developer Day Paris 2008 - Résumé de la journée

2888831206_678d2cdedf Le 18 septembre dernier, à l'ENSA (Ecole Nationale Supérieure d'Architecture), Google faisait étape à Paris pour son tour du monde 2008.

Cette journée avait pour ambition de présenter les technologies Google et de proposer aux développeurs français présents de participer à quelques séances pratiques de codage avec ses APIs et frameworks. Pour certains, c'était les premiers pas comme développeur d'App Engine ou de GWT et pour d'autres, l'objectif était déjà d'aller un peu plus loin et d'échanger avec d'autres présentateurs ou participants sur leur expérience dans ces technologies ou de voir comment les intégrer dans les développements de solutions diverses...

Après la traditionnelle file d'attente devant l'entrée du magnifique bâtiment de l'ENSA, l'évènement a commencé vers 10h00 par une présentation des thèmes de la journée: le standard d'interopérabilité de réseaux sociaux OpenSocial, la plateforme de développement pour téléphones mobiles Android, le framework de développement web GWT, le service d'hébergement d'applications web Google App Engine, et les outils de localisation géographiques basés sur Google Maps et Google Earth.

La présentation du programme de la journée à peine terminée, la foule des participants quittait le hall central pour prendre place dans les amphis et dans les salles équipées afin de suivre des présentations "magistrales" et des sessions de code.

Ces présentations ont été animées par des ingénieurs Google mais également par des acteurs du terrain, des ingénieurs d'entreprises qui mettent en œuvre ces technologies dans leur travail quotidien telles que Sfeir et Viadeo.

Pour ce qui est des " Sfeiriens ": Jieren Wu et Didier Girard ont pu faire découvrir Google Web Tookit lors d'une session de code. Bruno Guedes et Vincent Bostoen ont présenté Google App Engine.

Les thèmes abordés ont été très nombreux : mobilité avec Android et en démonstration une balle fluide et rebondissante; Cloud Computing où on a pu faire héberger un wiki développé bien sûr en Python pendant que dans une autre salle nos collègues Bruno Guedes et Vincent Bostoen montraient à quoi sert l'infrastructure App Engine et comment l'utiliser; RIA où le Directeur Technique de Sfeir Didier Girard a présenté GWT puis accompagné de notre collègue Jieren Wu ils ont aidé les développeurs à écrire une application GWT pendant que d'autres suivaient en amphi une présentation d'Ajax; navigateurs avec la plateforme Chrome et sa gestion innovante de processus; réseaux sociaux où Viadeo a fourni son expertise lors de la session de code dédiée principalement à OpenSocial, avec quelques touches des APIs de géolocalisation et d'intégration dans le Google App Engine; ... Beacoup de sujets intéressants donc mais on ne pouvait pas être partout à la fois!! Difficile pour les participants de faire un choix.

Tout au long de la journée, un espace de détente était accessible à tous. Une occasion de discuter des dernières APIs autour d'un BabyFoot ou encore d'argumenter sur GWT tout en jouant à la Wii. Pour les moins agités, une masseuse ainsi qu'une montagne d'oreillers étaient également à disposition.

La journée s'est terminée vers 21h00 autour d'un buffet, une occasion de discuter avec ceux qui créent les technologies mais également ceux qui les utilisent.

En définitive, ce fût une journée bien remplie, de laquelle chacun des participants est reparti avec un tee-shirt et une clé USB en forme de PLAYMOBIL. En attendant l'édition 2009 des Developer Days, n'hésitez pas à vous rendre sur http://code.google.com pour vous former aux technologies Google. Pour ceux qui veulent voir ou revoir les vidéos, rendez vous sur http://fr.youtube.com/view_play_list?p=22350CB6D86B7A2B.

mercredi 24 septembre 2008

Extension de la boîte à outil GWT

Google Web Toolkit Blog :

Following up on our earlier post, a release candidate of the Google Maps API Library for GWT is now available for download. This library provides a way to access the Google Maps API from a GWT project without having to write additional JavaScript code. The library gives you full control using the standard Maps components such as InfoWindows, Markers, MapTypes, and Geocoding. You can even use advanced features such as adding GWT widgets to the Map, creating custom overlays, custom map types, and other components.

In addition to maps, the Google API Libraries for GWT also provide libraries for Gears, Gadgets and the Google AJAX Search API. Please try out these release candidates and give us feedback, either through the issue tracker on code.google.com, or through the Google-Web-Toolkit or Google-Web-Toolkit-Contributors group.

C'est chaud bouillant !

Google vient d'annoncer la sortie de la release candidate de son API Google Maps pour GWT. Tout un programme qui ne se limite pas à l'accès des maps depuis GWT mais également à l'intégration de composants GWT dans les maps. Pour couronner le tout, cette librairie ne se limite pas seulement à Google Maps, mais vient également grignoter sur les plate-bandes de Gears, Gadgets et Google AJAX Search API.

Je me joins à l'équipe GWT pour vous inviter à tester cette librairie au plus vite !

mardi 2 septembre 2008

GWT in the AIR Milestone 1

Logo Adobe AIR Avec la sortie de Google Chrome, Didier Girard annonce sur onGWT : "le navigateur est la plateforme".

Pourtant la plateforme n'est pas encore morte. Par exemple, le projet GWT in the AIR vient d'annoncer la sortie de sa version Milestone 1. Pour rappel, l'objectif de ce projet est de permettre le développement d'application AIR, c'est à dire d'application desktop s'exécutant dans la runtime AIR d'Adobe, à partir de code GWT.

GWT in the Air rend l'API AIR d'Adobe disponible en GWT via JSNI. Ce projet fournit également des outils facilitant le développement d'application AIR en GWT dont des outils de test. Le point faible du projet est le manque de documentation bien que le chantier soit en cours. Pour le moment, il faut se référer au showcase et à la documentation AIR d'Adobe.




English version:

With Google Chrome release, Didier Girard announces on onGWT : "the browser is the platform".

But the platform is not dead yet. For instance, GWT in the AIR just released its Milestone 1 version. A quick reminder: the aim of this project is to allow the development of AIR applications, i.e. desktop applications running on top of the Adobe AIR runtime, from GWT code.

GWT in the AIR makes the Adobe AIR API available for GWT using JSNI. This project also provides tools to ease "GWT in Adobe AIR" development includint test tools. The weakness of this project is its lack of documentation but it seems to be progressing. For the moment, the showcase and Adobe AIR documentation should be your starting points.

vendredi 27 juin 2008

GWT, Data binding et IHM auto générée

Lorsqu'il s'agit de construire des IHM, la problématique de binding (uni ou bi directionnel) avec les objets à présenter, voire la génération automatique de leur représentation, est rapidement au centre du débat.

Selon la techno utilisée pour construire l'IHM des solutions existent souvent et remplissent tout ou partiellement cette tâche. Cependant s'il existe un domaine dans lequel GWT n'excelle pas (encore), c'est bien celui-là. La faute à plusieurs facteurs : - Google ne fournit pas (encore?) de moyens simples dans l'API pour y arriver - L'API Reflection fait cruellement défaut pour remplir cette tâche de façon aisée - C'est une problématique assez complexe qui nécessite de trouver un savant équilibre entre personalisation possible (par exemple laisser un controle possible sur la façon de transtyper des données via des "type converters" ) et simplicité de mise en oeuvre (car à la base c'est le but de simplifier les choses).

Cependant le gain apporté par ces solutions est tellement évident qu'inévitablement des personnes se sont penchées sur ce manque pour le combler.

Parmi les solutions commençant à apparaitre pour GWT, je voulais en mettre une en avant aujourd'hui. Il s'agit de Metawidget (http://www.metawidget.org). Elle a été présentée recemment sur TSS et méritait un écho ici.

Metawidget

Metawidget se définit comme un outil de mapping objets <-> IHM. L'atout majeur d'un tel outil est sa capacité à introspecter des objets et en construire une représentation graphique. Sa particularité est de pouvoir générer des IHM selon différentes technologies comme : Swing, JSF, Struts, Android et tout recemment GWT. Cela en fait un outil interessant car polyvalent.

Metawidget utilise une approche assez intelligente, et surtout très pragmatique, pour introspecter les objets pour GWT. Ce dernier ne rend pas possible la reflection coté client ? Qu'à cela ne tienne : le serveur va s'en charger ! L'idée sous-jacente est de proposer - de façon transparente - un service dédié à l'introspection en "remote" des objets du modele ; objets dont la particularité avec GWT est d'exister tant coté client (en équivalent Javascript) que coté serveur... (en Java donc). C'était une idée toute simple et efficace, conforme au principe bien connu et éprouvé : "keep it simple, stupid" ! ;-)

Pour détailler un peu le fonctionnement de Metawidget, voici quelques éléments important caractérisant cet outil : - Metawidget s'articule autour de 2 concepts majeurs : les Metawidgets et les Inspectors. Les premiers auront la responsabilité de générer la représentation dans la techno retenue (des MetaWidgets existent pour chacune), tandis que les Inspectors sont chargés d'extraire les informations des objets du modele à présenter (et ce selon différentes stratégies représentées par différentes implémentations comme les *AnnotationInspectors, le PropertyTypeInspector, l'HibernateValidatorInspector, l'XMLInspector...). - les Inspectors peuvent se completer les uns avec les autres pour obtenir une description la plus détaillée possible de l'objet. Ils peuvent aussi etre totalement personnalisés : il est possible d'écrire sa propre implémentation. - la personalisation du rendu par surcharge ou ecriture de MetaWidgets est aussi rendue possible. Vive le design par interface ! ;-) - le support des "datatypes converters" est présent et il est très simple d'ecrire ses propres convertisseurs.

A plus d'un titre cet outil mérite d'être considéré, même si encore jeune (les premières versions remontent à début 2008) et pas encore assez connu.

Si vous souhaitez aller plus loin, voici le lien : (http://www.metawidget.org)

samedi 21 juin 2008

TheServerSide Java Symposium - Jour 3

Troisième et dernier jour du symposium…je n’ai pas gagné l’iPod qui était en jeu, dommage, j’aurais pu tester GWT dessus ;)

On commence par une conférence de Geert Bevin: Boldly go where the Java language has never gone before. On le sait, Java ce n’est pas qu’un langage, c’est un langage, une JVM et une plateforme, qui ont chacun leurs points forts mais aussi leurs limites. Dès lors, l’idée, qui est à la mode ces derniers temps, c’est que l’on peut remplacer ou modifier un de ces composants pour “pousser l’enveloppe” lorsque les limites se font sentir.

Geert cite 4 exemples pour illustrer cette approche.

  1. Terracotta: il s’agit d’une extension de la JVM qui facilite la scalabilité des applications, en permettant de mettre des JVM en cluster. Déclarativement, certains objets (“shared objects”) sont répliqués entre toutes les JVM, et accédés indifféremment (avec du lazy loading) par toutes les instances. On a ainsi étendu le comportement natif de la JVM.
  2. RIFE continuations: déjà évoqué hier au sujet de Comet, il s’agit pour prendre une image de prendre une photo de l’état d’un thread, comme un “save game” (c’est l’image donnée par Geert). On peut à tout moment appeler pause(), ce qui crée une sauvegarde et rend la main immédiatement, puis reprendre à partir de n’importe quel état avec resume(). Les continuations sont organisées en arbre (parent = continuation à partir de laquelle on a restauré). Encore une fois, on change la sémantique habituelle de la JVM dans sa gestion des threads.
  3. GWT: on ne présente plus GWT, Geert fait un rappel des principes de fonctionnement (translation Java->Javascript, mode hosted vs. compilé, debugging, etc.). Ici on a remplacé l’ensemble du stack Java par une plateforme web pure, et seul le développement utilise le stack Java standard. Un participant pose la question du JavaScript généré, et Geert dit que pour lui c’est un problème, car le JavaScript généré est illisible et impossible à débugger… je bondis intérieurement, et j’irai voir Geert à la fin pour lui expliquer que pour GWT, le browser est la plateforme, la lisibilité du JavaScript généré est aussi peu importante que la lisibilité du bytecode généré par le compilateur Java! Je ne pouvais pas laisser passer ça…
  4. Android: la plateforme mobile de Google. Comme pour GWT, le développement et debugging se font en Java, avec les IDEs habituels, et un émulateur de la plateforme mobile (équivalent au mode hosted de GWT). En revanche pour le déploiement, le bytecode Java est converti en bytecode (.dex) pour la machine virtuelle Dalvik, qui est l’équivalent de la JVM.

On aurait pu multiplier les exemples, notamment les langages dynamiques qui fleurissent sur la JVM, mais le point est fait. A mon sens, ces multiples extensions et détournements sont plus des preuves de la puissance de Java que de sa faiblesse, car Java reste toujours au centre d’un écosystème qui est plus bouillonnant que jamais.

 

Deuxième conf: JCR: TheServerSide as a Content Application. David Neuscheler (days.com) introduit JCR, version 1.0 (JSR 170) et 2.0 (JSR 283), les diférentes fonctionnalités d’un système de CM, etc. Puis il fait une démo en prenant une page du site TheServerSide.com, et en la transformant en appli client JCR. Pour tout dire c’est un peu fastidieux, et d’où je suis on n'arrive pas à lire le code ! J'aurais peut-être dû choisir la conf sur MapReduce dans l'autre salle...

 

Dernière conf du matin, Michael Keith présente What's new in JPA 2.0. Les objectifs étaient multiples:

  • standardiser les propriétés
  • remplir les manques de l'ORM
  • rendre la modélisation objet plus flexible
  • fournir une abstraction du contrôle du cache
  • contrôle du verrouillage (locking)
  • fournir des "hooks" pour des frameworks propriétaires
  • améliorations JPQL
  • etc.

Je ne vais pas détailler les nouveautés, mais globalement il semble que le groupe de travail JPA a bien écouté les utilisateurs, et lorsque JPA 2.0 sera sorti, il sera difficile de justifier l'utilisation directe d'une API de persistence propriétaire.Au passage, la présentation a été agrémentée d'une page culturelle sur les oies du Canada...

 

Comme hier et avant-hier, déjeuner avec un lance-pierres... et en plus ils ont enlevé les machines à café !

 

L'après-midi commence avec Choosing a Web framework, par Shashank Tiwari. En fait de conseils pratiques, il s'agit d'une énumération de définitions, de généralités, de questions (quel problème résout un framework, quel problème crée-t-il?), tout ça pour finir par dire que toutes les raisons sont bonnes de choisir un framework, y compris parce qu'il est à la mode ou pour faire bien sur son CV !!! Au final si on est en recherche d'un framework, cette conférence ne fait qu'ajouter à la confusion et à l'incertitude. Ou comment gâcher un bon sujet.

 

Case Study: Better Software with the Spring portfolio, par Eberhard Wolff (SpringSource Allemagne). Pour info, SpringSource est la société qui emploie tous les committers de Spring, mais aussi certains de Tomcat et Apache. Spring, outre le framework bien connu, c'est aussi dynamic modules, batch, integration, webflow, etc.

On nous propose un cas de système de traitement de commande à architecturer autour de Spring. Le système peut recevoir des commandes par Web Services. La démarche classique est de définir une interface Java, implémentée par un POJO, et de générer le WSDL à partir de cette interface. Or cette démarche présente des inconvénients: le WSDL expose de facto l'interface d'une classe interne.. que se passe-t-il si le WSDL doit changer? D'autre part certains types communs en Java, comme Map, ne sont pas supportés en WSDL...Eberhard propose d'inverser la démarche: puisque le contrat avec les clients est le WSDL, on part du WSDL et on base le traitement d'une commande sur le schéma XML correspondant. Ansi on n'expose pas d'interface interne, on traite un objet Java généré à partir du message envoyé, via un système de mapping (JAXB/XStream). La logique est découplée de l'interface. La classe qui traite le message est un Endpoint qui est annoté via les annotations Spring. Eberhard en profite pour rappeler que Spring est trop souvent assimilé à XML, mais qu'on peut très bien faire du Spring sans XML (ou presque, soyons honnête..)

Pour rendre robuste le WebService, on peut aussi baser le traitement du message sur des expressions XPath. Ceci permet d'avoir un contrôle plus fin sur des messages qui seraient incomplets, et donc ne pourraient pas être mappés avec la solution précédente.

Eberhard introduit également les notions de pipes et filtres, qui sont des pipelines de traitement, supportés par Spring Integration, et configurables par XML (tiens donc).

Spring fournit également une approche à la notion de batch, mal résolue en Java; notamment le problème des redémarrages en cas d'interruption volontaire ou non. Un batch Spring c'est une série d'étapes, chaque étape lit quelque chose (un record dans une base probablement) et écrit quelque chose (résultat du traitement). Cette notion est supportée par Spring batch.

 

Dernière conf de la journée, et du symposium: Real GWT applications, par Jeff Dwyer. Une énième présentation rapide des principes de GWT, et une petite démo sur le site tocollege.net, dont une partie est réalisée en GWT. Jeff fait une petite séance rapide de live coding, et montre le débugging en mode hosted. Puis il insiste, un peu trop peut-être, sur les problèmes pour envoyer des objets métier au client provenant d'hibernate: les proxies dynamiques cassent le mécanisme de sérialisation GWT. Il existe des solutions: Hibernate4GWT et GWTHibernateFilter. Je lui ferai remarquer à la fin que ce n'est pas forcément la meilleure idée, et qu'avec Dozer il est facile de populer des objets spécialisés pour les transmette au client, car je n'ai pas forcément envie de voir mes objets métier transiter sur le fil, on ne sait jamais ce qui peut s'y trouver demain...

Jeff conseille judicieusement d'utiliser un pattern Command pour les communications du client. Il aborde la sécurité, notamment les attaques XSRF, et présente Goggle Gears pour les applis offline.

La présentation était un peu rapide, mais l'intérêt pour la techno est évident. J'espère que cette présentation (qui a été donnée deux fois lors du symposium suite à la forte demande !) y aura contribué.

 

Ouf, le marathon est fini ! Beaucoup de choses passionnantes ont été présentées, et on sent qu'on est à un tournant car pour ainsi dire "ça part dans tous les sens", l'écosystème Java, aux frontières autrefois bien nettes, commence à devenir une galaxie en expansion avec des projets qui poussent l'enveloppe et repoussent sans arrêt les limites, des polémiques (et encore, on n'a pas abordé les closures !). Le monde Java de demain sera certainement bien différent de celui d'aujourd'hui, mais Java en restera probablement le centre de gravité...

Il me reste à visiter Prague (superbe ville) et regarder les Turcs se qualifier sur l'écran géant au centre ville...

vendredi 6 juin 2008

Happy Hour GWT du mercredi 4 juin

la_cantine Tout d'abord un grand merci à tous ceux qui sont venus, pour s'être déplacé et pour leur questions et leur attention. Et encore toutes nos excuses à ceux qui n'ont pu être reçus faute de place. La volonté était de limiter le nombre de participants pour rendre les speakers plus accessibles au dialogue.
Et le dialogue n'a pas manqué de s'installer dans les sessions (témoin le débordement général sur le planning de départ), ce qui montre la justesse de la formule et nous motive pour renouveler l'expérience.

L'événement s'est déroulé à La Cantine (par Silicon Sentier), au 151 rue de Montmartre, dans le passage des Panoramas à Paris (Métro 9, Grands Boulevards).
L'endroit est formidable, très convivial et chaleureux, organisé autour d'une grande salle en L (coupée en trois) au rez-de-chaussé donnant sur un bar et d'une belle salle en étage. On s'y sent vite à l'aise et comme chez soi. Les poufs verts ou oranges très design donnaient déjà un air de déco à la Google. L'ère des portables et du wifi a apporté ceci qu'un endroit comme celui-ci peut-être résolument orienté technologie sans ressembler à une usine ou à ces anciennes salles d'ordinateurs parsemées de fils en tout genre, très bruyantes et assez désagrables. Ici les ordinateurs se posent sur un coin de table ou sur les genoux, l'ambiance est tamisée, la lumière du jour traverse un puit de lumière très "maison d'architecte". Un vrai paradis pour Geek en somme (bah quoi, on s'assume).

le_bar

[On voit en haut à gauche le très sympathique patron du lieu.]

Les sessions ont pu se tenir dans des endroits très variés allant de la table ronde au canapés autour d'une table basse.
Quatres salles ont permis de tenir douze sessions après la double introduction par Didier Girard en live et Bruce Johnson dans une vidéo spécialement enregistrée pour l'occasion (encore merci à lui).

Les sessions :

Salle 1 Salle 2 Salle 3 Salle 4
Comment organiser une application GWT GWT de Hello World à RPC Réalisation d'une application avec GWT.EXT GWT vs Flex vs Silverlight
Intégrer GWT avec Spring, Maven et Hibernate Retour d'expérience sur la mise en oeuvre de GWT GWT 1.5 GWT vs Struts 2
Créer un composant GWT Install party GWT et Google App Engine Install party 2


le_buffetcadeaux Un buffet était organisé entre les sessions pour poursuivre la discussion autour d'un verre ou parler de tout autre chose.
Ce petit événement s'est terminé bien tard par un tirage au sort pour distribuer les goodies gracieusement offerts par Google pour l'occasion : des hélicoptères radio-commandés. 

 

 

Retrouvez toutes les photos sur : Picasa

mercredi 4 juin 2008

Google App Engine ouvert à tous

Il y a quelques temps, nous vous parlions ici même de Google App Engine, un projet de Google permettant  aux développeurs d’héberger leurs applications WEB sur ses infrastructures.

Les applications ainsi déployées bénéficient de la même qualité de service et de la montée en charge que l’on connaît pour des applications telles que Gmail, Google Finance, …
Le programme était officiellement ouvert à près de 10 000 développeurs depuis le début du mois d’avril.

Chez SFEIR, nous avions organisé une petite rencontre pour présenter cette technologie aux personnes le désirant. A cette occasion, Didier Girard avait porté son jeu KeyboardWarrior (application GWT) pour fonctionner sur Google App Engine. Curieux d’étudier la capacité de montée en charge de son application, il a organisé il y a une semaine environ un "load test". Les résultats ont été publiés ici.

Les retours des utilisateurs en termes de disponibilité de l’application sont diverses, aucun problème pour certains, un peu de lenteur pour d’autres. Quoi qu’il en soit l’application a tout de même supporté un pic de près de 23 requêtes par seconde pendant une minute, ce qui est plutôt pas mal pour un hébergement gratuit.

Mercredi dernier, Google a annoncé sur un de ses blogs l’ouverture de Google App Engine à tous, de ce fait vous pourrez bientôt tester et vous faire votre propre idée. Toutefois, avant de vous lancer dans la réalisation de votre première application, vous devriez peut être jeter un œil à quelques articles. En voici quelques uns qui expliquent comment faire en sorte que votre application soit scalable et comment il faut penser les applications pour Google App Engine. En effet certains concepts de cette technologie nécessitent que l’on pense autrement. C’est notamment le cas pour l’API datastore (persistance des données), pour laquelle il faut oublier les concepts des bases de données relationnelles.

Google a également annoncé quelle allait être la politique de prix pratiquée pour l’hébergement d’applications sur Google App Engine. Tout d’abord, l’offre d’entrée reste gratuite avec 500Mb de stockage et assez de bande passante et de CPU pour supporter l’équivalent de 5 millions de pages vues pas mois.

Les tarifs se présentent ensuite ainsi :

-10 à 12 cents par heure de CPU

-15 à 18 cents par GB de données par mois

-11 à 13 cents par GB de bande passante sortante

-9 à 11 cents par GB de bande passante entrante

Cette annonce est accompagnée par la mise à disposition de deux nouvelles APIs, une pour la manipulation d’images et une autre pour gérer un cache afin de diminuer les requêtes du datastore.

Je vous invite à suivre les retours des personnes qui assistent aux Google I/O sur Google App Engine, nous en saurons sûrement plus.

mercredi 28 mai 2008

GWT 1.5, c'est officiel ...

Quelques bruits ça et présageaient de la mise à disposition de la nouvelle version de GWT sous peu. C'est désormais chose faite.

Pour ceux qui ne connaissent pas cette technologie, il s’agit d’un Framework Web développé par Google. Il permet à des développeurs de réaliser des applications Web dynamiques basées sur Ajax sans écrire la moindre ligne de JavaScript. Les développements s’effectuent en effet en Java, ce qui permet de gagner un temps considérable dans la réalisation d’applications.

La version 1.5 RC 1 de GWT est officiellement disponible depuis ce matin au téléchargement. A noter toutefois qu'il s'agit d'une release candidate et non d'une version définitive.

Celle-ci était très attendue des développeurs, en effet, elle supporte désormais le JDK 5, les generics, l’autoboxing, les annotations, ...

En fait, on peut dire qu’aucune partie de GWT n’a réellement été épargnée, que ce soit en termes d’interface graphique, de compilation, d’appel RPC, tout a été amélioré.

On s’apercevra notamment que désormais, au niveau des composants graphiques, des animations sont disponibles ou encore des thèmes visuels. A noter également un effort au niveau de l’accessibilité avec le support de ARIA pour les composants standards (uniquement sous Firefox pour le moment).

Au delà des nouvelles fonctionnalités qui sont loin d’être négligeables, c'est un lot d'optimisations qui accompagne cette nouvelle version. Dans le processus de développement notamment, avec la réduction du temps de lancement en hosted mode et la diminution du temps de compilation. En termes de temps d’exécution de l’application également, avec un temps d’exécution plus court que si l’application avait été développée directement à la main en JavaScript.

Pour plus d’informations sur les nouveautés de cette version, c’est par ici .

Cette version de GWT était dans les cartons depuis quelques temps et on comprend pourquoi lorsque l’on regarde le travail qui a été accompli. Une bonne nouvelle donc pour beaucoup de développeurs, d’autant plus que Google a bien l’intention d’améliorer encore le processus de compilation.

Faciliter le développement d’applications GWT est un autre des objectifs de Google pour l’avenir avec notamment la mise à disposition d’un plugin Eclipse.

Sources :

http://code.google.com

http://www.regdeveloper.co.uk

http://www.eweek.com

vendredi 11 avril 2008

GWT in the AIR

Logo Adobe AIRJe viens de découvrir l'existence d'un projet GWT qui s'annonce intéressant : GWT in the AIR ou le mariage de GWT avec AIR.
Pour rappel, GWT est un framework open source qui permet le développement d'applications AJAX avec le langage de programmation Java. Adobe AIR est un environnement d'exécution sous licence Creative Commons qui permet de déployer localement des applications internet riches.
La combinaison de ces deux ingrédients semble détonnante, non ?

Une autre démo de la combinaison GWT + AIR : From GWT to Air in 1'

- page 2 de 3 -