jeudi 12 mars 2009

Paris Jug - Wicket

Mardi dernier je suis allé à une soirée web organisée par le Paris Jug. C'était très sympa, surtout cette ambiance FAC avec une centaine de développeurs Java (j'imagine).

Une présentation de Wicket a eu lieu en première partie (je ne suis pas resté pour la seconde) ; et ma fois, la démonstration, réalisée en "peer-programming" par Zenika était assez surprenante de simplicité : une migration en live de 3 pages HTML/CSS statiques en pages dynamiques (HTML + composants Wicket).

A creuser un peu plus lorsque j'aurais du temps...

Pendant ce temps...

J'attends toujours des updates de JBoss (5.1) et pourquoi pas de Seam.

J'utilise JFlex pour parser mes fichiers et les perfs sont là !

JavaBLACKbelt

Ca y est j'ai enfin ma ceinture verte !



Pour les amateurs de java, ca se passe et arriver jusqu'à la ceinture verte est vraiment amusant (surtout à plusieurs).

mardi 3 février 2009

Avancement... le temps qui parse...

Depuis quelques temps, je travaille sur la partie parsing de mon projet. Fan de JFlex, et très heureux de constater que des "maintenance releases" sortent, je me mets à Antlr v3.

Je ne sais lequel de ces deux outils je garderai mais pour tout dire, j'ai une légère préférence pour JFlex (dans mon cas d'utilisation bien entendu). Le critère de choix se situera au niveau des performances (rapidité de parsing et consommation mémoire).

jeudi 22 janvier 2009

Comment commenter ?

Bien j'ai finalement fini par trouver comment configurer JSF pour bien gérer les commentaires HTML (<!-- -->), il suffit d'ajouter dans le fichier web.xml :

<context-param>
  <param-name>facelets.SKIP_COMMENTS</param-name>
  <param-value>true</param-value>
</context-param>

Simple, mais encore fallait-il le savoir...

mercredi 21 janvier 2009

Ca avance bien...même si...

Je suis bien lancé, les CSS sont finis à 90%, l'enregistrement d'un nouvel utilisateur fonctionne, la page de login marche nickel et le premier formulaire (avec upload de fichier via InputStream) est opérationnel !

Bien entendu, je suis tombé sur certains problèmes :
- espace avalé par une balise <s:link> (problème de JSF semble-t-il)
- une belle exception lorsqu'on commente (en HTML : <!-- -->) du code Seam (problème de jboss-el ?)
- droits bizarres à donner à un utilisateur H2 pour pouvoir créer un schéma...

Bref, il y a de quoi faire. Heureusement qu'il y a les exemples de Seam !

Ah si j'ai également eu affaire à Pete Muir (un des piliers de Seam) qui ferme les issues Jira plus vite que son ombre sous prétexte qu'on a pas lu la doc : je me suis pris un beau RTFM dans les dents, sauf que même en lisant ce FM, ben je n'ai rien trouvé d'utile... merci Pete ;)

samedi 10 janvier 2009

Favicon

Les favicons sont des icônes qui peuvent être affichées dans les onglets de votre navigateur web ou encore à gauche de l'URL.

Le site suivant vous permet d'en créer à partir d'images existantes : http://www.favicon.cc/

vendredi 9 janvier 2009

CSS-2

L'analyze des exemples de Seam est très fructueuse. Ainsi le développement de pages web à l'aide de balises <table> est du passé grâce aux sélecteurs d'ID !

Comme l'indique le sujet de ce post, je suis en train d'adapter la feuille de style screen.css qui est un très bon début : Merci Seam !

vendredi 2 janvier 2009

Repository

Alors que je réfléchisais à un site pour entreposer les sources de mon projet je suis tombé sur cette page très intéressante :

Comparison of open source software hosting facilities

RichFaces et Skins

Je découvre et çà m'a vraiment l'air bien tout çà :

Démonstration Live de RichFaces chez Exadel.

Code coverage avec Emma intégré à TestNG

Et c'est fini, l'intégration d'Emma via TestNG dans mon extraction d'exemple de Seam fonctionne. Pour ce faire, j'ai encore du modifier quelque peu le build.xml originale de examples/booking.

Finalement, le voici :



1 <?xml version="1.0"?>
2
3
<project name="projectName" default="deploy" basedir=".">
4
5
<!-- Naming -->
6
<property name="Name" value="projectName"/>
7
<property name="version" value="1.0"/>
8
<property name="example.name" value="${Name}"/>
9
10
<!-- Libraries to include -->
11
<property name="seam.ui.lib" value="yes"/>
12
<property name="seam.debug.lib" value="yes"/>
13
<property name="facelets.lib" value="yes"/>
14
<property name="richfaces.lib" value="yes"/>
15
<property name="src.test.dir" value="test"/>
16
<property name="test-report.dir"
17
value="${basedir}/test-output"/>
18
<property name="report.dir"
19
value="${basedir}/test-report"/>
20
<property name="coverage.dir"
21
value="${basedir}/test-build/coverage"/>
22
23
<!-- Datasource -->
24
<property name="example.ds" value="projectName-h2-ds.xml"/>
25
26
<import
27
file="${basedir}/thirdparty/jboss-seam/examples/build.xml"/>
28
29
<target name="instrument" depends="buildtest,getemma">
30
<taskdef resource="emma_ant.properties"
31
classpathref="runtime.emma.path"/>
32
<mkdir dir="${coverage.dir}/${Name}"/>
33
<emma>
34
<instr instrpath="${test.dir}"
35
mode="overwrite"
36
metadatafile="${coverage.dir}/coverage.ec">
37
<!-- Exclude packages we don't want coverage for -->
38
<filter excludes="**.test.*"/>
39
</instr>
40
</emma>
41
</target>
42
43
<target name="coveragereport" depends="getemma"
44
description="Create the coverage report">
45
<taskdef resource="emma_ant.properties"
46
classpathref="runtime.emma.path"/>
47
<emma>
48
<report depth="method">
49
<sourcepath>
50
<path location="${src.java.dir}"/>
51
</sourcepath>
52
<infileset dir="${coverage.dir}"
53
includes="coverage.ec"/>
54
<html outfile="${report.dir}/coverage.html"/>
55
</report>
56
</emma>
57
<echo>Code coverage report for ${Name} classes
58
available at ${report.dir}/coverage.html</echo>
59
</target>
60
61
<target name="test-coverage"
62
depends="instrument, test, coveragereport"
63
description="Run unit tests with coverage"/>
64
</project>
65


Les cibles test-coverage, instrument et coveragereport ont été inspirées de celles disponibles dans le fichier build.xml à la racine de Seam.

Les propriétés ont été modifiées pour générer les reports dans le répertoire du projet.

Intégration de H2 database à JBoss et Seam

Comme dirait l'autre, ca n'a pas été de la tarte (rappel je suis novice).

Dans l'ordre donc, j'ai bien-sûr téléchargé la dernière version d'H2 (1.1.105 datant du 19 décembre 2008).

Ensuite, j'ai lu la documentation O_o ! Et oui, ca aide toujours et on apprend moults choses : modes de compatibilités, performances, administration, limitations etc...

J'ai ensuite copié le jar "h2-1.1.105.jar" dans <project name>/thirdparty/jboss-5.0.0.GA/common/lib et dans <project name>/thirdparty/jboss-seam/lib pour la partie testNG avec JBoss Embedded.

Après ces quelques heures fructueuses qui m'ont confortées dans mon choix d'utiliser ce SGBD, j'ai créé mon fichier -ds.xml :



1 <?xml version="1.0" encoding="UTF-8"?>
2
<!--
3 <!DOCTYPE datasources
4 PUBLIC "-//JBoss//DTD JBOSS JCA Config 1.5//EN"
5 "http://www.jboss.org/j2ee/dtd/jboss-ds_1_5.dtd">
6 -->

7
<!-- H2 database JBoss datasource -->
8
<datasources>
9
<local-tx-datasource>
10
<!-- The jndi name of the DataSource, it is prefixed with
11 java:/ -->

12
<!-- Datasources are not available outside the virtual
13 machine -->

14
<jndi-name>projectNameDatasource</jndi-name>
15
16
<!-- For in-process persistent db, saved when jboss
17 stops. -->

18
<connection-url>
19
jdbc:h2:file:${jboss.server.data.dir}${/}h2${/}projectNameDB;DB_CLOSE_ON_EXIT=FALSE
20
</connection-url>
21
22
<!-- The driver class -->
23
<driver-class>org.h2.Driver</driver-class>
24
25
<!-- The login and password -->
26
<user-name>sa</user-name>
27
<password/>
28
29
<transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
30
31
<!-- this will be run before a managed connection is removed
32 from the pool for use by a client-->

33
<check-valid-connection-sql>select 1 from DUAL</check-valid-connection-sql>
34
35
<!-- The minimum connections in a pool/sub-pool. Pools are
36 lazily constructed on first use -->

37
<min-pool-size>10</min-pool-size>
38
39
<!-- The maximum connections in a pool/sub-pool -->
40
<max-pool-size>20</max-pool-size>
41
42
<!-- The time before an unused connection is destroyed -->
43
<!-- NOTE: This is the check period. It will be destroyed
44 somewhere between 1x and 2x this timeout after last use -->

45
<idle-timeout-minutes>0</idle-timeout-minutes>
46
47
<!-- sql to call on an existing pooled connection when it is
48 obtained from pool -->

49
<check-valid-connection-sql>select 1 from DUAL</check-valid-connection-sql>
50
51
<!-- Whether to check all statements are closed when the
52 connection is returned to the pool, this is a debugging
53 feature that should be turned off in production -->

54
<track-statements/>
55
56
<!-- H2 DB benefits from prepared statement caching -->
57
<prepared-statement-cache-size>16</prepared-statement-cache-size>
58
59
</local-tx-datasource>
60
61
</datasources>
62


Vous noterez plusieurs choses :

  • J'ai volontairement commenté la recherche de DTD pour éviter la connexion à www.jboss.org tout le temps.

  • Dans l'URL de connexion (jdbc:h2:file:${jboss.server.data.dir}${/}h2${/}projectNameDB;DB_CLOSE_ON_EXIT=FALSE), j'ai placé la propriété DB_CLOSE_ON_EXIT=FALSE pour éviter des problèmes en cas d'arrêt de JBoss du style : org.h2.jdbc.JdbcSQLException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL)

  • J'utilise pour le moment le compte SA (super administrateur) mais cela changera une fois en production.



Ceci fait, il faut passer à la configuration d'Hibernate. Ainsi le fichier /resources/META-INF/persistence.xml se trouve modifié comme suit :



1 <?xml version="1.0" encoding="UTF-8"?>
2
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
3
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4
xsi:schemaLocation=
5
"http://java.sun.com/xml/ns/persistence
6 http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"

7
version="1.0">
8
<persistence-unit name="projectNameDatabase">
9
<provider>org.hibernate.ejb.HibernatePersistence</provider>
10
<jta-data-source>java:/projectNameDatasource</jta-data-source>
11
<properties>
12
<!-- TODO: WHILE UNDER DEVELOPMENT, LET THIS PROPERTY TO
13 TODO: "create-drop"
14 -->

15
<!-- TODO: ONCE IN PRODUCTION, SET THIS PROPERTY TO "validate"
16 -->

17
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
18
<property name="hibernate.show_sql" value="true"/>
19
<property name="hibernate.dialect"
20
value="org.hibernate.dialect.H2Dialect" />
21
<!-- These are the default for JBoss EJB3, but not for HEM: -->
22
<property name="hibernate.cache.provider_class"
23
value="org.hibernate.cache.HashtableCacheProvider"/>
24
<property name="hibernate.transaction.manager_lookup_class"
25
value="org.hibernate.transaction.JBossTransactionManagerLookup"/>
26
</properties>
27
</persistence-unit>
28
</persistence>
29


Il faudra bien faire attention au dialect (ligne 14) et à la propriété hibernate.hbm2ddl.auto (ligne 12) (voir précédents posts).

Enfin comme indiqué dans la documentation d'H2, il faudra bien faire attention à un bug dans le dialect H2 (issue Jira HHH-3401 toujours ouverte à ce jour) présent donc en version 3.3.1.

Gros update !

Ces derniers temps, j'ai enfin réussi à tout mettre en oeuvre :
- JBoss 5
- JDK 1.6
- Seam 2.1.1.GA
- H2 database
- TestNG (avec JBoss Embedded)

Ca compile, ca passe les tests, ca tourne, ca sauvegarde et ca retourne !

Après mes essais scabreux à base de maven 2, j'en suis bien revenu. Le plus simple a finalement été de partir d'un exemple fonctionnant (examples/booking), de le J'ai copier/coller dans <project name> puis de le modifier en conséquence (en prenant soin de bien lancer "ant clean test" après chaque modification majeure).

J'ai ainsi l'arborescence suivante :

<project name>/resources
<project name>/src
<project name>/test
<project name>/thirdparty
<project name>/view


Avec dans thirdparty les dossiers suivants (simples extractions des .zip téléchargés) :


<project name>/thirdparty/h2
<project name>/thirdparty/jboss-5.0.0.GA
<project name>/thirdparty/jboss-seam


Il en ressort plusieurs choses :


  • Bien utiliser Ant version 1.7 minimum pour ne pas avoir de problèmes.

  • J'ai accordé l'import du fichier build.xml au changement d'arborescence : <import file="${basedir}/thirdparty/jboss-seam/examples/build.xml"/>

  • J'ai positionné la propriété jboss.home dans le fichier <project name>/thirdparty/jboss-seam/build.properties à : jboss.home=${basedir}/thirdparty/jboss-5.0.0.GA

  • J'ai déplacé les classes de test dans le dossier <project name>/test pour ne pas les avoir dans l'EAR de production et modifier en conséquence le build.xml de base : <property name="src.test.dir" value="test" />

  • J'ai déplacé les rapports de testNG pour les placer directement dans le dossier <project name>/test-output au lieu d'un dossier dans la distrib de Seam : <property name="test-report.dir" value="${basedir}/test-output" />

  • Et finalement, j'ai laissé la propriété hibernate.hbm2ddl.auto tant que ce projet est en cours de développement à "create-drop". Le jour où il passera en production, je la passerai éventuellement à "validate" voir à "off".



A noter cependant que je n'ai pas encore réussi à cabler Emma.

lundi 22 décembre 2008

Configuration Hibernate et Hbm2Ddl, gare à vous !

Après quelques essais (démarrage, insertion de nouvelles données en base, arrêt de JBoss, redémarrage...) je ne voyais pas mes données. J'ai testé avec H2 et PostgreSQL et même chose pour ces deux moteurs.

Le problème venait de la configuration d'Hibernate et plus précisément du paramètre hibernate.hbm2ddl.auto dans le fichier persistence.xml.

La page suivante détaille les différents paramètres et valeurs acceptées. Dans mon cas, il m'a suffit de remplacer "create-drop" par "update".

Yes, ca marche !

Ouf, enfin, j'ai réussi à déployer l'exemple booking de Seam 2.1.1.CR2 sur un serveur JBoss 5.0.0.GA !

Ca aura pris 3 semaines... (heureusement pas full time :) ).

Maintenant, je travaille sur la base de données, laquelle choisir... ?

dimanche 21 décembre 2008

Compatibilité : JDK 1.6, Seam 2.X et JBoss 4.2.X/5.0.0

Cette page, bien utile, explique la compatibilité entre Seam 2.X, JBoss et le JDK 1.6 !

Donc en résumé, le JDK 1.6 utilisé doit avoir une version supérieure ou égale à 1.6.0_04 ; le dernier en date: 1.6.0_11 (update 11) est donc pafait.

De plus, comme l'indique ce lien, Seam devrait bien fonctioner sous JBoss 4.2.X.

Ici, on apprend ce qu'il faut savoir pour faire tourner une application Seam sous JBoss 5. Attention, certains exemples ne tournent toujours pas ! La version recommandée de Seam est la 2.1.X.GA dans ce cas.

vendredi 19 décembre 2008

Maven, c'est l'enfer... tout comme JBoss 5.0.0.PS

Le post de Michael Yuan m'a bien fait comprendre une chose : ce n'est pas parce que cela marche pour quelqu'un que cela marche pour tout le monde.

En appliquant à la lettre les instructions de ce post, on finit par créer un EAR digne de ce nom.

Le problème c'est que mon bel EAR, une fois collé dans le répertoire deploy/ de JBoss 5.0.0.PS (pour Pas Sec) ne déployait pas ! Une obscure erreur de jar non trouvé dans un répertoire lib... bref un coup dans l'eau comme on dit.

Après des tentatives infructueuses, je me décide à déployer un exemple de Seam 2.0.2.SP1 (examples/todo) et là oh surprise, même problème. Je range mes affaires, supprime JBoss du disque dur et m'en vais tenter avec JBoss 4.2.3 mon aventure.

L'exemple se déploit bien. Je tente un autre exemple (examples/booking) et ca passe aussi, vive la 4.2.3 :)

Donc me revoici sous Maven à tenter de faire fonctionner mon EAR. Mais là, astucieux tel un vieux renard, je fais en sorte de construire le même EAR que celui créé par l'exemple booking, avec un seul hello_world.xhtml bien entendu (les EJBs ou composants Seam, on verra après).

Mais qu'est-ce que je n'avais pas trouvé là comme occupation ! Gérer soi-même les dépendances, rechercher à travers les poms.xml des autres projets pour voir pourquoi telle ou telle jar est inclus dans l'ear ou le war est un travail à plein temps !!!

Après une journée passée à faire du XML, me voilà enfin avec mon EAR tout beau ouf :)

Je décide donc de corser l'affaire en commencant à inclure un composant Seam Use et Authenticator pour tester l'authentification et là, ca devient l'enfer.

Je passe les détails quant à la configuration sous JBoss pour utiliser H2 au lieu d'HSQLDB (dont le coeur n'est pas multi-threadé).

Et me voici à comparer les fichiers application.xml et jboss-app.xml générés par le plugin EAR de maven. Outre le fait que celui-ci ne gère pas encore la version 5 de JBoss, le plugin n'a pas évolué depuis le 21 août 2007, et c'est ainsi que la fonctionnalité de définition de datasource(s) utilisée(s) par un EAR n'est pas encore disponible alors que l'issue MEAR-52 correspondante est fixée depuis le 24 août 2007 ! Ainsi si l'on veut en bénéficier, il ne reste plus qu'à télécharger les sources et à se l'installer dans son repository, très pratique !

De plus comme je disais ci-dessus, les versions XSD indiquées dans les fichiers .xml ne sont pas à jour :(

Bref, c'est du grand n'importe quoi et me revoici au point de départ : est-ce que j'abandonne Maven 2 à cause d'un de ses plugins (je ne sais pas si pour les autres c'est pareil) ou bien est-ce que je configure mon IDE pour générer lui même l'EAR comme je l'entends (c'est à dire en prenant exemple sur ceux générés dans les exemples de Seam) ?

Pour l'instant mon coeur balance pour la seconde solution, on verra bien où cela me mènera...

Maven 2 c'est magique !

Fier d'avoir installé (facilement) Seam et JBoss, je me suis alors dit : puisque j'utilise JBoss autant passer aux .EAR que de rester aux .WAR surtout si je veux inclure des EJB 3...

Je me suis ensuite posé la question de l'outil d'assemblage, de mon futur projet. Connaissant Ant et Maven 1, et ayant soif de nouveautés ; Maven 1 n'étant au final pas si terrible que cela et Maven 2 faisant tellement de promesses sur l'aspect multi-modules, transitivité des dépendances, build en ligne de commande (sans besoin d'un IDE...) je me suis donc lancé.

La version 2.0.9 téléchargée, la variable M2_HOME créée, je me suis alors retrouvé dans la documentation pour voir ce qu'il en retournait.

Et bien-sûr comme pour Maven 1, la documentation fait cruellement défaut :(

Vous verrez dans les prochains posts ce que signifie "manque de documentation".

Google mon ami

Qui dit projets informatiques dit problèmes à résoudre. Et j'aime à penser quand je reonctre un problème de programmation, que quelqu'un d'autre la certainement déjà rencontré, déjà résolu et a même eu la gentillesse d'expliquer son raisonnement sur Internet.

Ni une nie deux donc, je tape donc "setup seam jboss" dans Google et en 3ème position, j'obtiens :

Michael Yuan » Blog Archive » JBoss Seam project setup with Maven ...

Exactement ce que je cherchais : un exemple de projets simple (la coquille) multi-modules sous Maven 2 pour créer un EAR à partir d'un projet Seam.

Merci Google !

mardi 16 décembre 2008

Deux semaines de pérégrinations...

...pour enfin trouver le coupable et non des moindres !

Mais avant de dénoncer le responsable dans la cuisine avec le chandelier, je m'en vais vous retracer mon parcours.

Au départ, je voulais une architecture simple et robuste mais en lisant le chapitre 1 de la documentation de Seam, que vois-je ?

"[...] You will need to follow the instructions in Section 29.6.1, “Installing Embedded JBoss” for installing JBoss Embedded on Tomcat 6.0. JBoss Embedded is only required to run the Seam demos that use EJB3 components on Tomcat. [...]"

Et oui, si je veux tirer pleinement parti de Seam (donc utiliser des EJB3 et JPA), il me faudrait installer JBoss Embedded...

Deux clics plus tard, je suis sur la page de JBoss Embedded que je tente de télécharger aussitôt.

Et là stupéfaction, JBoss Embedded n'est disponible qu'en version Beta (3) en l'occurrence :


Donc me voilà avec un Tomcat et un Seam finalement non compatibles.

Qu'à cela ne tienne, après un petit tour sur le site de JBoss, voici qu'une publicité (assez imposante) m'informe que la version 5 du serveur d'application JBoss est disponible et a déjà été téléchargée plus de 20 000 fois :



Mon sang ne fait qu'un tour et je m'empresse (malheureusement) de télécharger l'outil salvateur sur lequel je suis sûr de pouvoir faire tourner Seam...

Et là une grande baffe, je tombe sur une page me demandant la version que je souhaite télécharger. Envolés les -alpha, -beta et RC, maintenant ce sont des .CR2, .SP1, .GA et autre .Beta4 qui m'acceuillent. Heureusement, une autre page détaille cette nouvelle typologie. Je choisis donc la version "General Availability" en version 5.0.0 pour le JDK 1.6. Et 104 Mo plus tard, j'installe d'un simple "dézippage" JBoss 5.0.0.GA.

On notera que jusqu'ici tout va bien :) mais le coupable n'est pas encore entré en scène...

A suivre !

Voyage vers le présent

A l'époque où je développais des servlets (en 2001), je me servais du moteur de servlet Apache JServ (paix à son âme) derrière un serveur Apache.

A l'époque, on déployait avec un fichier .bat sous windows qui copiait les classes compilées directement sur un serveur Linux (Portland... paix à son âme) grâce à Samba... nostalgie...

Désormais, merci à CMI qui m'a présenté les dernières technologies du monde Java et du domaine des webapp plus précisémment.

Alors voici ses recommendations :

Pour ce qui est de la JVM, préférez la JVM 1.6 de Sun du fait de ses nombreuses optimisations (CPU multi cores, garbage collector, monitoring...).

Pour ce qui est du framework web, il semblerait que le framework Seam suive la bonne direction (cad rejoindrait les futurs standards (JSR...).

Partant de là, je m'empresse de télécharger et la JVM et le framework Seam version 2.1.0.SP1 ainsi que la documentation PDF très bien réalisée...

Dansons la Java pendant que ca sèche...

Alors oui, je viens de créer ce blog car cela ne peut plus durer.

Je ne sais pas si c'est moi, si c'est mon côté perfectionniste qui fait des siennes mais je trouve que certains projets open source mériteraient un peu plus de suivi. Je dis çà pour eux car la confiance n'est plus trop là.

Mais qu'est-ce qui a bien pu m'énerver comme cela ? Tout simplement le fait qu'au jour d'aujourd'hui, nombre de projets ne sont pas secs...

Il y a 2 semaines, je me suis dit : "Et si je commencais un nouveau projet en Java... une application web !".

Bien entendu, ayant délaissé ce domaine (webapp) depuis quelques temps (je bosse plutôt sur Oracle mais j'ai 9 ans d'expérience en Java), je décide de m'y remettre en songeant à utiliser de bons outils qui, en 2009 (presque), devraient m'offrir tout ce dont je rêve :


Résultats, cela fait deux semaines que je galère et parmi les outils précédemment cités, seul Maven 2 subsiste mais ses heures sont désormais comptées...