IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Format d'échange (XML, JSON...) Java Discussion :

Codage d'un composant Java en code natif (préprocesseur XML).


Sujet :

Format d'échange (XML, JSON...) Java

  1. #1
    Membre actif
    Avatar de epeios
    Homme Profil pro
    Ingénieur logiciel
    Inscrit en
    Août 2003
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur logiciel

    Informations forums :
    Inscription : Août 2003
    Messages : 38
    Billets dans le blog
    2
    Par défaut Codage d'un composant Java en code natif (préprocesseur XML).
    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.

    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>
    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
    <?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>
    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
    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
    On voit que chaque macro été remplacée par son contenu.

    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 !

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Citation Envoyé par epeios Voir le message
    D'une part, de manière générale, proposer des composants JAVA en code natif, est-ce une démarche pertinente ?
    Oui et non...

    C'est sûr que si tu as tout codé en C/C++, il est plus simple de faire un pont JNI plutôt que de tout recodé en Java.

    Maintenant comme tu as pu le remarquer cela entraine plusieurs contraintes, d'où ta "mise en œuvre du composant", alors qu'il suffit d'ajouter un jar pour les librairies natives...

    Remarques il y a moyen de simplifier cela en fournissant les librairies natives précompilé dans le jar, et en les extrayant dynamiquement au chargement...

    Citation Envoyé par epeios Voir le message
    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 ?
    Je n'ai pas regardé ton code... mais je ne vois pas en quoi cela ne pourrait pas être développé en Java.



    a++

Discussions similaires

  1. [JNI] appel d'une méthode java depuis le code natif
    Par myryad dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 19/05/2009, 11h23
  2. traduction automatique d'un code JAVA en code HTML
    Par Lyonnais dans le forum EDI et Outils pour Java
    Réponses: 2
    Dernier message: 31/05/2005, 13h02
  3. Est ce que ça existe une api java pour code barre ?
    Par miloud dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 14/04/2005, 17h20
  4. [JavaComm]Pb avec l'execution d'un code natif sous linux
    Par seb31 dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 02/06/2004, 14h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo