Actualités

[22/05/2017] Des Smiliens récompensés lors du Hackathon Carrefour !

Notre équipe, composée en partie de Smiliens, a remporté le Prix du Code et celui de l'Incubation lors du Hackathon Carrefour, organisé ce week-end à Paris !

[18/05/2017] OpenShift, le nouveau livre blanc Smile !

Smile publie aujourd'hui un livre blanc dédié à OpenShift, le PaaS open source orienté DevOps. A télécharger dès maintenant !

[15/05/2017] Smile décroche le label HappyAtWork 2017 !

Pour la 2ème année consécutive, Smile obtient le label HappyAtWork for Starters qui récompense les entreprises où il fait bon débuter sa carrière !

Toutes les actualités picto
       

Vous avez besoin de mettre à jour votre Lecteur Flash Flash 7

Guillemet ouvrant l'actualité des solutions
et des technologies open source Guillemet fermant
picto

Faire tourner GWT sur un environnement .NET, qui a dit impossible ? (Partie 1)

Dans un précédent article, nous avons expérimenté IKVM et vérifié qu'il était possible de compiler et d'exécuter des applications Java utilisant Spring et Hibernate à l'aide d'IKVM. Il est donc possible de tirer le meilleur parti de chacune des deux technologies et de créer des applications mixant les deux.

Pour lire ce billet de blog, cliquez ici.

Cette fois-ci, nous avons décidé d'aller beaucoup plus loin et de nous attaquer à GWT en faisant tourner une application exemple GWT sur un environnement Microsoft Windows dans IIS.
Le problème est plus complexe : une application GWT est une application prévue pour fonctionner dans un conteneur de servlet, or il n'existe bien entendu pas d'implémentation de l'API Servlet en .NET, l'idée est donc d'en créer une implémentation partielle (uniquement les classes nécessaires à GWT) en faisant une correspondance entre cette API et son équivalent dans le framework .NET System.web. En quelque sorte un « bridge » entre la servlet-api et le framework .NET.

Configurations machines utilisées

  • Développement sur une machine hôte Ubuntu (10.10) avec :

- Eclipse (Helios),
- Le plugin GWT pour Eclipse.

  • Déploiement sur une machine virtuelle windows (XP SP3) avec :

- Le Framework Microsoft.NET (2.0.50727),

- Un serveur IIS (5.1).

- IKVM (0.44.0.5) installé

L'application GWT

L'intérêt du projet étant le déploiement de l'application et non l'application elle-même, nous avons utilisé l'application « HelloWorld » fournie par le plugin GWT pour Eclipse.

Voici à quoi doit ressembler cette application :

Techniquement cette application a la même structure que toute autre application web java :

  • des contenus statiques html, css, images
  • des librairies (fichiers *.jar)
  • un fichier web.xml décrivant l'unique servlet de l'application

Fichier web.xml :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
    <!-- Servlets -->
    <servlet>
        <servlet-name>greetServlet</servlet-name>
        <servlet-class>com.gwt.test.server.GreetingServiceImpl</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>greetServlet</servlet-name>
        <url-pattern>/gwttest/greet</url-pattern>
    </servlet-mapping>
    <!-- Default page to serve -->
    <welcome-file-list>
        <welcome-file>GWTTest.html</welcome-file>
    </welcome-file-list>
</web-app>
  • Les contenus statiques pourront sans difficulté être servis par IIS
  • Les librairies pourront être compilées à l'aide de IKVM sous la forme d'une dll
  • La difficulté principale est donc de faire tourner la servlet dans IIS. Pour cela il faut créer un gestionnaire HTTP (HTTP Handler) permettant d'interagir avec les services de traitement de demandes et de réponses du serveur Web IIS. Il nous faudra ainsi implémenter l'interface IHTTPHandler fournie par le Framework .NET.

Cette interface IHTTPHandler est définie dans la librairie System.Web.dll. Pour utiliser cette librairie .NET dans notre application GWT, nous allons nous servir de l'utilitaire ikvmstub.exe. Grâce à lui nous allons générer une archive JAVA (jar) à partir de la librairie System.Web.dll. Nous aurons également besoin de générer une archive JAVA pour deux autres librairies du Framework .NET : mscorlib.dll et System.dll.

Nous avons à présent 3 archives .jar que nous allons mettre dans le build path de notre projet.

Nous pouvons maintenant développer une implémentation de l'interface IHTTPHandler. Celle-ci doit surcharger la méthode ProcessRequest afin d'appeler la méthode doPost de la servlet RPC du serveur GWT. Nous avons alors besoin d'implémenter HttpServletRequest, HttpServletResponse, ServletConfig et ServletContext qui sont utilisés par cette servlet.

Voici le résultat :

package web.custom;
 
 
import javax.servlet.ServletException;
import cli.System.Web.HttpContext;
import cli.System.Web.IHttpHandler;
import com.gwt.test.server.GreetingServiceImpl;
 
public class HttpHandlerImpl implements IHttpHandler {
    private final GreetingServiceImpl servlet;
    private final ServletContextImpl context;
 
    public HttpHandlerImpl() {
        context = new ServletContextImpl();
        servlet = new GreetingServiceImpl();
        try {
            servlet.init(new ServletConfigImpl("GreetingServiceServlet",
                context));
        } catch (ServletException e) {
            throw new RuntimeException(e);
        }
    }
 
    public boolean get_IsReusable() {
        return true;
    }
 
    public void ProcessRequest(HttpContext context) {
        try { servlet.doPost(DotNetToJavaUtils.getRequest(context.get_Request()),
            DotNetToJavaUtils.getResponse(context.get_Response()));
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

Rapidement, notre Http Handler ainsi que les autres classes nécessaires sont développés (en Java), compilés et prêts à être testés. Au passage il est assez intéressant de voir à quel point l'API servlet java et System.web .NET sont similaires.
Par exemple pour implémenter la méthode HttpServletRequest.getParameter(String) :

public String getParameter(String arg0) {
    NameValueCollection nvc = request.get_Params();
    return nvc.Get(arg0);
}

Du JAVA au .NET

Nous pouvons maintenant créer un fichier .jar contenant les classes de notre projet. Nous copions dans un répertoire :
tous les fichiers *.jar contenus dans le répertoire WEB-INF/lib
le fichier .jar que nous venons de créer sans oublier le jar de l'API servlet servlet-api.jar
Puis on lance le compilateur :

De nombreux warnings apparaissent :

Ces warnings sont liés à des classes dupliquées et à des dépendances optionnelles des bibliothèques de l'application. Ils n'empêchent en aucun cas la compilation des classes nécessaires à l'application.

La librairie est tout de même générée et nous pouvons à présent la déployer dans IIS. Ce déploiement est l'objet du second article dédié à GWT et IIS.

Pour accéder à la seconde partie de cet article, cliquez ici.

Eric Plaquevent
picto

Commentaires

Soyez la premiere personne à ajouter un commentaire sur cet article.
Ecrire un nouveau commentaire