Développez à la mode J2EE en utilisant .NET avec le SnippetStore  (Chapitre III) par Julien Brunet (j.brunet@cross-systems.com)

Chapitre 3/3
Impression papier : environ 8 pages
Version 1.1

Conversion de Java PetStore sur .NET

Ce chapitre décrit le portage de Java PetStore en .NET utilisant le framework SnippetStore.

- Si vous êtes arrivé ici par erreur, vous pouvez reprendre au chapitre 1.
- Si vous n'avez pas encore assemblé le framework SnippetStore, vous pouvez aller au chapitre 2 et réaliser les labs 1 à 8 sans lire les explications détaillées.

 

Avant de commencer

Préparation des labs (suite)

Lab 9. Préparation de la conversion Java PetStore

- Ouvrez un Command Prompt dans C:\SnippetStore
- Exécutez setenv.cmd dans ce Command Prompt
- Conservez le Command Prompt ouvert pendant toute la durée des labs

 

Préparation de l'environnement ASP.NET

Lab 10. Préparation de l'environnement ASP.NET pour Java PetStore

C:\SnippetStore> nant jps-reset

Cette target NAnt :
- recopie les ressources Web dans le répertoire out de l'application ASP.NET (C:\SnippetStore\samples\jps1.1.2\out)
- crée/remplace les fichiers global.asax et global.asax.jsl contenant l'initialisation du conteneur Web
- crée/remplace le fichier Web.Config du répertoire out avec des valeurs pré-paramétrées (connections MSDE, etc...)
- recopie les assemblies requises du framework SnippetStore dans le répertoire out\bin de l'application ASP.NET.

 

Compilation de la toolkit SnippetStore

Nous avons beaucoup parlé de la toolkit, mais elle n'est toujours pas compilée !

Lab 11. Compilation de la toolkit SnippetStore

C:\SnippetStore> nant SnippetStore.Design
C:\SnippetStore> nant SnippetStore.Design.NAntTasks
C:\SnippetStore> nant SnippetStore.Tracer

Cette target NAnt :
- Compile la toolkit de conversion EJB/Servlets/TagLib/JSP en C#
- Compile la couche d'extension NAnt
- Compile le traceur visuel de SnippetStore

 

Conversion de la partie Components de Java PetStore

La partie Components de Java PetStore est située dans le répertoire C:\SnippetStore\samples\jps1.1.2\src\components. Elle contient notamment 9 EJBs, et plusieurs classes d'accès aux données (DAO).

 

Compilation J#

Lab 12. Compilation J# de la partie Components de Java PetStore

C:\SnippetStore> nant jps-comp-1

Cette target NAnt compile les sources Java en utilisant le compilateur J# (vjc.exe)

Elle produit l'assembly components.dll dans le répertoire out

 

Génération des wrappers

Lab 13. Génération des wrappers pour la partie Components de Java PetStore

C:\SnippetStore> nant jps-comp-2

Cette target NAnt :
- charge dynamiquement la couche d'extension NAnt de la toolkit SnippetStore
- invoque la tâche de conversion EJB <ejbimp> en lui indiquant notamment le manifeste XML d'entrée et le fichier Web.config de sortie

Elle produit le code source C# AL_ejb.cs dans le répertoire src et enrichit le fichier Web.config

 

Compilation des wrappers

Lab 14. Compilation des wrappers pour la partie Components de Java PetStore

C:\SnippetStore> nant jps-comp-3

Cette target NAnt compile les sources générés des wrappers en utilisant le compilateur C# (csc.exe)

Elle produit l'assembly components.AL.dll dans le répertoire out

 

Conversion de la partie Web de Java PetStore

La partie Web de Java PetStore est située dans le répertoire C:\SnippetStore\samples\jps1.1.2\src\petstore. Elle contient notamment 1 EJB, 2 Servlets, 1 TagLibs d'environ 10 tags, plusieurs classes Java pour gérer le modèle MVC, et environ 75 pages JSP.

 

Modifications préliminaires du code Java PetStore

Des modifications manuelles doivent être apportées au code Java PetStore avant compilation, essentiellement à cause des lacunes de J# expliquées dans le chapitre 2.

Problème Action Emplacement(s)
1) Le ClassLoader de J# renvoie null Utiliser le wrapper LAME pour simuler ClassLoader com\sun\j2ee\blueprints\petstore\control\web\MainServlet.java
(line 78)
new LAME.ClassLoader()

com\sun\j2ee\blueprints\petstore\control\web\RequestProcessor.java
(line 105)
idem

com\sun\j2ee\blueprints\petstore\control\web\ScreenFlowManager.java
(line 141)
idem
 
2.a) Affichage incorrect de la page cart.aspx Modifier le nom du champ HTML input itemQuantity_ par itemQuantity(espace) com\sun\j2ee\blueprints\petstore\control\web\handlers\CartHandler.java
(line 48)
remplacer par "itemQuantity "
(line 51) idem
3) Un opérateur est apparu dans le J2SE 1.2 Utiliser le wrapper LAME pour transformer le vecteur en collection
 
com\sun\j2ee\blueprints\petstore\taglib\list\SearchListTag.java
(line 41)
new LAME.Vector2Collection( JSPUtil.parseKeywords(...) )
Lab 15. Corrections manuelles de la partie Web de Java PetStore

- Appliquez les correctifs mentionnés ci-dessus

 

Compilation J#

Lab 16. Compilation J# de la partie Web de Java PetStore

C:\SnippetStore> nant jps-estore-1

Cette target NAnt compile les sources Java en utilisant le compilateur J# (vjc.exe)

Elle produit l'assembly estore.dll dans le répertoire out

 

Génération des wrappers

Lab 17. Génération des wrappers pour la partie Web de Java PetStore

C:\SnippetStore> nant jps-estore-2

Cette target NAnt :
- charge dynamiquement la couche d'extension NAnt de la toolkit SnippetStore
- invoque les tâches de conversion EJB <ejbimp>, TagLib <taglibimp> et Servlet <webappimp> en leur indiquant notamment les manifestes XML d'entrée et le fichier Web.Config de sortie

Elle produit les code source C# AL_ejb.cs, AL_TagLib.cs et AL_WebApp.cs dans le répertoire src et enrichit le fichier Web.config

 

Compilation des wrappers

Lab 18. Compilation des wrappers pour la partie Web de Java PetStore

C:\SnippetStore> nant jps-estore-3

Cette target NAnt compile les sources générés des wrappers en utilisant le compilateur C# (csc.exe)

Elle produit l'assembly estore.AL.dll dans le répertoire out

 

Conversion JSP->ASP.NET

Lab 19. Conversion JSP->ASP.NET

C:\SnippetStore> nant jps-estore-4

Cette target NAnt transforme les pages JSP en pages ASP.NET. Les fichiers JSP d'origine ne sont pas modifiés.

Elle produit des fichiers .aspx dans le répertoire out

 

Correctifs manuels de conversion JSP->ASP.NET

Des modifications manuelles doivent être apportées au code JSP de Java PetStore avant exécution.

Problème Action Emplacement(s)
4) La version Japonaise n'est pas supportée Supprimer la référence dans le fichier requestmappings.xml WEB-INF\xml\requestmappings.xml
(line 5)
supprimer ou commenter la ligne "<screen-definition ... language="ja_JP"/>
5) Les pages devraient être des fragments JSP Renommer les fichiers avec l'extension .jspf mylist.jsp
renommer en mylist.jspf

sideindex.jsp
renommer en sideindex.jspf

splash.jsp
renommer en splash.jspf

changeaddressform.jsp
renommer en changeaddressform.jspf

changepreferencesform.jsp
renommer en changepreferencesform.jspf
 
6) Références de pages incorrectes Référencer les nouvelles pages que vous avez renommées annotated-index.html
(line 7)
remplacer par ann_overview_j2ee.aspx

index.aspx
(line 15)
remplacer par sideindex.jspf
(line 18) remplacer par splash.jspf

cart.aspx
(line 28)
remplacer par mylist.jspf

enteruserdata.aspx
(line 183)
remplacer par changeaddressform.jspf

editaccount.aspx
(line 62)
remplacer par changeaddressform.jspf
(line 67) remplacer par changepreferencesform.jspf
 
7) Les balises serveur ne peuvent pas contenir des constructions <% ... %> Donner un ID au WebControl à chaque WebControl problématique et déclarer un script Page_Load() productcategory.aspx
(line 14)
déclarer un script Page_Load()

product.aspx
(line 28)
déclarer un script Page_Load()

search.aspx
(line 14)
déclarer un script Page_Load()
 

exemple:
<script runat="server">
void Page_Load(Object Sender, System.EventArgs e)
{
((productList)FindControl("productList")).set_category(request.getParameter("category_id"));
}
</script>
 

8) Scope de bloc inférieur en ASP.NET Modifier les blocs <% ...%> par <script runat=server>...</script> product.aspx
(line 33)
Name 'product' is not defined in current context
remplacer le bloc <% ... %> par <script runat="server">...</script>
9) Exceptions non checkées par le CodeDom ASP.NET Modifier les blocs <%=...%> par <script runat=server> try { ... } catch (Exception e) {} </script> populate_install.aspx
(line 30)
VJS1237: Exception 'java.io.IOException' is not caught and does not appear in throws clause
remplacer le bloc

petfooter.aspx
(line 34)
VJS1237: Exception 'com.sun.j2ee.blueprints.personalization.profilemgr.exceptions.ProfileMgrAppException' is not caught and does not appear in throws clause
remplacer le bloc
 
2.b) Affichage incorrect de la page cart.aspx Modifier le nom du champ HTML input itemQuantity_ par itemQuantity(espace) mylist.jspf
(line 14)
ajouter l'attribut runat="server"
(line 26) idem
(line 47) idem
(line 42) idem

(line 28-30) remplacer par
<a href="product?product_id=<j2ee:productAttribute runat="server" attribute="id"/>" ><j2ee:productAttribute runat="server" />
</a> (<j2ee:productAttribute runat="server" attribute="id"/>)

(line 62) remplacer par
<input name="itemQuantity <j2ee:cartAttribute runat="server" attribute="itemid"/>"
 
Lab 20. Corrections manuelles de conversion JSP->ASP.NET

- Appliquez les correctifs mentionnés ci-dessus

Création de la base de données MSDE

Initiative très heureuse de la part de Sun, l'application Java PetStore n'a besoin que d'une base vide pour démarrer. Elle commence par vérifier l'existence de tables du schéma, et vous propose de les créer à la volée, directement depuis l'interface Web.

Création de la base de données MSDE

Pour créer une base MSDE, pas besoin des outils clients de SQL Server tels que Enterprise Manager. ASP.NET Web Matrix vous permet très facilement de créer une nouvelle base de données.

Lab 21. Création de la base de données MSDE

- Assurez-vous que votre instance MSDE est configurée et qu'elle s'exécute
- Dans ASP.NET WebMatrix, cadre "WorkSpace", onglet "Database", cliquez sur l'icône "New Connection"
- Dans la boite de dialogue "Connect to Database", cliquez sur le lien "Create a new database"
- Entrez ESTOREDB comme nom de base de données et validez

 

Modification du script de création de schéma pour MSDE

Java PetStore tournant indifféremment sur des bases Oracle, Sybase et Clouscape, trois scripts de génération de schéma sont fournis. Nous nous interesserons au script Sybase, car il est techniquement le plus proche de SQL Server. Pour autant, il faut le modifier pour qu'il soit compris intégralement par notre pont JDBC/ADO.NET

Lab 22. Modification du script de création de schéma pour MSDE

- Editez le fichier C:\SnippetStore\samples\jps1.1.2\out\WEB-INF\sql\Sybase.sql
- Supprimez toutes les commandes DROP
- Enregistrez le fichier

 

Exécution de Java PetStore sur .NET

Lancement du traceur visuel SnippetStore

Les applications basées sur le framework SnippetStore tournant sous Cassini, comment afficher une trace de déboguage ?

Lab 23. Lancement du traceur visuel SnippetStore

- Lancez C:\SnippetStore\bin\SnippetStore.Tracer.exe

 

Lancement de Cassini avec l'application ASP.NET générée

Cassini est un mini-serveur Web limité aux appels locaux (sauf si vous le "débridez" :-)), faisant office de conteneur ASP.NET. Contrairement à IIS (Internet Information Services), il transmet toutes les requêtes Web au moteur ASP.NET, tandis que IIS fait un premier filtrage sur la base d'extensions de fichiers. Problème, les extensions de fichiers n'existent pas dans Java PetStore puisqu'elle est controllée par des servlets (/populate/... et /control/...)

Pour lancer un serveur Cassini, il faut fournir la racine virtuelle, le port HTTP et le chemin physique de l'application

Lab 24. Lancement de Cassini avec l'application ASP.NET générée
note: La variable d'environnement %Cassini% est supposée désigner son répertoire d'installation

C:\SnippetStore> %Cassini%\WebServer" /port:8080 /path:C:\SnippetStore\samples\jps1.1.2\out /vpath:/estore

 

Lancement de l'application ASP.NET générée

D'avance, ne soyez pas déçus si ça ne marche pas du premier coup, vous n'avez peut-être pas appliqué tous les correctifs manuels cités dans ce chapitre. Les correctifs JSP peuvent se faire au fil de l'exécution de l'application, puisque les pages ASP.NET sont rechargées dynamiquement comme leurs homologues J2EE.

Lab 25. Lancement de l'application ASP.NET générée

- Démarrez Internet Explorer (ou votre navigateur favori)
- Ouvrez l'adresse http://localhost:8080/estore/index.html
- Cliquez sur le lien "Enter the store". Le Traceur visuel SnippetStore doit commencer a afficher quelques lignes

 

Conclusion

C'est un peu pressé par le temps que je dois conclure ce dossier qui m'a passionné... J'espère que vous y aurez trouvé, quelle que soit votre "religion", une comparaison honnête des deux plateformes techniques. Personnellement, je ne revendique qu'une culture .NET, mais cette expérience fut un formidable tremplin pour approfondir la plateforme J2EE.

Les sources de SnippetStore seront téléchargeables sur SourceForge dans la journée.

 


Auteur : Julien Brunet

Bio: Entré chez Cross Systems en 1998 en qualité de consultant, Julien Brunet intervient auprès des grands comptes sur l'accompagnement à la définition et la mise en place d'architectures logicielles.

Mention légale : Les propos tenus n'engagent que son auteur et ne reflètent pas les méthodologies et autres pratiques de Cross Systems.

Merci à Charline, Hans, Laurent, Gilles et Sami pour leur soutien !

Copyright © Juin 2003

Ressources

Site officiel SnippetStore : http://snippetstore.sourceforge.net/

Téléchargez les sources et les binaires

SnippetStore (Sources) : Snippetstore (Fichier zip)

Licence GPL

Tous fichiers sont fournis sous la licence Lesser-GPL.