Java Scripting

Posted in Java/J2EE on mai 28th, 2009 by Ajrarn

… depuis sa version 6, Java intègre une nouvelle fonctionnalité nommée : Java Scripting.
Comme son nom l’indique plus ou moins, cela permet de manipuler directement des langages de script dans vos classes Java.

Vous vous demandez peut-être l’intérêt qu’il y a à procéder de la sorte, mais si si, il y en a!
Pour rappel, pour beaucoup de langages de script :

  • Il n’y a pas de typages, ou pas de typages obligatoires.
  • Pas de compilation à gérer, un déploiement trivial, bien adapté au développement de prototypes par exemple.
  • Il y a certaines fonctionnalités très appréciables comme la lecture d’un fichier XML de manière très simple.

Cette nouvelle fonctionnalité permet de manipuler un grand nombre de langages de script, dont les suivants : Groovy, Jaskell, Python, Ruby, Velocity, XPath, XSLT pour ne nommer qu’eux (ou plutôt que ceux que je connais! (^_^) ). L’utilisation de l’un d’entre eux vous demandera d’ajouter le jar adéquat dans votre projet.

Par contre, nativement, Java 6 intègre Rhino : Javascript for java, un projet Mozilla.

Alors, comment ça marche?
Commençons par un exemple simple. Imaginons que nous ayons un fichier add10.js contenant le code suivant :

var j = 10;
println(i + j);

Voici un exemple, en Java, montrant comment injecter une variable dans ce code javascript et le jouer :

import java.io.FileNotFoundException;
 
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
 
public class TestScripting {
	public static void main(String[] args) {
	// Création du manager du moteur de script
        ScriptEngineManager factory = new ScriptEngineManager();
        // Création du moteur Javascript
        ScriptEngine engine = factory.getEngineByName("JavaScript");
        try {
        	int a = 10;
        	// On fournit la variable "i" au code Javascript
        	engine.put("i", a);
        	// Evaluation du code du fichier add10.js
		engine.eval(new java.io.FileReader("script/add10.js"));
		} catch (ScriptException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}
}

En exécutant ce fichier Java, vous devriez voir la valeur 20 apparaître dans votre console de sortie.

Allons un peu plus loin.
Considérons que nous avons une classe Java nommée Person et définie comme suit :

public class Person {
	public String firstName;
	public String lastName;
	public int age;
 
	Person (String firstName, String lastName, int age) {
		this.firstName = firstName;
		this.lastName = lastName;
		this.age = age;
	}
}

Et le fichier Javascript infoPerson.js suivant :

function getAge(person) {
	return person.age;
}
 
function getFirstName(person) {
	return person.firstName;
}
 
function getLastName(person) {
	return person.lastName;
}

Voici comment appeler une méthode Javascript, en lui passant un paramètre (objet qui plus est) et en récupérer le résultat :

import java.io.FileNotFoundException;
 
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
 
public class TestScripting {
	public static void main(String[] args) {
		// Création du manager du moteur de script
		ScriptEngineManager factory = new ScriptEngineManager();
		// Création du moteur Javascript
		ScriptEngine engine = factory.getEngineByName("JavaScript");
		try {
			Person person = new Person("Pascal", "VERRECCHIA", 29);
 
			// Evaluation du code du fichier infoPerson.js
			engine.eval(new java.io.FileReader("scripts/infoPerson.js"));
 
			Invocable inv = (Invocable) engine;
			// Appel de la méthode Javascript "getAge" en passant l'objet person
			// en paramètre et cast du résultat pour obtenir un entier.
			int age = (Integer) inv.invokeFunction("getAge", person);
 
			System.out.println("age : " + age);
		} catch (ScriptException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		}
	}
}

Vous devriez voir age : 29 dans votre console après exécution de ce code Java.
Vous aurez remarqué que le fait d’envoyer un objet au Javascript ne pose pas de problèmes!
La valeur retournée par une méthode Javascript est de type Object. Il sera donc nécessaire de parser le résultat en conséquence.

Voilà pour les grandes lignes du Java Scripting.
Si vous souhaitez aller plus loin, allez vous promener par .

Un petit bémol, cependant, concernant l’intégration de Rhino dans Java 6 : toute la partie E4X (ECMAScript for XML) a été exclue… Et ça, c’est bien dommage, parce que E4X, pour travailler sur du XML, c’est tout de même sacrément sympa…

Si c’est ce type de besoin que vous recherchez, je vous conseille de vous orienter vers Groovy et/ou XPath.

Tags: ,

Les Mystères d’Osiris, Tome 3 : Le chemin de feu

Posted in Mes lectures on mai 27th, 2009 by Ajrarn

Auteur : Christian Jacq

Note : 2/5

Quatrième de couverture : Nommé Fils Royal, Iker doit une nouvelle fois quitter Memphis et la belle Isis, si chère à son cœur. Pharaon lui a confié une mission de première importance qui doit mettre un terme définitif aux agissements des disciples de Seth s’infiltrer en pays de Canaan et démasquer l’Annonciateur. Mais le renégat a trouvé refuge au-delà de la troisième cataracte, en Nubie, où il a noué des alliances avec les puissants sorciers locaux. Depuis cet asile, il menace de provoquer une crue gigantesque du Nil qui dévasterait l’Egypte et réduirait à néant l’autorité de pharaon. Sans nouvelles d’Iker, Sésostris et le général Nesmontou ont positionné leurs troupes aux confins du royaume, à Bouhen, ville frontière avec le pays de Koush. Une bataille décisive s’annonce dont l’issue décidera du sort de la Maison Royale…

…oui oui je persiste après l’Arbre de vie et La conspiration du mal. Je suis comme ça… Je commence, je termine. Et puis après tout, on n’est jamais à l’abri d’une bonne surprise.

Sauf que là… Ce n’est toujours pas le cas. Rien à faire, j’ai du mal avec cette série. On ne peut pas dire que ce soit mauvais mais c’est toujours aussi manichéen, naïf et mielleux.

Les choses bougent malgré tout… Les méchants commencent miraculeusement à essuyer des revers. Pourquoi? Franchement, on ne sait pas… D’une page à l’autre, les gentils commencent à devenir bons et c’est comme ça, voilà tout.

Qui plus est, la sensation que l’auteur nous sert un scénario abracadabrant pour coller à l’histoire réelle de Sesostris III avec sa pacification de la Syro-Palestine et sa colonisation de la Nubie (du moins j’imagine que c’est l’histoire réelle, je le répète, je ne suis pas du tout expert de la question) n’ajoute rien à la “qualité” du récit.

Pour finir, on nous sert de la magie et de l’intervention divine à toutes les sauces. On finit par se demander à quoi servent les personnages. Dès qu’un problème pointe le bout de son nez, l’incarnation d’un Dieu résout tout en claquant des doigts.

Je suis à nouveau assez dur dans mes propos… Mais c’est que j’attendais tout autre chose de cette série…

Allez, il en reste un! :twisted:

Tags:

Le chevalier errant suivi de L’épée lige : Préludes au Trône de Fer

Posted in Mes lectures on mai 27th, 2009 by Ajrarn

Auteur : George-R-R Martin

Note : 4/5

Quatrième de couverture : Qu’il joute ou qu’il guerroie, le chevalier errant n’a d’autres attaches que celles de son cœur, d’autre code que celui de l’honneur. Il loue ses services aux causes les plus nobles et prend la défense des opprimés. Une ligne de conduite qu’a toujours suivie Ser Arlan de Pennytree, et qu’il s’est efforcé d’inculquer à son écuyer, Dunk. Mais la rencontre de ce dernier avec un garçon étrange, qui se fait appeler l’Œuf, changera à jamais son destin. Un an plus tard, Dunk et l’Œuf, désormais son écuyer, s’engagent au service de Ser Eustace Osgris, un petit seigneur acculé à la défaite par la Veuve Rouge. Leur mission, déjà ardue, va se compliquer du fait des relations qu’entretiennent les deux forces en présence !

…après avoir lu la préquelle de l’Epée de Vérité, je reste dans le ton avec les préludes du Trône de Fer.

Et ce recueil de 2 nouvelles fait plaisir car la suite de la série originelle se fait sacrément attendre… 4 tomes anglais sortis sur 7 prévus et le 5ème attendu pour la fin de l’année… Au mieux… Si on compte la traduction française et le fait que Flammarion à travers sa collection Pygmalion (broché) puis J’ai Lu (poche) ne se gène pas pour découper les tomes anglais en 3 tomes français, je ne suis pas prêt d’avoir la suite entre les mains (le 13ème tome français en somme)… Et moi, je n’en peux plus d’attendre car cette série est tout simplement génialissime.

Bref, c’est avec grand plaisir que j’ai donc attaqué ce prélude relatant deux aventures de Ser Duncan le Grand, alias Dunk, un jeune chevalier errant sans armoiries et de son écuyer Aegon, alias l’Oeuf, âgé d’une dizaine d’année et qui se révèle être, pour les initiés, le frère de Aemon, le vieil mestre aveugle du Mur.

Et mon plaisir ne fut pas gâché le moins du monde! Retrouver le style caractéristique de Martin, à travers deux histoires très sympas, nous plongeant dans le Royaume des Sept Couronnes, à l’époque ou les Targaryen en sont encore maîtres absolus, à de quoi ravir. La première prenant pour cadre un tournoi entre les familières grandes familles : Targaryen, Barathéon, Tyrell, Lannister, … et la seconde nous présentant une brouille territoriale entre Ser Eustace Osgris, auprès duquel Dunk a prêté allégeance pour un temps, et Lady Rohanne Tyssier, surnommée la Veuve Rouge.

J’ai tellement apprécié ces deux nouvelles que je me prends à espérer que la plume de l’auteur nous offre un jour la suite des aventures de Dunk et l’Oeuf… Cet espoir est particulièrement mince au vu de sa cadence d’écriture actuelle mais sait-on jamais!

Pour conclure, à ne surtout pas manquer si vous êtes fan de la série!

Tags: ,

Les mystères d’Osiris, Tome 2 : La conspiration du mal

Posted in Mes lectures on mai 20th, 2009 by Ajrarn

Auteur : Christian Jacq

Note : 2,5/5

Quatrième de couverture : Si Pharaon a soumis les chefs de provinces et réunifié la Basse-Egypte et la Haute-Egypte en nommant Khnoum-Hotep grand Vizir, l’unité du royaume reste fragile. Le pays de Canaan est en effervescence. Les sbires de l’Annonciateur poursuivent leur œuvre de déstabilisation. Le prédicateur compte des disciples au cœur du palais de pharaon. Et cette gangrène du pouvoir touche les plus hauts dignitaires de la cour. L’un après l’autre, Senânkh et Sobek le Protecteur sont soupçonnés. Sésostris lui-même a échappé de peu à plusieurs attentats. Loin de cette agitation, Iker poursuit son éducation dans les meilleures écoles et vient d’être nommé prêtre temporaire d’Anubis. Mais ces honneurs ne comblent pas le jeune scribe qui cherche à connaître les raisons de son enlèvement. Une découverte va bouleverser sa destinée et celle de pharaon…

…je viens de terminer le deuxième tome des mystères d’Osiris de Christian Jacq après l’arbre de vie.

J’avais été déçu du premier opus… et le suis encore du second.

Soyons indulgent : il est meilleur. Beaucoup plus axé, comme son nom l’indique, sur les différentes factions qui complotent contre Sesostris III, il est donc un peu moins inintéressant.

Malgré tout, les critiques que j’ai pu émettre sur le premier tome se retrouvent en grande partie ici : naïf, mielleux et pas franchement crédible.

Attention SPOIL : La suite relate quelques parties du roman

Sesostris se fait attaquer de différentes façons à de nombreuses reprises, mais pas une fois, ces différents enquêteurs et proches ne trouvent une piste digne de ce nom… Ça en devient fatiguant à la longue…

Le héros Iker, qui s’est mis dans la tête avec 3 bouts de preuves (lui qui pourtant possède un pragmatisme et une intelligence à toute épreuve), que Sesostris est à l’origine de tout ces malheurs, décide de supprimer le monarque.

Sa tentative échoue, il se rend compte de ses erreurs et Sesostris en fait… son fils adoptif! Il est sympa Sesostris tout de même! (^_^)
Bon, je suis un peu moqueur… J’avoue ma totale ignorance de l’Histoire égyptienne, mais d’après les rapides recherches “wikipédiesques & co” que j’ai effectué, je n’ai trouvé aucune référence à une adoption de ce genre.

N’hésitez pas à enrichir ma culture personnelle si vous maîtrisez le sujet!

Pour conclure : au-dessus du premier mais loin de passionner.

Tags:

La génération de site avec Maven

Posted in Java/J2EE on mai 18th, 2009 by Ajrarn

Maven offre la fonctionnalité très appréciable de génération automatisée du site web de votre projet Java/J2EE.

Il est de plus en plus fréquent de voir des sites de frameworks, librairies ou projets utilisés cette fonctionnalité comme le propre site de Maven, le site de Struts ou celui de Tapestry. Notez tout de même que ces trois exemples sont des projets Apache.

L’avantage principal de la génération de site par Maven est la possibilité d’utiliser des plugins permettant la génération de rapports liés à votre projet : rapport checkstyle et PMD, mise en ligne automatique de la Javadoc, afficher les sources en ligne, le résultat des tests unitaires, la couverture des tests unitaires de votre code, etc.

Pour commencer, il vous faut donc ajouter ces plugins dans le pom.xml principal de votre projet.

Voici la marche à suivre pour obtenir les rapports checkstyle, la Javadoc, les résultats des tests unitaires avec surefire, la couverture des tests unitaires avec Cobertura et la possibilité de visualiser les sources en ligne avec JXR :

<build>
  <plugins>
  ...
    <plugin>
      <groupId>
        org.codehaus.mojo
      </groupId>
      <artifactId>
        cobertura-maven-plugin
      </artifactId>
      <executions>
        <execution>
          <goals>
            <goal>
              clean
            </goal>
          </goals>
        </execution>
      </executions>
    </plugin>
    ...
  </plugins>
...
</build>
<reporting>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-javadoc-plugin</artifactId>
      <configuration>
        <aggregate>true</aggregate>
      </configuration>
    </plugin>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-checkstyle-plugin</artifactId>
    </plugin>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jxr-plugin</artifactId>
    </plugin>
    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>cobertura-maven-plugin</artifactId>
    </plugin>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-surefire-report-plugin</artifactId>
      <version>2.4.3</version>
    </plugin>
  </plugins>
</reporting>

Lorsque nous exécuterons la commande de génération de code, des pages HTML liées à ces différents rapports seront générées automatiquement.

Mais avant d’en arriver à cette étape, il nous est nécessaire de mettre en place le fichier de configuration et description de notre future site Maven.

Il faut créer un fichier site.xml dans un répertoire src/site/ sur votre projet. Ce fichier va vous permettre de gérer les menus du site et les différentes pages que vous souhaitez mettre en place.

Cette étape n’est pas obligatoire. Il est possible de générer automatiquement un site très simplement en ajoutant quelques informations dans le pom.xml et en profitant de celles que vous avez déjà fournies, mais le résultat est sommaire.

Voici un exemple simple d’un fichier site.xml pour un projet classique :

<?xml version="1.0" encoding="ISO-8859-1"?>
<project name="Nom du projet">
  <publishDate position="none" />
  <version position="none" />
  <body>
    <menu name="Général">
      <item name="Introduction" href="index.html" />
      <item name="Structure du projet" href="structure.html" />
      <item name="Concepts de développement" href="concepts.html" />
      <item name="Evolution du projet" href="evolutions.html" />
    </menu>
    <menu name="Documentation du projet">
      <item name="Informations" href="informations.html" collapse="true">
        <item name="Résumé du projet" href="project-summary.html"/>
        <item name="Equipe du projet" href="team-list.html"/>
        <item name="Dépendances" href="dependencies.html"/>
        <item name="Management des Plugins" href="plugin-management.html"/>
        <item name="Plugins du projet" href="plugins.html"/>
      </item>
      <item name="Rapports" href="rapports.html" collapse="true">
        <item name="JavaDocs" href="apidocs/index.html"/>
        <item name="JavaDocs des Tests" href="testapidocs/index.html"/>
        <item name="Accès aux sources" href="xref/index.html"/>
        <item name="Accès aux sources de tests" href="xref-test/index.html"/>
        <item name="Tests unitaires" href="surefire-report.html"/>
        <item name="Couverture des tests unitaires" href="cobertura/index.html"/>
        <item name="Checkstyle" href="checkstyle.html"/>
      </item>
    </menu>
  </body>
</project>

Dans ce fichier, tous les fichiers HTML liés aux rapports sont générés automatiquement par Maven lors de l’étape de génération du site.

Il reste donc à écrire les pages “internes” comme project_summary.html, par exemple.

Pour se faire, nous allons utiliser le format type wiki APT, proposé par Maven 2 pour une écriture plus simple et plus rapide. Les fichiers APT doivent être positionnés dans le répertoire src/site/apt/ de votre projet. Lors de la génération du site, les fichiers APT sont analysés par Maven, qui génère alors les fichiers HTML correspondant.

Voici en exemple (qui vous resservira peut-être), l’écriture du fichier rapports.apt permettant de pointer sur les différents rapports générés :

    ----------------
    Rapports générés
    ----------------
 
Rapports générés
 
*----+------+
|| Document || Description |
*----+------+
| {{{./apidocs/index.html}JavaDocs}} | Documentation de l'API avec les JavaDocs |
*----+------+
| {{{./testapidocs/index.html}JavaDocs des Tests}} | Documentation de l'API des tests avec les JavaDocs |
*----+------+
| {{{./xref/index.html}Accès aux sources}} | Accéder aux sources du projet au format HTML |
*----+------+
| {{{./xref-test/index.html}Accès aux sources de tests}} | Accéder aux sources de tests du projet au format HTML |
*----+------+
| {{{./surefire-report.html}Tests unitaires}} | Rapport des tests unitaires effectués sur le projet |
*----+------+
| {{{./checkstyle.html}Checkstyle}} | Rapport Checkstyle sur les conventions de codage |
*----+------+

La syntaxe :

*----+------+
|| Cellule titre colonne 1 || Cellule titre colonne 2 |
*----+------+
| cellule1 | cellule2 |
*----+------+
| cellule3 | cellule4 |
*----+------+

permet de décrire une table HTML.

La syntaxe :

{{{./something.html}Something}}

permet de mettre en place un lien HTML.

Pour plus d’informations sur la syntaxe APT, allez ici.

Une fois que vous aurez créé les différentes pages que vous souhaitez voir sur le site web de votre projet, il ne vous reste plus qu’à générer celui-ci.

Pour se faire, rien de plus simple. Rendez-vous à la racine du répertoire de votre projet (ou doit se trouver votre pom.xml normalement) puis lancez la commande :

mvn site


La totalité des pages HTML générées se trouve dans le répertoire /target/site/ du projet.
Il est d’ailleurs conseillé de supprimer complètement ce répertoire avant toute nouvelle génération.
J’ai déjà remarqué la “non-regénération” de pages existantes.

Pour voir le résultat, il ne vous reste plus qu’à lancer, dans votre navigateur, le fichier index.html se trouvant en racine du répertoire /target/site/.

Vous pouvez également préférer la commande :

mvn site:run


qui exécutera la génération du site et le lancera automatiquement sur un serveur Jetty sur localhost:8080.

Pour informations, le port est configurable. Plus d’informations ici.

Tags:

Les Mystères d’Osiris, Tome 1 : L’arbre de vie

Posted in Mes lectures on mai 18th, 2009 by Ajrarn

Auteur : Christian Jacq

Note : 2/5

Quatrième de couverture : Un mal mystérieux ronge le royaume. Au temple d’Abydos, sanctuaire d’Osiris, l’acacia, ” arbre de vie ” qui symbolise le Dieu de la renaissance de l’Egypte, est en train de mourir. Avec lui s’éteint le pouvoir des pharaons : l’autorité du jeune monarque Sésostris III est contestée par les chefs de province. Et jusqu’en son palais de Memphis, des traîtres travaillent dans l’ombre à sa perte. Désemparé, Sésostris ne peut combattre un adversaire invisible. Pourtant, un homme sait quel malheur attend l’Egypte millénaire. C’est lui qui a déchaîné la colère de Seth, dieu maléfique rival d’Osiris. Il se fait appeler l’Annonciateur et soulève les tribus du désert contre Sésostris. Ses disciples annoncent partout le début du règne d’Isefet, puissance du mal. Des nouvelles alarmantes proviennent de Sichem. La lutte entre les forces du bien et du mal vient de commencer.

…je découvre Christian Jacq à travers le premier opus de cette série de 4 tomes.

Pour être franc, je suis assez déçu… J’ai souvent entendu ou lu des critiques qui encensaient cet auteur et le moins que je puisse dire, c’est que pour le moment (1 tome sur 4, il y a encore de l’espoir), la magie n’opère pas…

Durant une grosse première moitié du roman, j’ai eu l’impression de lire Candide. Le jeune héros Iker, qui est le gentil à l’excès, et qui par ailleurs est exceptionnellement doué dans tout ce qu’il fait, passe par toutes les épreuves désagréables possibles… Enlevé, devant être noyé pour un sacrifice au Dieu de la mer, rescapé, resquillé, raquetté, emprisonné, drogué, piégé… et j’en passe. On commence à respirer un peu mieux quand la série des malheurs prend fin…

Un côté mielleux, bien cliché comme il faut, ne relève pas la saveur : pleins de filles superbes aimeraient faire tomber Iker sous leurs charmes mais celui-ci est fou amoureux d’une prêtresse qu’il a vu 2 fois (peut-être 10 minutes en tout), une beauté fatale, qu’il pense ne jamais revoir (et qui bien entendu est tombée également sous son charme alors qu’ils ne se sont même pas adressés la parole).

Bref, ce qui sauve (au moins un peu), ce premier tome, est la description du quotidien des égyptiens de l’époque (sous le règne de Sésostris III, aux alentours de -1850) qui se révèle très intéressante, malgré certaines scènes de rituels qui finissent par devenir rébarbatives.

Sinon, pour finir, à mon sens, ce roman ne répond que peu à la définition de roman historique. En effet, l’utilisation de la magie, les interventions des Dieux sous leurs formes animales sont très présentes et il est difficile de donner caution à tout ça.

Je ne peux que souhaiter que la suite relève le niveau de ce premier tome décevant.

Tags:

L’Epée de vérité - Préquelle : Dette d’Os

Posted in Mes lectures on mai 8th, 2009 by Ajrarn

Auteur : Terry Goodkind

Note : 3.5/5

Quatrième de couverture : Il y a très longtemps, avant la création de la frontière, la guerre faisait rage entre D’Hara et les Contrées du Milieu. Dans ce climat inquiétant, une jeune femme se rendit dans la cité d’Aydindril pour obtenir une audience avec le Premier Sorcier. Elle s’appelait Abby et venait lui demander de sauver les habitants de son village. II s’appelait Zeddicus Zu’l Zorander et sa lutte contre la dangereuse magie de Panis Rahl allait prendre un nouveau tournant…Cette préquelle à L’Épée de Vérité est une édition à tirage limité et comprend une introduction de l’auteur et des illustrations de Keith Parkinson, l’artiste dont les magnifiques peintures ornent les couvertures de toute la série.

…je viens de terminer la préquelle Dette d’Os de la série de romans fantastiques l’Epée de vérité.

Ce prélude est sorti quelques mois avant la sortie prochaine du tome 9 de la série qui en comptera 11.

J’étais un peu inquiet, concernant cet opus, car dans cette série, il y a le meilleur comme le pire…

Finalement, ce fut une découverte plaisante, se déroulant plusieurs dizaines d’années avant le début de l’épopée de Richard et Kahlan.

De fait, nous nous retrouvons durant le conflit opposant les Contrées du Milieu et l’empire d’Haran. Zeddicus Zul’Zorander, alias Zedd est un jeune homme mais possède déjà le titre de Premier Sorcier. Il est opposé à Panis Rahl, seigneur de D’Hara.

L’histoire nous présente la première rencontre entre Zedd et Abigail, alias Abby, la future dame aux ossements, qui vient requérir son aide.

Le terme de cette nouvelle nous dévoile la création de la frontière entre D’Hara et les Contrées du Milieu et nous apporte des éclaircissements sur la future création de Terre d’Ouest, pays de Richard.

Je recommande la lecture de cette préquelle aux fans de la série. C’est court mais il est plaisant de découvrir le passé de l’univers de l’Epée de vérité, à travers certains de ces personnages phares, à une autre période de leur existence.

Tags: ,

Le plugin Maven 2 pour utiliser JAXB-2

Posted in Java/J2EE on mai 7th, 2009 by Ajrarn

…le projet sur lequel je travaille, pour mon client actuel, et sur lequel j’ai mis en place une structure de gestion de projet avec Maven 2, nécessite l’utilisation de JAXB-2.

J’ai ainsi découvert qu’il existait un plugin Maven très simple d’utilisation, permettant de générer les classes Java correspondant aux schémas .xsd automatiquement durant la phase de compilation de Maven.

Avant de rentrer dans le vif du sujet, je précise que j’utilise la dernière version du JDK 1.6 : le 1.6.0_13.

Java 6 propose les APIs JAXB 2.1 dans son rt.jar depuis l’update 4, semble-t-il. Mettez donc à jour votre JDK pour profiter pleinement de JAXB-2.

Pour utiliser JAXB-2 directement avec Maven, il est nécessaire d’ajouter un plugin dédié dans votre fichier pom.xml et de forcer la compilation Java avec une version 1.6.

Voici ce que vous devez ajoutez :

<build>
  <plugins>
  ...
    <plugin>
      <groupId>
        org.jvnet.jaxb2.maven2
      </groupId>
      <artifactId>
        maven-jaxb2-plugin
      </artifactId>
      <executions>
        <execution>
          <goals>
            <goal>
              generate
            </goal>
          </goals>
        </execution>
      </executions>
    </plugin>
    <plugin>
      <inherited>
        true
      </inherited>
      <groupId>
        org.apache.maven.plugins
      </groupId>
      <artifactId>
        maven-compiler-plugin
      </artifactId>
      <configuration>
        <source>
          1.6
        </source>
        <target>
          1.6
        </target>
      </configuration>
    </plugin>
    ...
  </plugins>
...
</build>

Il ne vous reste plus qu’à ajouter vos schémas XML (.xsd) dans le répertoire de ressources src/main/resources et de lancer la phase de compilation Maven, en vous plaçant dans le répertoire de votre projet contenant le pom.xml et en lançant la commande suivante :

mvn compile

ou directement :

mvn install

Vous trouverez les classes résultantes de la génération JAXB-2 dans le répertoire target/generated-sources/xjc.

Si en plus, vous utilisez Eclipse et le plugin M2Eclipse, vous n’avez rien à faire du tout… Les classes sont générées directement lorsque vous enregistrez votre pom.xml.

Magique non?

Pour finir, un petit rappel sur la manière de sérialiser vos objets Java à partir d’un fichier XML avec JAXB.

Je pars du principe qu’un fichier test.xml se trouve dans le classpath du projet et qu’on souhaite sérialiser une classe Toto.

JAXBContext jaxbContext = null;
Toto toto = null;
try {
  jaxbContext = JAXBContext
        .newInstance(Config.class);
  Unmarshaller unMarshaller = jaxbContext
        .createUnmarshaller();
  InputStream is = getClass()
        .getResourceAsStream("/test.xml");
  toto = (Toto) unMarshaller
        .unmarshal(is);
} catch (JAXBException e) {
  //Un petit commentaire
  //Une trace de log
  //La gestion de l'exception
}

Tags: , , , , , ,

Debout les morts

Posted in Mes lectures on mai 7th, 2009 by Ajrarn

Auteur : Fred Vargas

Note : 4.5/5

Quatrième de couverture : Un matin, la cantatrice Sophia Siméonidis découvre, dans son jardin, un arbre qu’elle ne connaît pas. Un hêtre. Qui l’a planté là ? Pourquoi ? Pierre, son mari, n’en a que faire. Mais la cantatrice, elle, s’inquiète, en perd le sommeil, finit par demander à ses voisins, trois jeunes types un peu déjantés, de creuser sous l’arbre, pour voir si… Quelques semaines plus tard, Sophia disparaît tandis qu’on découvre un cadavre calciné. Est-ce le sien ? La police enquête. Les voisins aussi. Sophia, ils l’aimaient bien. L’étrange apparition du hêtre n’en devient que plus énigmatique.

Debout les morts est mon quatrième roman de Fred Vargas après Les jeux de l’Amour et de la mort, L’homme aux cercles bleus et Ceux qui vont mourir te saluent.

Les jeux de l’Amour et de la mort m’a laissé complètement de marbre.

L’homme aux cercles bleus m’a beaucoup plu.

Ceux qui vont mourir te saluent m’a plutôt déçu (ma critique ici).

Mais là, attention, on passe à une vitesse supérieure avec Debout les morts! Ce roman est tout simplement excellent!

La qualité première de Vargas est sa capacité à engendrer des personnages hauts en couleur, qui ne laissent pas indifférents. Là, elle atteint des sommets avec les 3 évangélistes, Saint Marc, Saint Mathieu et Saint Luc (alias Marc, Mathias et Lucien) et le vieux flic pourri Vandoosler.

C’est vraiment un plaisir de découvrir ces personnages atypiques et si bien travaillés, dans une enquête, non moins intéressantes, aux rebondissements nombreux et à la fin très réussie.

Bref, du bon. Du très bon. Ne surtout pas passer à côté!

Tags: ,

Flex et son composant mx:Parallel

Posted in Flex on mai 6th, 2009 by Ajrarn

…je voulais vous parler du composant <mx:Parallel> de Flex.

Pourquoi? Parce que je trouve ça tellement simple et intuitif à utiliser que je trouve que ça mérite qu’on s’y arrête rapidement.

Comme son nom le laisse deviner, ce composant permet de réaliser des actions en parallèle.

Pour faire un exemple simple et rapide de son fonctionnement, je vais voir fournir l’exemple d’une “galerie” d’images qui deviennent moins opaques lorsque vous pointez votre souris dessus et s’agrandissent.

Puis nous réaliserons l’effet inverse lorsque l’image perd le focus de la souris.

J’ai utilisé la balise <mx:Fade> pour réaliser le premier effet, en lui ajoutant des paramètres de durée  et <mx:Resize> pour le second.

Pour que les deux effets se déroulent en même temps, j’ai donc inséré mes deux composants dans un <mw:Parallel> pour les deux exemples (focus de l’image et perte de focus) et ai ajouté les paramètres rollOverEffect et rollOutEffect à mes images.

Un peu de visuel vaut mieux qu’un court discours donc :

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
	layout="absolute"
	themeColor="silver"
	backgroundColor="#FFFFFF"
	paddingTop="5"
	horizontalScrollPolicy="off"
	verticalScrollPolicy="off">
	<mx:Canvas width="640" 
          height="560" 
          horizontalCenter="0">
	  <mx:Image 
	    x="250" 
	    y="30" 
	    source="@Embed(source='assets/flex.jpg')" 
	    width="40" 
	    height="38" 
	    toolTip="Flex" 
	    alpha="0.6" 
	    rollOverEffect="{fadeIn}" 
	    rollOutEffect="{fadeOut}"/>
	  <mx:Image 
	    x="298" 
	    y="30" 
	    source="@Embed(source='assets/air.png')" 
	    width="40" 
	    height="40" 
	    toolTip="Air" 
	    alpha="0.6" 
	    rollOverEffect="{fadeIn}" 
	    rollOutEffect="{fadeOut}"/>
	  <mx:Image 
	    x="346" 
	    y="30" 
	    source="@Embed(source='assets/android.png')" 
	    width="40" 
	    height="40" 
	    toolTip="Android" 
	    alpha="0.6" 
	    rollOverEffect="{fadeIn}" 
	    rollOutEffect="{fadeOut}"/>
	</mx:Canvas>
	<mx:Parallel id="fadeIn" duration="1000">
		<mx:Fade alphaFrom="0.6" alphaTo="1"/>
		<mx:Resize widthTo="50" heightTo="50"/>
	</mx:Parallel>
	<mx:Parallel id="fadeOut" duration="1000">
		<mx:Fade alphaFrom="1" alphaTo="0.6"/>
		<mx:Resize widthTo="40" heightTo="40"/>
	</mx:Parallel>
</mx:Application>

Et voici le résultat.

Plutôt simple et sympa, non?

Tags: