Un peu de wisdom, ça fera du bien

Bon, cet après-midi, j’ai un peu de temps, donc je vais vous live-blogger une expérimentation.

L’expérimentation,, en l’occurence, est l’utilisation de wisdom-framework pour créer l’exemple canonique d’AngularJS : une liste de tâches mises à jour de façon « moderne ». L’objectif est d’arriver avant la find e la journée à une application web qui enregistre les TODOs dans un fichier au format todo.txt.

EDIT : cet objectif n’a pas été atteint, parce que j’ai perdu un peu de temps sur l’install, et surtout parce que le fameux exemple de todo avec angular ne semble pas exister … bizarre.

Ah, mais vous ne connaissez pas wisdom ? C’est normal, c’est assez jeune, mais pourtant porteur d’innombrables promesses (et j’exagère à peine en disant ça). C’est donc un framework pour applications web basé sur la modularité et le dynamisme.

La modularité, grâce à OSGi, permet de découper une application web en paquets de tout petits blocs faciles à modifier, faciles à faire évoluer à peu près indépendament, mais pourtant utilisant des ressources communes.

Le dynamisme permet, encore grâce à OSGi, mais aussi grâce à maven, de développer aussi vite qu’avec une application pure Javascript, tout en bénéficiant de l’écosystème et des capacités de typage de Java. Enfin bon, vous allez voir avec moi.

Créer le projet

Facile, c’est documenté (la doc de wisdom me paraît d’ailleurs dans l’ensemble fort bien fichue – de toute façon, il suffit d’aller sur GitHub ou dans le Google Group pour poser des questions …). Donc allons-y :

mvn org.wisdom-framework:wisdom-maven-plugin:0.5.1:create -DgroupId=fr.fot.java.wisdom -DartifactId=wisdomTodo -Dversion=0.0.1-SNAPSHOT

Et normalement, c’est bon … sauf qu’entre ma version de maven incorrecte (3.0.4), mon Java incorrect (1.6.0_40), ça ne marche pas en ligne de commande et, de la même manière, créer le projet à partir de l’archétype dans Eclipse échoue lamentablement avec un message … cryptique :

Unable to create project from archetype [org.wisdom-framework:wisdom-maven-plugin:0.5.1 -> ]
The desired archetype does not exist (org.wisdom-framework:wisdom-maven-plugin:0.5.1)

Ca fait bizarre … Bon, je crée le projet à la main et je reviens …

Et pour créer le projet à la main, histoire que vous ne perdiez pas autant de temps que moi, si vous êtes dans Eclipse, la commande d’au-dessus se traduit sous la forme

Run Configurations_2014-06-20_16-03-09

A lancer dans un « Base directory » vide pour que ça se passe bien.

Et donc, une fois que c’est fait, je tape mvn wisdom:run, je vais sur http://localhost:9000 (ne craignez rien, ces instructions sont, encore une fois, indiquées dans la doc), et j’ai droit à une très jolie page m’indiquant que faire après …

Une page fournie par le WelcomeController. Le meilleur étant évidement que, quand je renomme le package de ce contrpoleur, je vois la console wisdom s’agiter un moment, puisque l’application est rechargée dans le dos d’Eclipse (c’est bon ça Clément !).

Ajouter une route à l’application

Donc maintenant, pour ajouter une nouvelle page (oui, je vais ajouter ma page avant de remplacer la @Route par défaut dans le contrôleur), ça me paraît assez facile :

    /**
     * Ici todo est le nom du fichier du template, sans l'extension thl.html
     */
    @View("todo")
    Template todoList;

    /**
     * Et donc quand on va aller sur http://localhost:9000/list, ça va afficher le template #todoList qui n'existe pas encore ... d'où une erreur.
     * @return
     */
    @Route(method = HttpMethod.GET, uri = "/list")
    public Result todoList() {
    	return ok(render(todoList));
    }

Et quand j’essaye de taper http://localhost:9000/list dans mon navigateur j’ai droit … évidement à une belle page d’erreur, puisque le tempalte n’existe pas ! Donc je le crée avec un contenu … quelconque.

Et devinez quoi ? Eh bien évidement, ça marche !

Bon, je n’ai plus qu’à rempalcer ce contenu par celui de l’exemple d’Angular JS  … qui a malheureusement été remplacé par exemple commercial. Pas grave, on peut le trouver ailleurs (la deuxième version est bien plus simple pour un noob comme moi).

Et là c’est le drame : les attributs ng-app d’Angular viennent foutre le bazar dans le parsing XML :

Caused by: org.thymeleaf.exceptions.TemplateInputException: Exception parsing document: template="bundle://58.11:0/templates/todo.thl.html", line 13 - column 13
	at org.thymeleaf.templateparser.xmlsax.AbstractNonValidatingSAXTemplateParser.parseTemplateUsingPool(AbstractNonValidatingSAXTemplateParser.java:167) ~[na:na]
	at org.thymeleaf.templateparser.xmlsax.AbstractNonValidatingSAXTemplateParser.parseTemplate(AbstractNonValidatingSAXTemplateParser.java:117) ~[na:na]
	at org.thymeleaf.TemplateRepository.getTemplate(TemplateRepository.java:277) ~[na:na]
	at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1104) ~[na:na]
	at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1060) ~[na:na]
	at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1011) ~[na:na]
	at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:955) ~[na:na]
	at org.wisdom.template.thymeleaf.impl.WisdomTemplateEngine.process(WisdomTemplateEngine.java:85) ~[na:na]
	at org.wisdom.template.thymeleaf.impl.ThymeLeafTemplateImplementation.render(ThymeLeafTemplateImplementation.java:120) ~[na:na]
	at org.wisdom.api.templates.Template$$Proxy.render(Unknown Source) ~[na:na]
	at org.wisdom.api.DefaultController.render(DefaultController.java:188) ~[wisdom-api-0.5.1.jar:na]
	at fr.fot.java.wisdom.todo.WelcomeController.__M_todoList(WelcomeController.java:65) ~[na:na]
	at fr.fot.java.wisdom.todo.WelcomeController.todoList(WelcomeController.java) ~[na:na]
	... 33 common frames omitted
Caused by: org.xml.sax.SAXParseException: Le nom d'attribut "ng-app" associ� � un type d'�l�ment "html" doit �tre suivi du caract�re '='.
	at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:198) ~[na:1.7.0]
	at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177) ~[na:1.7.0]
	at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:441) ~[na:1.7.0]
	at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:368) ~[na:1.7.0]
	at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1375) ~[na:1.7.0]
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanAttribute(XMLDocumentFragmentScannerImpl.java:1489) ~[na:1.7.0]
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:1279) ~[na:1.7.0]
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2715) ~[na:1.7.0]
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:607) ~[na:1.7.0]
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:488) ~[na:1.7.0]
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:835) ~[na:1.7.0]
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764) ~[na:1.7.0]
	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:123) ~[na:1.7.0]
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1210) ~[na:1.7.0]
	at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:568) ~[na:1.7.0]
	at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(SAXParserImpl.java:302) ~[na:1.7.0]
	at org.thymeleaf.templateparser.xmlsax.AbstractNonValidatingSAXTemplateParser.doParse(AbstractNonValidatingSAXTemplateParser.java:210) ~[na:na]
	at org.thymeleaf.templateparser.xmlsax.AbstractNonValidatingSAXTemplateParser.parseTemplateUsingPool(AbstractNonValidatingSAXTemplateParser.java:134) ~[na:na]
	... 45 common frames omitted

En même temps, je sais que c’est ça essentiellement grâce à une très bonne remontée d’erreur (c’est un avantage certain). Du coup je replonge dans la doc de wisdom pour voir comment angular et thymeleaf peuvent vivre ensemble … Ah en fait ça n’est pas dans la doc de Wisdom, mais sur la ML de Thymeleaf.

Bon, et du coup, une fois que j’ai modifié l’entête pour

<!doctype html>
<html data-ng-app="">

que j’ai fermé les différents tags mal fermés et corrigé deux ou trois boulettes, ma page s’affiche … mochement, je dois dire🙂

Je peux donc y ajouter le contrôleur pour angular, que je copie-colle également sans m’embêter. Mais avant ça, je vais d’abord ajouter les webjars demandés (quelle chouette idée, ces dépendances javascript utilisables facilement) …

Mais ça, ce sera pour une autre fois.

Parce que les mecs d’angular semblent avoir décidé de changer leur exemple (que j’ai pourtant vu des dizaines de fois) et que, n’ayant plus de tutoriel parfaitement clair, je ne peux même plus tenter d’adapter ce que je vois à ce que wisdom me fournit (parce que figurez-vous que je ne connais malheureusement pas encore l’outil).

Bon, bref. J’y reviendrai sans doute la semaine prochaine. En tout cas, je suis plutôt séduit par la facilité avec laquelle wisdom s’installe, s’adapte, et se met à jour quand on change du code.

Comme quoi l’apprentissage n’est pas toujours un chemin facile. Surtout quand on se met soi-même des bâtons dans les roues.

2 réflexions sur “Un peu de wisdom, ça fera du bien

  1. Pingback: Encore un peu de wisdom ? | riduidel's wordpress

  2. Pingback: Allez on reprend proprement … | riduidel's wordpress

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s