Overblog
Suivre ce blog Administration + Créer mon blog
15 juillet 2014 2 15 /07 /juillet /2014 15:36

Notre démonstration porte sur le transfert de fichiers images, nous devons donc effectuer un détour pour expliquer la technique que nous mettrons sur pied lorsqu'un utilisateur voudra afficher la photographie d'un élève.

Dans cet article, sans nous départir de notre démonstration, nous verrons comment transférer un fichier binaire en pièces jointes au résultat d'une méthode d'un web service. Bien entendu, nous le ferons à l'aide de Apache CXF, et nous nous appuierons sur Yakoliv Framework. En effet, nous utiliserons le mécanisme d'optimisation de transmission d'un message (MTOM: Message Transmission Optimization Mechanism) du W3C, conjointement à la technique d'empaquetage optimisé des données binaires au format XML (XOP :XML-Binary optimized packaging).

Lors de la création du projet dans Yakoliv Gen Tool Assistant, si nous décidons de traiter des transferts de fichiers binaires, après la génération des sources, nous obtiendrons dans notre fichier de configuration de CXF l'entrée ci-dessous:

 

<jaxws:endpoint id="BinaryFilews"
implementorClass="org.yakoliv.binary.handler.impl.BinaryHandlerImpl"
implementor="#BinaryHandlerImpl"
address="/binary">
<jaxws:properties>
<entry key="mtom-enabled" value="true"/>
</jaxws:properties>
</jaxws:endpoint>

 

Nous avons ainsi activé MTOM, et CXF le prendra en compte pendant l'initialisation pour le service déployé à l'adresse /binary.

La classe org.yakoliv.binary.handler.impl.BinaryHandlerImpl entièrement codée et quasiment non modifiable est celle qui nous permettra de transférer nos documents binaires. Oui, ce n'est pas possible qu'un programme imagine ce que nous allons transférer! La logique à appliquer pour savoir quel fichier envoyer est bien à écrire par nous. Il nous suffira de la renseigner dans les méthodes de la classe

org.yakoliv.binary.handler.impl.Handler

Les méthodes doDownload(String binaryId) et doUploadImpl(String id,InputStream is) sont celles qui nous intéressent.

Dans notre cas, nous retrouvons les données binaires de notre base de données, et nous les renvoyons au client. Ces données sont stockées en tant que tableau de bytes (byte[]), donc il nous suffit de retrouver le tuple qui nous intéresse et retourner les données binaires. Notre implémentation de la méthode doDownload est la suivante:

    public BinaryFile doDownload(String binaryId) {
        Photograph photo = new Photograph();
        photo.setStudentCode(binaryId);
        ArrayList<Photograph> list = photographProxy.
                findPhotographsByCriteria(photo);
        if (!Utility.isNullOrEmpty(list)) {
            photo = list.get(0);
            ByteArrayDataSource bads = new ByteArrayDataSource(
                    photo.getImage(), "image/jpeg");
            BinaryFile file = new BinaryFile();
            file.setFileHandler(new DataHandler(bads));
            file.setBinaryId(photo.getStudentCode());
            return file;
        }
        return null;
    }

Bien remarquer la non utilisation des blocs de gestion des exceptions, ce n'est pas un oubli.

La classe ByteArrayDataSource vient de l'archive mail-1.4.1.jar son nom complet est: 

javax.mail.util.ByteArrayDataSource

BinaryFile est une classe de la librairie Yakoliv-cxf-binary.

Dans notre cas, la méthode de téléchargement vers le serveur n'est pas intéressante car la méthode insert... de l'interface IPhotographWSrv suffit!

 

Nous venons ainsi de voir comment profiter du DefaultHandler de Yakoliv pour gagner en temps. Nous continuerons avec l'écriture de notre cleint à l'article suivant. Restez attentifs, à bientôt!

Partager cet article
Repost0
27 juin 2014 5 27 /06 /juin /2014 16:08

===============================================================

    Yakoliv Gen Tool Assistant est désormais disponible sur sourceforge.net à l'adresse

    https://sourceforge.net/projects/yakoliv/

    Veuillez y télécharger la version la plus à jour. Merci.

===============================================================

 

 

Tel que promis à l'article précédent, nous allons développer le serveur pour notre application présentée à cet article: http://yakamyale.over-blog.com/2014/06/le-projet-de-demonstration-de-yakoliv-framework.html

Les fichiers ayant été générés au post précédent (http://yakamyale.over-blog.com/2014/06/creation-du-projet-de-demonstration-dans-yakoliv-gui.html), nous allons utiliser Netbeans pour les assembler.

Commençons par créer la base de données. Précisons que Yakoliv ne produit actuellement des scripts que pour des projets java utilisant le SGBD PostgreSQL. Créons la base de données pour notre application, nous la nommerons 'students'. Nous le ferons manuellement à travers l'interface graphique de pgAdmin.

Nous exploiterons pour ce faire les fichiers '.sql' générés par l'outil. Les scripts générés sont les suivants:

 

 

Mise en place de la partie serveur pour une application basée sur Yakoliv Framework

Pour créer une table, nous devons tenir compte des contraintes d'intégrité référentielles. Ainsi, la table 'School' devra être créée avant la table 'Student' qui à son tour devra être créée avant la table 'Photograph'.

Commençons donc par la table 'School', son script généré est le suivant:

 

Mise en place de la partie serveur pour une application basée sur Yakoliv Framework

Le script de la table 'Student' est présenté ci-dessous:

Mise en place de la partie serveur pour une application basée sur Yakoliv Framework

Puis, celui de la table 'Photograph':

Mise en place de la partie serveur pour une application basée sur Yakoliv Framework

 

Dans l'interface principal de PGAdmin (ci-dessous), après avoir créé notre base de données que nous appellerons 'schools', lançons le gestionnaire de requête SQL, et tour à tour, exécutons les scripts présentés ci-dessus.

Mise en place de la partie serveur pour une application basée sur Yakoliv Framework

Après exécution des trois scripts ci-dessus, nous obtenons notre base de données avec les trois tables telles que présentées ci-dessous:

Mise en place de la partie serveur pour une application basée sur Yakoliv Framework

 

Maintenant, passons à l'étape de la programmation. Nous suivrons le schéma classique.

 

1- Ouvrons NetBeans et créons un premier projet de type Java Class Library. Appelons le 'schoolsdto'.

Copions le contenu du dossier 'src' qui a été créé dans le dossier racine de notre projet, et collons le dans le dossier 'source packages' de notre projet dans NetBeans. Nous obtenons un ensemble de paquetages. Ajoutons à notre classpath les librairies des annotations de Yakoliv (yakoliv-annotations.jar) et des utilitaires de Yakoliv (yakoliv-utils.jar) pour éliminer les erreurs signalées par le compilateur. Ce dernier fichier se trouve dans le dossier 'both', sous dossier du dossier 'ext-lib'. Une fois ce fichier ajouté au classpath, construisons notre projet (clean and build). Nous obtenons ici un fichier '.jar' qui n'est en rien différent du fichier 'schools.jar' que nous avons à la base de notre projet yakoliv. Cependant, il peut nous arriver de vouloir modifier le code produit par yakoliv, par exemple pour la méthode toString qui visiblement n'est pas très commune et utilise le built-in behaviour prévu par le framework qui compare deux éléments (entités) à partir des clés primaires des tables associées.

 

2- Créons un deuxième projet pour les services simples (Java Class Library). Appelons le 'schoolsssrv'

Ouvrons le dossier des services simples.

Copions le contenu du sous-dossier 'java' et collons le dans le dossier 'sources packages' de notre projet. Pour éliminer les erreurs signalées par le compilateur, ajoutons à notre classpath les librairies 'mbouop.jar' et 'schoolsdto.jar' puis construisons notre projet (clean and build).

 

3- Créons un troisième pour le contrat (Java Class Library), et appelons le 'schoolscontract'.

Ouvrons le dossier Contract.

Copions le contenu du sous-dossier 'java' et collons le dans le dossier 'sources packages' de notre projet. Pour éliminer les erreurs signalées par le compilateur, ajoutons à notre classpath la librairie 'schoolsdto.jar' et construisons notre projet.

 

4- Créons un quatrième projet pour les classes métier (Java Class Library). Appelons le 'schoolswsrv'

Ouvrons le dossier des Web Services.

Copions le contenu du sous-dossier 'java' et collons le dans le dossier 'sources packages' de notre projet. Pour éliminer les erreurs signalées par le compilateur, ajoutons à notre classpath les librairies 'schoolsdto.jar', 'schoolscontract.jar' 'schoolsssrv.jar' et 'mbouop.jar', puis construisons notre projet.

 

5- Créons un cinquième projet pour l'exposition de nos web services (Java Web Application). Appelons le 'schoolswebservice'. (JavaEE version: 1.4)

Ouvrons le dossier Web-Inf-Files.

Copions son contenu dans le dossier 'WEB-INF' de notre application. Bien entendu, ne pouvant remplacer le fichier web.xml de l'application créée par le notre, nous devons plutôt remplacer son contenu.

Ajoutons à notre classpath les librairies 'schoolsdto.jar', 'schoolscontract.jar' 'schoolsssrv.jar', 'schoolswsrv.jar' et 'mbouop.jar', puis construisons notre projet.

Maintenant, ajoutons spring et les librairies utiles à Apache CXF. Nous pouvons trouver spring dans NetBeans.

Ajoutons aussi le driver de PostgreSQL et ibatis pour les accès aux données. La version d'ibatis que j'ai toujours utilisée est '2.3.0.677', elle est très stable et ne m'a jamais causé d'ennuis.

Ibatis doit être configuré pour fonctionner, et c'est ce que nous allons faire maintenant.

 

6- Créons un sixième projet pour la configuration d'Ibatis. Appelons le 'schoolsconfig'.

Ouvrons le dossier 'Config',

Copions son contenu dans le dossier 'source packages' de l'application.

Dans le paquetage 'org.yakoliv.mbouop.cfg.mapper', ouvrons le fichier 'SqlMapConfig.properties' et ajoutons les informations manquantes. Si vous avez suivi ce tutoriel jusqu'ici, elles devraient être les suivantes:

driver=org.postgresql.Driver

url=jdbc:postgresql://localhost:5432/schools

user=postgres

pswd=<votre_pass>

Construisons notre projet et ajoutons le fichier 'jar' résultant au classpath de notre projet web.

Construisons notre projet 'schoolswebservice' et déployons le. J'ai utilisé pour cela Tomcat 7.0.42. En réalité, la version n'est pas importante. Même sous glassfish, nous aurions pu le faire, un peu comme nous avons utilisé une version récente de Spring alors que yakoliv avait été monté au moment où Spring était à la version 3.0. Cependant, je n'ai pas encore testé yakoliv avec une version de CXF supérieure à 2.4.1.

 

Tout ceci fait, testons le déploiement de nos services web à l'adresse:

http://localhost:8080/schoolswebservice/

Nous obtenons l'image ci-dessous:

Mise en place de la partie serveur pour une application basée sur Yakoliv Framework

Dans l'article suivant, nous écrirons un client pour ces web services et nous l'utiliserons pour monter une application fenêtrée ayant pour fonctionnalités celles décrites à cette adresse: http://yakamyale.over-blog.com/2014/06/le-projet-de-demonstration-de-yakoliv-framework.html

Bien entendu, nous utiliserons des éléments générés par Yakoliv Gen Tool

Restez scotchés, à bientôt!

Partager cet article
Repost0
14 février 2014 5 14 /02 /février /2014 09:15

Comme promis dans mon dernier article   concernant une introduction à YAKOLIV Gen Tool assistant, nous allons parcourir les dossiers générés par l'outil. Commençons par rappeler l'ensemble des dossiers générés. On peut les lister sur l'image ci-dessous:


dezzipped generated jar

 

1- Le dossier Config

Son contenu est le suivant:


config_folder.jpg


Ce fichier xml contient la configuration du mapping objet-relationnel entre la classe java 'org.yakoliv.exple.Country' et la table 'Country'.

Dans l'article  Exemple simple d'utilisation de Yakoliv Framework, je vous avais présenté son contenu que je ne rappellerai plus ici.

Ce dossier contient aussi les fichiers suivants:


Config_folder_sqlmapConfig.jpg

 

 

Leurs contenus sont statiques et varient très peu, ceux d'entre vous ayant une espérience avec ibatis n'auront même pas à s'en occuper, sauf s'ils veulent être curieux.

Le contenu du fichier SqlMapConfig.xml est le suivant:


sqlmapConfig-copie-1.jpg

 

Et comme vous pouvez le constater à la lecture du contenu de la balise <transactionManager>, ce fichier a besoin d'informations venant d'ailleurs. Ces informations sont recherchées dans le fichier SqlMapConfig.properties dont voici le contenu:


sqlMapConfig_prop.jpg

 

C'est très facile de voir que ce fichier attend des informations pour être complet, tout développeur concerné par cet article devrait savoir quoi faire en le lisant.

Le dossier Config  ayant été présenté, passons au dossier SQL

 

2- Le dossier SQL

Il contient en général les codes SQL de création des tables concernées par le présent projet. Pour ce qui est de ce projet, il ne s'agit que du code de la table 'Country' comme nous pouvons le voir sur la figure ci-dessous:


Country_sql.jpg

 

 

Le contenu de ce fichier est le suivant:


country_sql_code.jpg

 

Il s'agit pour cette table d'un exemple simple de code de création de table. Intéressons nous maintenant au dossier 'Contract'

 

3- Le dossier Contract

Il s'agit de l'ensemble des éléments dont les clients de vos web services auront besoin pour accéder aux services distants. Il s'agit comme le nom l'indique du contrat entre le serveur et le client distants. Pour ce cas précis, il contient deux arborescences:

- Contract\java\org\yakoliv\exple\wsrv\itf

- Contract\java\org\yakoliv\cxf

Commençons par la première arborescence. Le contenu du dossier itf est le suivant:


IcountryWSrv.jpg

 

Le fichier ICountryWSrv.java contient les méthodes nécessaires à la manipulation de la table Country, celles qui seront utilisées pour communiquer avec les services déployés. Son contenu est le suivant:


IcountryWSrv_content.jpg

 

L'on peut choisir de supprimer des méthodes ou d'en ajouter, cela dépend des besoins. La plupart des méthodes présentes ici sont celles connues dans l'article  Exemple simple d'utilisation de Yakoliv Framework et qui étaient alors présentées dans le cadre des services simples d'accès aux données.

 

Passons à présent au contenu du dossier cxf

Il contiendra toujours un fichier, le fichier de configuration de cxf pour les accès distants. Il portera le nom cxf-client.xml

Le contenu du dossier cxf est le suivant:


cxf-client_folder.jpg

 

 

Le contenu de ce fichier décrit la façon dont votre client communiquera avec le serveur, où le trouver, comment communiquer avec lui, etc.

Explorons ce fichier xml:


cxf-client-xml1.jpgcxf-client-xml2.jpg

 

Les habitués de CXF devraient en rire car il est plus que simple. Continuons notre périple, non sans remarquer l'apparition dans ce fichier des éléments configurés dans le fichier xml de description du projet yakoliv. Explorons maintenant le dossier ext-lib.

 

4- Le dossier ext-lib  

Il contient des librairies auxilliaires pour les accès aux données et pour la communication client-serveur. Il est constitué de deux arborescences:

ext-lib\server

Il contient le fichier mbouop.jar qui sera utilisé côté serveur pour accéder aux données. C'est en fait l'adaptateur de DAO, la DAO Générique.


extlib_folder_server.jpg 

-ext-lib\client

Il contient le fichier serviceFinder.jar qui sera utilisé côté client pour initialiser les modules (clients de web services).


extlib_folder_client.jpg

 

C'est tout pour le dossier 'ext-lib', passons au dossier 'Simple Services'.

 

5- Le dossier Simple Services

Il contient des classes et interfaces permettant d'utiliser la DAO générique pour accéder à la base de données. Il est constitué des arborescences ci-dessous:


SimpleServices_sub_folder.jpg

 

- Le sous-dossier itf:

Il contient les différentes interfaces d'accès à la DAO Générique. Dans notre cas, il s'agit du fichier ICountrySSrv présenté dans l'article  Exemple simple d'utilisation de Yakoliv Framework

- Le sous-dossier impl:

Il contient les différentes classes d'implémentation des interfaces sus-cités.

Dans notre cas, il s'agit du fichier CountrySSrvImpl ci-dessous:


countrySSrvImpl.jpg

 

Son contenu est le suivant:


countrySSrvImpl_java1.jpg

countrySSrvImpl_java2.jpg

countrySSrvImpl_java3.jpg

 

6- Le dossier Web Services

Il contient les classes d'implémentation des interfaces du contrat présenté plus haut. Dans notre cas, son contenu est le suivant:


webservices_folder.jpg

 

Le fichier CountryWSImpl contient l'implémentation de l'interface ICountryWSrv présenté dans le dossier Contract ci-dessus.

Son contenu est le suivant:


CountryWSrvImpl_java1.jpg

CountryWSrvImpl_java2.jpg

 

Le code est relativement simple, rien de nouveau pour toute personne ayant lu l'article  Exemple simple d'utilisation de Yakoliv Framework

La notion de proxy dans le code ci-dessus renvoie à la programmation orientée aspect. Yakoliv contient parmi ses modules une entité qui définit des proxy dynamiques pour les logs essentiellement (pour ce qui est du built-in behaviour).

Intéressons nous actuellement au dossier Web-Inf-Files.

 

7- Le dossier Web-Inf-Files

Il contient les fichiers de configuration des services web, de CXF et autres. Son contenu est le suivant:


web-inf-files_folder.jpg

 

Le fichier web.xml a un contenu classique connu de tout développeur ayant flirté avec la programmation web en java. Son contenu est le suivant, il peut être édité si besoin est:


Web_xml.jpg

web_xml2.jpg

 

Le fichier Logic-beans.xml est le fichier contenant les descriptions des classes métier, celles qui contiennent l'implémentation des services à exposer. Dans notre cas, son contenu est le suivant:


logic-beans_xml.jpg

 

Le fichier beans.xml contient la configuration de CXF. Son contenu est le suivant:

beans_xml.jpg

 

ça saute aux yeux à ce niveau que nos webservices ne sont pas sécurisés, mais nous verrons comment le faire dans mes futures publications. Yakoliv génère ces configurations de la sécurité, mais je les ai supprimées dans un but de démonstration, en vue de mettre en exergue la notion de sécurité dans les services web générés.

 

Ouf! Enfin c'est terminé pour ce billet. Dans le prochain article, nous verrons comment exploiter ces fichiers pour construire notre programme client/serveur et le tester.



Partager cet article
Repost0

Présentation

  • : Le blog de YAKAM OLIVIER
  • : Blog de partage d'idées en mathématiques et en programmation avancée JAVA
  • Contact

Recherche

Archives

Mes Sources Favorites