Bonjour à tous !
J'envisage de mettre à disposition, sous forme de composant JAVA, un outil consistant en un préprocesseur XML (en gros, ça permet de transformer un fichier XML en un autre fichier XML grâce à des directives incluses directement dans le fichier source ; plus de détails plus loin dans ce message). L'outil en question étant codé en C/C++, le composant sera donc en code natif.
J'ai fait du développement JAVA, mais c’était il y a longtemps (bien avant la création de ce forum). Les choses ont dû quelque peu évoluer entre temps, je pense, d'où ce message, dans ce forum dédié à JAVA, pour avoir votre avis concernant ce composant autant sur le fond que sur la forme.
Ce composant est diffusé sous licence GNU GPL. Les sources sont visibles à l'adresse http://savannah.nongnu.org/cgi-bin/v...os/tools/expp/, et, pour ceux qui veulent aller plus loin, tout ce qui est nécessaire à la mise en œuvre de ce composant se trouve dans un package situé à l'adresse http://zeusw.org/download/expp/ (suivre le lien le plus récent). Une page (en anglais) dédiée au préprocesseur XML en général se trouve à l'adresse http://zeusw.org/intl/expp.
Concernant la forme, ce qui m'intéresse sont les modifications à apporter au composant pour qu'il soit conforme aux conventions en usage. Je pense que la gestion d'erreurs est également perfectible.
Quant au fond, plusieurs points m’intéressent. D'une part, de manière générale, proposer des composants JAVA en code natif, est-ce une démarche pertinente ? Et, d'autre part, pour ceux qui s'intéresseront au composant proprement dit, qu'en pensez-vous ? Vous semble-t-il intéressant ? Existe-t-il déjà quelque chose de similaire ? Est-ce qu'un tel composant aurait facilement pu être développé en pur JAVA, rendant éventuellement une version en code natif moins intéressante ?
Au-delà de ces questions, tous commentaires/observations/suggestions sont, bien entendu, les bienvenus.
Le composant JAVA
Le composant implémentant le préprocesseur XML fait partie d'un package nommé 'org.zeusw', et porte le nom de 'XPPInputStream'. Il prend en entrée un 'InputStream' censé fournir des données au format XML, dans lequelles sont encapsulés les directives propres au préprocesseur. De ce fait, ce composant, comme sont nom l'indique, est un 'InputStream'.
Typiquement, ce composant est censé s'intercaler entre un parser XML et l'InputStream' qu'il prend en entrée, comme c'est le cas dans la classe 'XMLPreprocessorDemo' fournie à titre d'exemple dans les liens donnés plus haut.
Le préprocesseur XML
Le préprocesseur XML traite des balises XML appartenant à un 'namespace' dédié (par défaut, 'xpp'). Ces directives permettent (entre autres) de manipuler des macros, d'inclure des fichiers, ou encore de gérer des variables. Ce préprocesseur XML est très utile lorsque l'on écrit à la main des fichiers XML. Personnellement, cela me simplifie énormément l'écriture des fichiers de configuration de mes logiciels.
A titre d'exemple, dans le package dont le lien est fournit ci-dessus, la classe 'XMLPreprocessorDemo' traite un fichier nommé 'Contacts.xml' (situé à la racine du package) dont le contenu est le suivant.
Ce fichier contient un certain nombre de contacts, dont plusieurs habitent dans la même ville. Les données de leur ville respective sont stockées dans des macros définies dans une fichier nommé 'villes.xml' et inclus dans le fichier ci-dessus par la directive '<xpp:expand href="villes.xml"/>'. Ce fichier 'villes.xml' (également situé à la racine du package) a le contenu suivant.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 <?xml version = "1.0"?> <Contacts xmlns:xpp="http://zeusw.org/epeios/xpp"> <xpp:expand href="villes.xml"/> <Contact> <Nom>DUPONT</Nom> <Prenom>Marcel</Prenom> <xpp:expand select="Strasbourg"/> </Contact> <Contact> <Nom>SCHMIDT</Nom> <Prenom>Antigone</Prenom> <xpp:expand select="Paris"/> </Contact> <Contact> <Nom>HADDOCK</Nom> <Prenom>Archibald</Prenom> <xpp:expand select="Moulinsart"/> </Contact> <Contact> <Nom>DUPOND</Nom> <Prenom>Frederique</Prenom> <xpp:expand select="Strasbourg"/> </Contact> <Contact> <Nom>TOURNESOL</Nom> <Prenom>Tryphon</Prenom> <xpp:expand select="Moulinsart"/> </Contact> </Contacts>
Au fnal, le programme de démonstration affiche :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 <?xml version = "1.0"?> <xpp:bloc xmlns:xpp="http://zeusw.org/epeios/xpp"> <xpp:define name="Strasbourg"> <xpp:bloc> <Ville>Strasbourg</Ville> <Code>67000</Code> <Pays>France</Pays> </xpp:bloc> </xpp:define> <xpp:define name="Paris"> <xpp:bloc> <Ville>Paris</Ville> <Code>75000</Code> <Pays>France</Pays> </xpp:bloc> </xpp:define> <xpp:define name="Moulinsart"> <xpp:bloc> <Ville>Moulinsart</Ville> <Code>1234</Code> <Pays>Belgique</Pays> </xpp:bloc> </xpp:define> </xpp:bloc>
On voit que chaque macro été remplacée par son contenu.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 Contacts Contact Nom : DUPONT Prenom : Marcel Ville : Strasbourg Code : 67000 Pays : France Contact Nom : SCHMIDT Prenom : Antigone Ville : Paris Code : 75000 Pays : France Contact Nom : HADDOCK Prenom : Archibald Ville : Moulinsart Code : 1234 Pays : Belgique Contact Nom : DUPOND Prenom : Frederique Ville : Strasbourg Code : 67000 Pays : France Contact Nom : TOURNESOL Prenom : Tryphon Ville : Moulinsart Code : 1234 Pays : Belgique
Remarquez que les données ne proviennent pas directement du préprocesseur, mais d'un parser XML qui prend en entrée les données issues du préprocesseur (adaptation d'un exemple récupéré sur le net).
Pour avoir une documentation plus complète sur le préprocesseur XML, voir la page dont le lien est donnée au début de ce message.
Mise en œuvre du composant
N'ayant accès que sporadiquement à un OS 64 bits, le préprocesseur XML ne fonctionne actuellement qu'en mode 32 bits. Ce qui implique que la JVM doit être lancée en mode 32 bits également (c’est-à-dire avec l'option '-d32'). En outre, si vous désirez compiler le composant, cela doit être fait, ainsi que l'édition de lien, en mode 32 bits. (c'est-à-dire, pour 'g++', avec l'option '-m32').
La version Windows du composant ('jexpp.dll') est fournie avec le package. Pour la version Linux et MacOS, il vous faudra le compiler. Pour cela, il faut placer dans la variable d'environnement 'JDK' le répertoire racine du JDK ('export JDK=<chemin-vers-jdk>'). Pour Linux, ça ressemble à '/usr/lib/jvm/java...openjdk', et sous MacOS à '/Library/Java/Home'. Dans tout les cas, ce répertoire est celui contenant un répertoire 'include', lui-même contenant un fichier 'jni.h'.
Ensuite, placez-vous dans le répertoire 'JAVA' du package, et lancez la commande 'make' (en supposant bien sûr que vous avez 'make' et 'g++' déjà installés). Cette procédure fonctionne également avec Cygwin sous Windows, sauf que, inexplicablement, la bibliothèque générée de cette manière ne fonctionne pas (c'est en cours d'investigation). Cependant, comme déjà signalé, la version Windows du composant est fournie avec le package.
Sous Windows, le nom du composant est 'jexpp.dll', sous Linux 'libjexpp.so' et sous MacOS 'libjexpp.jnilib'.
En outre, il fait vous assurer que le composant est visible de la JVM, soit en utilisant l'option '-Djava.library.path=<chemin-vers-la-bibliothèque-jexpp>', soit en mettant à jour la variable d'environnement appropriée ('PATH' sous Windows, 'LD_LIBRARY_PATH' sous Linux, ou 'DYLD_LIBRARY_PATH' sous MacOS).
La classe à compiler/lancer pour voir le composant à l’œuvre s'appelle 'XMLPreprocessorDemo' et se situe dans le répertoire 'JAVA' du package.
Désolé d'avoir été aussi long et merci pour votre attention !
Partager