Latest Entries »

This is the end…

kumoe

Eh bien, voilà : l’équipe Kumoe arrive à la fin de la période définie pour la création de ce projet d’interopérabilité Microsoft/Java. Plusieurs semaines de travail, de galères, de nuits blanches, d’avis divergents et, avant tout, de découvertes passionnantes.

Ce projet fut avant tout pour nous l’occasion de travailler sur un projet très complet, regroupant à lui seul différents outils qui vont prendre de plus en plus d’importance au fil des années. Et durant cette période de travail, nous avons pu découvrir ces techniques et les expérimenter avec beaucoup d’intérêt, en dépit d’un planning particulièrement court et chargé.

J’en profite donc, au nom de toute l’équipe, pour annoncer que le code source du projet sera rendu disponible sur ce blog. Vous pourrez donc y trouver tout ce dont ce sur quoi nous avons travaillé durant plus d’un mois, ainsi que les différentes parties du projet que nous avons finalisées dans les derniers jours.

cadeau

Voici donc les liens :

Partie « Silverlight & SDS » : http://kewlshare.com/dl/4e2a295e43e0/KUMOE_MICROSOFT.rar.html

Partie « Java & SQL » : http://kewlshare.com/dl/ee90032947a6/KUMOE_JAVA.rar.html

Les sources concernant la queue de messages seront disponibles avant le jeudi 5 février.

Note : Sur les liens ci-dessus, pour télécharger le code source, il vous suffit de cliquer sur le bouton « Free User ».

Précisions

Durant les derniers mois de travail, nous avons rencontré quelques problèmes pour le déploiement de la solution sur Azure (voir les captures d’écran ci-dessous), mais voici cependant l’adresse où elle se trouvera : http://kumoe.cloudapp.net

erreur-azure1

erreur-azure22

Et voici un petit aperçu de l’allure de l’application de VOD :

vod

Publicités

Modèle Vue Contrôleur – EJB

Dans cet article, nous allons présenter en détail la base de données développée à partir de Microsoft SQL Express 2005, et sur laquelle nous allons travailler à partir de Java.

bd-sql-express

Nous allons ensuite appliquer le concept MVC (Modèle Vue Contrôleur) en utilisant les EJB Session et Entity. Le schéma ci-dessous précise les parties Client et Serveur, dans le cadre d’une procédure d’authentification à partir de l’application Back Office :

client-serveur-ejb-admin1

Deux projets Java sont créés ici : une application de type EntrepriseApplicationClient, et une autre de type EJBModule :

client-serveur

Voici les différentes étapes de l’authentification :

1 – Interface Homme/Machine (partie Vue), avec bouton pour valider l’authentification :

4-fenetrelogin

2 – Utilisation de l’EJB Session avec son interface (partie Contrôleur) :

a) Interface

1-adminremoteclient2

b) Implémentation

2-administrationbean

3 – EJB Entity (partie Modèle)

3-admin

Quand les problèmes s’en mèlent…

Une des phases du développement d’une application réside dans la résolution de problèmes. Même si très peu de développeurs apprécient d’être confrontés à des problèmes et de passer un nombre important d’heures à leur résolution, je considère que l’intérêt d’un projet est proportionnel au nombre de difficultés à surmonter pour le mener à bien. Qui ne s’est pas déjà arraché les cheveux à essayer de comprendre pourquoi ceci ou cela ne fonctionne pas, ou mal ? Mais la satisfaction que l’on ressent lorsqu’enfin on réussi à mettre le doigt sur ce qui ne va pas est bien réelle !

Pour ma part, arriver à surmonter une difficulté me procure le plaisir de m’être dépassé et d’avoir approfondi mes connaissance sur un point précis. De plus, les environnements de développement nous proposent toujours de nouveaux outils pour nous aider dans notre tâche, comme les JUnits ou les Unit Tests en C#. Je ne vais pas ici discuter du réel intérêt de réaliser ces tests car il devient évident pour peu que l’on ait commencé à les faire. Mais malgré ces avancées, il reste toujours des problèmes plus coriaces, ou indépendants de notre volonté.

Il m’est arrivé récemment l’un de ces problèmes avec Windows Azure. Vendredi soir, alors que je faisais des essais avec un web service de gestion de queues de message, j’ai demandé à la plateforme de supprimer un package. Seulement, je ne sais pourquoi mon package est en cours de suppression depuis ce moment. C’est embêtant car je ne peux plus déployer d’autre package pour ce projet. Je ne peux, en fait, plus rien faire. Autre point plus problématique, c’est que le temps d’utilisation de la machine virtuel est décompté. Autrement dit, et puisque je suis limité à 2 000 heures, mon crédit de temps va rapidement être consommé.

Suppression d'un package

Heureusement, ce projet s’effectue en groupe, et j’ai toujours la possibilité de déployer mon package sur un autre compte.

Bien entendu, un problème ne vient jamais seul. Après quelques heures à préparer mon service de gestion de queues Azure, je n’arrive plus à effectuer des requêtes vers mon compte de queues et de tables Azure. Après un peu de temps passé à essayer de comprendre le pourquoi, il s’avère que le service appelé reconnaît le contenu du header « Authorization » comme n’étant pas valide. Ce qui est dérangeant, c’est principalement que ça fonctionnait très bien puis que, sans raison apparente, il m’est impossible de m’authentifier. Alors bon, j’ai effectué de nombreux tests pour palier à ce problème, mais en vain. J’utilise une petite librairie (StorageClient) proposée par Microsoft pour aider à la gestion des Azure Queues et Tables et je me suis dit que le problème pouvait venir de là.

J’ai donc cherché plus avant et décidé de créer « à la main » la requête REST; toujours en vain. Après une journée et une bonne partie de la nuit à essayer de comprendre, j’en ai déduis que la seule possibilité était que le format du header « Authorization » ait été modifié. Pourtant, non seulement je n’en trouve nulle trace, mais ça me semble peu judicieux de la part de Microsoft. Même s’il s’agit d’une CTP (Community Technology Preview), plusieurs projets utilisant des queues ou des tables sont déjà déployés. Une telle modification aurait un impact trop important pour que cela ait eu lieu.

J’en conclu donc que c’est le moment pour moi de faire une petite pause; tout du moins en ce qui concerne cette partie du projet. Je ne désespère pas de comprendre le pourquoi du comment, quand j’aurai pris un peu de recul…

Récemment, j’avais présenté le moyen d’utiliser le protocole REST pour effectuer une requête HTTP de type « PUT » en Java. Ceci était valable pour l’ajout d’un fichier vidéo (de type « .wmv ») sur la plateforme Silverlight Streaming.

Je vais ici présenter deux cas relatifs à la suppression et à la copie d’un fichier vidéo présent sur cette plateforme (le code sera ici en C#).

Copie

Dans notre architecture, lorsqu’un utilisateur souhaitera louer une vidéo, il a été décidé qu’une requête de type « COPY » soit effectuée pour copier le FileSet du fichier vidéo. C’est le lien vers cette copie qui sera ensuite expédié vers l’utilisateur.

On démarre ici avec plusieurs variables principales :

  • L’objet contenant la requête
  • Deux chaînes de caractères contenant respectivement l’emplacement du FileSet et le nom du futur FileSet copié
  • Deux chaînes de caractères contenant respectivement l’identifiant et la clé du compte SLS
  • Une autre chaîne contenant l’adresse du SLS (https://silverlight.services.live.com)

HttpWebRequest _requete;

string _fileName = « C:/Users/GuillaumeGas/Desktop/essaiVideoNumberOne/ »;

string _fileSetName = « copy »;

string _ID, _Key;

string serviceRoot = « https://silverlight.services.live.com/ »;

Dans un premier temps, il va falloir effectuer une authentification, ainsi qu’une recherche de l’emplacement du fichier à copier.

if (_fileSetName != «  » && _fileName != «  ») {

// Récupération du nom du FileSet à copier

FileInfo _fInfo = new FileInfo(_fileName);

string _fileNameOnly = _fInfo.Name;

_requete = (HttpWebRequest)HttpWebRequest.Create(_serviceRoot + _ID + « / » + _fileSetName);

}

// Authentification credentials

_requete.Credentials = new NetworkCredential(_ID, _Key);

// Déclaration de la méthode COPY

_requete.Method = « COPY »;

// Envoi de la réponse

_requete.Headers[« Destination »] = _serviceRoot + _ID + « /copy »;

HttpWebResponse _resp = (HttpWebResponse)_requete.GetResponse();


Au final, on a réussi à copier le FileSet. Notons que la copie s’effectue de façon instantanée.

Suppression

Le principe est le même, à la seule différence qu’on effectue une requête de type DELETE.

Ici, imaginons qu’on souhaite supprimer notre copie précédemment créée :

if (_fileSetName != «  ») {

_requete = (HttpWebRequest)HttpWebRequest.Create(_serviceRoot + _ID + « / » + _fileSetName);

}

On définit alors la requête DELETE :

// Déclaration de la méthode DELETE

_requete.Method = « DELETE »;

// Envoi de la réponse

HttpWebResponse _resp = (HttpWebResponse)_requete.GetResponse();


La suppression de la copie s’effectue alors instantanément.

Concernant l’application « Video On Demand » que nous avons présentée précédemment, nous avons évoqué l’utilisation de la technologie Silverlight Streaming. Ce service, développé par Microsoft, permet aux développeurs de diffuser leurs fichiers vidéos ou leurs applications Silverlight afin de les rendre accessibles à tous. Dans cet article, je vais tâcher de présenter son fonctionnement pour les fichiers vidéo.

Silverlight Streaming nécessite un compte LiveID, et permet un stockage gratuit de streaming de 10 Go maximum. Il faut savoir qu’en cas de dépassement de stockage, il faudra passer par une option payante.

Procédure

Pour uploader un fichier vidéo, la première étape consiste d’abord à récupérer un identifiant (numéro de compte SLS) et une clé. Pour cela, il suffit de s’inscrire sur le site suivant : http://silverlight.live.com.

streaming-id-key

Une fois l’identifiant et la clé récupérés, il est possible d’uploader une vidéo en cliquant sur l’option « Manage Video ». A noter que l’option « Manage Applications » fait de même pour les applications Silverlight.

streaming-uploadvideo-1

L’upload d’un fichier (au format « .wmv », « .avi », « .mpeg », « .mov »…) nécessite l’emplacement du fichier, ainsi qu’un titre. Une fois que le fichier est uploadé, une URL statique est fournie pour accéder au fichier vidéo.

streaming-uploadvideo-2

Procédure avec communication REST

Je vais aborder ici la procédure d’authentification sur Silverlight Streaming par requête REST. Notons qu’il est indispensable pour cela d’avoir les identifiants (Account ID et Account Key).

Le code suivant (en C#) présente la procédure d’authentification (par souci de simplicité, j’ai choisi le mot « foo » en guise d’Account ID) :

streaming-identificationc

Concernant la gestion des vidéos avec REST, nous allons recourir aux requêtes HTTP suivantes :

  • PUT, pour l’ajout d’une vidéo
  • DELETE, pour la suppression d’une vidéo
  • COPY, pour la duplication d’une vidéo

Pour la procédure d’identification (vue ci-dessus) et l’ajout de fichiers sur la plateforme Silverlight Streaming, nous allons nous appuyer sur les librairies du framework Restlet (www.restlet.org). Ses librairies sont directement téléchargeables sur le site, et devront ensuite être implémentées parmi les librairies de l’application Java (Back Office).

Uploader un fichier avec PUT.

A partir de là, nous allons voir comment uploader un fichier sur Silverlight Streaming.

La procédure présentée au sommet de cet article donnait les indications suivantes : il s’agit avant tout de s’identifier sur la plateforme, de donner un nom à sa vidéo (qui correspondera au répertoire qui contiendra la vidéo) et de valider l’upload. Il faut également savoir qu’une fois présente sur le site, la vidéo sera appelée « video.wmv ».

Pour effectuer l’upload de fichier de façon logicielle, nous allons effectuer une requête de type PUT, basée sur les librairies de Restlet, au sein d’une application Java.

Dans un premier temps, il convient de recenser et d’initialiser les données utiles :

phase_11

Ensuite, après avoir initialisé les données, il s’agit de concevoir le répertoire (ou FileSet) qui contiendra la vidéo sur la plateforme. On utilise pour cela la méthode MKCOL. Le code se présente de la façon suivante :

phase_2

Enfin, il ne reste plus qu’à envoyer la requête PUT pour l’upload de la vidéo :

phase_3

De cette façon, il est possible d’uploader facilement une vidéo sur l’interface Silverlight Streaming. Tout ce code sera implémenté dans notre application Back Office et exécuté lorsque l’utilisateur souhaitera uploader une vidéo sur la plateforme Silverlight Streaming.

Par la suite, il va s’agir d’effectuer une requête HTTP avec les méthodes DELETE et COPY.