mardi 1 décembre 2009

mySQL / SAXBuilder /Cocoon2 pour interconnecter deux SI ...

Bon, histoire de prendre un peu de recul par rapport à la série de Tuto java sur le jeu d'échec, j'ai en quelque sorte changé de stratégie parce qu'au rythme ou ça avance il me faudra au minimum une vingtaine d'article pour tout expliquer.


Donc, je me suis simplement posé la question ; pourquoi ne pas fournir directement mes sources en leurs ajoutant une documentation de qualité , en tout cas, c'est ce que je suis en train de faire en ce moment et en attendant un dernier article récapitulatif infesté de codes sources ^^ et parsemé de commentaires je vais me permettre de m'étaler un petit peu plus sur un autre travail sur lequel je bosse toujours o-o !

je travaille actuellement dans le cadre de mon projet ECAO au département ASI de l'INSA de Rouen sur un projet d'interconnexion de deux systèmes d'information , celui du département et celui de l'INSA.

Une bonne partie des données utilisées par le département provient du SI de l'INSA , sauf que ces données étaient fournis avant sous format xml. Et que leurs exploitation se faisait à travers un serveur Apache-cocoon2 . Voilà, vous avez sans doute remarquer que cela nous laisse de la marge quand à l'automatisation de cette tache. Je m'explique :p


Ce projet consistait au début à proposer une vue des données utilisée par le département au DSI de l'INSA , et de programmer les pipelines cocoon nécessaires à l'interrogation direct de la base à travers ces mêmes vues , on n'aura donc plus à transiter par du xml statique ! Intéressant , non^^?

Un tel projet nécessite forcement une phase de test, puisqu'il existe une interaction entre plusieurs technologies ( Gestionnaire de base de donnée , programmation et configuration des pipelines...ect),

j'ai du alors avant de commencer à bosser dessus faire plusieurs choix quand aux technologies utilisées, plusieurs recherches sur internet ont été nécessaire et comme après chaque recherche je me pose toujours la même question: mais pourquoi personne n'a jamais pensé à rédiger un et un seul article assez détaillé sur tel ou tel truc pour ne pas qu'on ai toujours à basculer d'un site à un autre rien que pour savoir comment implémenter ceci ou comment utiliser telle ou telle librairie . Et c'est uniquement pour cette raison que j'ai voulu exposer ma démarche à travers cet article.


Pour ce qui est de la phase de test, On doit obligatoirement passer par plusieurs étapes :

L'élaboration de schéma xml et d'une modélisation UML ( il n'y a pas une réelle nécessité de détailler cette partie , puisqu'elle sert surtout à proposer un accès aux données, sauf que nous, pour cette phase de test, nous allons plutôt généré ces données à travers le fichier XML fournis et programmer les pipelines cocoon nécessaires à l'exploitation d'une base et non d'un fichier XML.

Les choix se sont finalement portés sur :
mySQL comme gestionnaire de base de données:
Java, plus particulièrement JDOM comme langage me permettant de parser mon document XML , et d'alimenter ma base.
SQLTransformer et XSP / ESQL afin de tenter deux approches permettant la
programmation de transformateurs sous cocoon2.

Commençons tout d'abord par une problématique assez simple , commet à partir d'un fichier XML , pourra-t-on alimenter une BDD? Une idée^^?


Si je vous dis JDOM ? Ça vous dit quelque chose, JDOM est une librairie java très puissante qui vous permet de parser votre document XML et d'avoir ainsi accès à tout les nœuds sans avoir vraiment à gérer une grosse arborescence , il est aussi possible d'utiliser DOM : mais bon, pour éviter toute la complexité que cela peut engendrer (génération d'une grosse arborescence regroupant tout les nœuds et j'en passe), j'ai plutôt opté pour JDOM.

Vous pouvez télécharger la librairie JDOM en cliquant ici .
Aussi et vue qu'on devra établir un programme java qui se chargera en plus du fait de parser notre document XML de remplir systématique notre BDD , nous devons aussi installer MySQL

je vous propose pour cela de taper dans votre terminal les deux lignes de commande suivantes :


apt-get install mysql-server
apt-get install mysql-client


vous pourrez alors tester votre connexion et créer ainsi une BDD en saisissant ...

mysql -h localhost -u UserName -pPassword


la phase de test se fera bien évidement en local d'ou l'utilisation d'une connexion sous localhost.

Mysqladmin -h localhost -uUsername -pPassword create ma_base


cette derniere ligne de commande vous permet de créer votre base de donnée ma_base.

je vous propose alors le programme java suivant :


import java.io.*;
import org.jdom.*;
import org.jdom.input.*;
import java.util.List;
import java.util.Iterator;
import java.sql.*;


public class remplissageBdd{

private static String pilote="org.gjt.mm.mysql.Driver";
static Document document;
static Element racine;

public static void main(String [] args){
try{
SAXBuilder sxb=new SAXBuilder();
document=sxb.build(new File("fichier.xml"));
}
catch(Exception e){
System.out.println("erreur : "+e);
}
racine=document.getRootElement();
inject();
}
static void inject(){

try{
Class.forName(pilote);
Connection connection=DriverManager.getConnection("jdbc:mysql://localhost/ma_base","root","password");
Statement instruction=connection.createStatement();
String queryTable="create table etudiants(etudiants CHAR(20),classe CHAR(20));";
instruction.executeUpdate(queryTable);

List etudiants=racine.getChildren("etudiant");
Iterator j=ec.iterator();
while(j.hasNext()){

Element element=(Element)j.next();

String id=element.getAttributeValue("id");
String classe=element.getChild('classe').getText();
String query="INSERT INTO etudiants VALUES('"+etudiant+"','"+classe+"'')";
instruction.executeUpdate(query);
}
connection.close();
}
catch(Exception e){
System.out.println("erreur : "+e);
}
}
}


et comme fichier source quoi de plus interessant pour cette premiere phase de teste qu'un simple fichier XML regroupant des nœuds dépendant d'une racine et possédant des attributs : on aura donc à gérer à travers ce petit exemple tout les types de donnée composant un fichier XML,

arbre du fichier xml :
etudiants
------->etudiant(attribute:nom="toto")
-----classe=CM1
------->etudiant(attribute:nom="tata")
-----classe=CM2

testons alors ensemble cette phase de remplissage …


vérifiez juste après l'exécution du programme java que votre table a bien été créé et qu'elle contient tout ce que le fichier XML contenait comme information. Si ce n'ai pas le cas revoyez votre code^^ ...

une remarque par rapport à l'exécution du programme java remplissageBDD


l'exécution de ce fichier nécessite l'utilisation d'un connecteur java à mySQL , je vous propose alors de télécharger le bon connecteur sur ce lien :http://dev.mysql.com/downloads/connector/j/5.1.html

Passons maintenant à la deuxième partie du projet , la plus excitante^^ ! nous disposons maintenant d'une base de données contenant toute les données nécessaires à la génération de nos pages :
comment faire alors pour véhiculer ces donnés et les présenter sous format html .

Cocoon -apache 2 est le serveur par excellence pour ce genre de tache , avant de commencer , je vous conseille d'aller jeter un petit coup d'œil sur le site officiel cocoon-apache.

La transition de ces données sous cocoon se fait à travers des pipelines ; un pipeline ce n'ai ni plus ni moins qu'un chemin programmé, contenant trois modules :un module de génération, un autre de transformation et un dernier qui se charge de la séréalisation et qui permet de modifier les données en fonction de leur usage.


Vous vous posez surement la même question que moi au départ ^^ ,je me disais tout le temps : 'Des serveurs j'en ai vu tellement , de toutes sortes en tout cas en partant d'IIS jusqu'au Jboss, Tomcat, apache et compagnie..mais à aucun moment je n'ai eu affaire à un pipeline ou un truc du genre

c'est quoi donc finalement cette histoire de pipeline? Ne vous inquiétez pas aussitôt cette phase de test fini vous y verrez beaucoup plus clair pour tout ce qui concerne cocoon et ses pipelines ^^

ajoutez entre deux blocs 'pipeline' un bloc 'map:match' contenant une generateur 'map:generate' un transformateur 'map:transfort' et un séréaliseur 'map:serealize' ...

Le premier blocs sert à définir l'url qui pointera directement vers votre pipeline.
Les générateurs et les transformateur auront besoin comme source d'un fichier; un fichier de base. xml par exemple pour la génération et xslt comme fichier de transformation.

Par contre on aura surtout besoin lors de la serialisation de définir un type. Un format de sortie; xml ou html par exemple.

Pour configurer de pipeline je vous conseille fortement d'aller voir du coté du site officiel apache-coccon 2 , vous y trouverez plusieurs exemples .

J'ai du dans mon cas, définir une connexion à ma base dans mon cocoon.xconf et faire référence à ma connexion en ajoutant à mon transformateur un paramètre nommé use-connexion et qui pointe sur la connexion préalablement établie.

Attention , plusieurs approches restent possible. J'en ai testé deux : une en utilisant SQLTransformer et une autre sur la base d'un fichier xsp ...je ne vous cache pas que ma préférence va plutôt vers xsp . XSP vous laisse beaucoup de marge quand à votre présentation … tout est inclus dedans ^^ au grand bonheur des cocooniens :)

Enfin et pour finir, je vous propose d'aller faire un petit tour sur le site coocon plus spécialement sur ce lien : http://www.nongnu.org/sdx/docs/html/doc-sdx2/fr/reference/xsp.html

Aucun commentaire:

Enregistrer un commentaire