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

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