IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GWT et Vaadin Java Discussion :

[GWT] Connexion MySQL + transport client/server


Sujet :

GWT et Vaadin Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2010
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 26
    Points : 7
    Points
    7
    Par défaut [GWT] Connexion MySQL + transport client/server
    Bonjour,

    Je commence par détailler ce qui va bien :

    * La version de GWT que vous utilisez :
    o GWT 2.1.1

    * Les librairies GWT additionnelles que vous utilisez.
    o aucune

    * L'environnement de développement que vous utilisez (éventuellement).
    o Eclipse 3.6


    Je travail actuellement sur un projet de fin d'année basé sur GWT et étant très novice dans l'utilisation de GWT et de java je me pose pas mal de questions.

    Mon but est d'arriver à créer une grille dont les cellules seraient "alimentées" par une base de données (en fait je doit créer un planning : nom d'utilisateur, date etc).

    J'ai bien compris que GWT ca se décompose en une partie cliente et une serveur et j'ai commencé par créer une connexion à ma base de donnée (MySQL) côté serveur dans une classe crée exprès.

    Ensuite j'ai lu pas mal de tuto et d'articles en tout genre pour comprendre comment faire passer mes données vers le côté client et la c'est un peu la pagaille, si j'ai bien compris on doit soit utiliser du JSON soit du XML et c'est la que je bloque ... Comment mettre cela en place que ce soit pour faire les requêtes sur mes bases côté serveur ou pour les "transporter" côté client.

    Si quelqu'un a la patience de me faire un petit topo la dessus je suis preneur

    J'ai bien évidemment lu un maximum de choses avant de venir poster ici, et c'est plutôt la diversité des infos qui m'amènent à poster.


    Merci,
    Jérôme

  2. #2
    Futur Membre du Club
    Inscrit en
    Mars 2010
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 26
    Points : 7
    Points
    7
    Par défaut
    J'ai finalement trouvé quelque chose de pas mal et que j'ai adapté à mon problème, seulement à la compile j'obtiens ces erreurs :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    15:03:34.782 [ERROR] [grblapp] Unable to load module entry point class lgm.ft.client.GRBLapp (see associated exception for details)
    java.lang.NullPointerException: null
        at lgm.ft.client.GRBLapp.onModuleLoad(GRBLapp.java:32)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at com.google.gwt.dev.shell.ModuleSpace.onLoad(ModuleSpace.java:396)
        at com.google.gwt.dev.shell.OophmSessionHandler.loadModule(OophmSessionHandler.java:183)
        at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:510)
        at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:352)
        at java.lang.Thread.run(Unknown Source)

    Quelqu'un aurait une piste ? Est ce que j'aurai pas oublié qqchose ds mon WEB-INF ou autre ?


    Merci

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 165
    Points : 248
    Points
    248
    Par défaut
    Tu as un NullPointer, sans le code incriminé impossible de t'aider.

  4. #4
    Futur Membre du Club
    Inscrit en
    Mars 2010
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 26
    Points : 7
    Points
    7
    Par défaut
    D'après ce que j'ai compris sur les NullPointer, il y a de forte chance que ça vienne d'un tableau, donc voilà le code qui est surement concerné ...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    public class DB_Grbl extends DB_Conn {
     
            /**
             * constructor - nothing to do
             */
            public DB_Grbl() {
                    // nothing to do
            }
     
     
            public GrblData[] getBibleInfo() {
     
                    String query = "SELECT nom, prenom FROM user;";
     
                    // prepare for rpc transport
                    GrblData[] bibleData = null;
     
                    try {
                            Connection connection = getConn();
                            Statement select = connection.createStatement();
                            ResultSet result = select.executeQuery(query);
     
                            // init object into the size we need, like a recordset
                            int rsSize = getResultSetSize(result); //size the array
                            bibleData = new GrblData[rsSize];
     
                            int i = 0;
                            while (result.next()) {
     
     
                                    bibleData[i] = new GrblData(); 
     
     
                                    bibleData[i].UserFirstName = result.getString(2);
                                    bibleData[i].UserLastName = result.getString(2);
                                    getHowManyVerses(bid);
     
                                    i++;
                            }
     
                            // clean up
                            result.close();
                            connection.close();
     
                    } catch(Exception e) {
     
                            System.err.println("Mysql Statement Error: " + query);
                            e.printStackTrace();
     
                    }
     
                    // return the array
                    return bibleData;
            }
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
     
    public class GrblInfoWidget extends Composite {
     
        private RpcCallServiceAsync rpc;
     
        // main widget panel
        private VerticalPanel pWidget = new VerticalPanel();
        private LoadingWidget loading = new LoadingWidget();
        private VerticalPanel pBibleTable = new VerticalPanel();
     
        // table for the bible info
        private Grid grid = null;
     
        /**
         * constructor - init the composite widget for use 
         */
        public GrblInfoWidget() {
     
                HorizontalPanel hp = new HorizontalPanel();
                hp.add(new HTML("List of users "));
                hp.add(loading);
     
                pWidget.add(hp);
                pWidget.add(pBibleTable);
     
                // init widget, this can be added into the rootpanel
                initWidget(pWidget);
     
                // init the rpc
                rpc = RpcInit.initRpc();
        }
     
        public void draw() {
     
                // start the process
                getBibleInfo();
     
        }
     
        /**
         * draw bible info to screen after rpc callback
         * 
         * @param bibleData
         */
        private void drawBibleInfo(GrblData[] grblData) {
     
                // if null nothing to do, then exit
                // this will prevent errors from showing up
                if (grblData == null) {
                        return;
                }
     
                int rows = grblData.length;
     
                // set up the table the bible info will go into. 
                // I already init the grid var above so I can reference it other methods in this instance.
                grid = new Grid(rows+1, 3);
                pBibleTable.add(grid);
     
                Label lLname = new Label("Last name");
                Label lFname = new Label("First name");
     
     
                // tool-tip hover
                lLname.setTitle("Last name of user");
                lFname.setTitle("First name of user");
     
     
                // label row - Starts with 0 ordinal
                grid.setWidget(0, 0, lLname);
                grid.setWidget(0, 1, lFname);
     
     
                // go through the books of the bible
                for (int i = 0; i < rows; i++) {
     
     
                        grid.setWidget(i+1, 0, new HTML(grblData[i].UserLastName));
                        grid.setWidget(i+1, 1, new HTML(grblData[i].UserFirstName));
     
                        // row style
                        boolean even = i % 2 == 0;
                        String style = "";
                        if (even == true) {
                                style = "rs-even";
                        } else {
                                style = "rs-odd";               
                        }
                        grid.getRowFormatter().setStyleName(i+1, style);
                }
     
                grid.setStyleName("grblTable");
     
        }
     
        /**
         * rpc request to get the bible info. 
         * 
         * on return, draw the data to screen
         */
        private void getBibleInfo() {
     
                // draw loading
                loading.show();
     
                // remote procedure call to the server to get the bible info
                rpc.getBibleInfo(new AsyncCallback<GrblData[]>() {
     
                        public void onSuccess(GrblData[] bibleData) {
     
                                // draw bible info
                                drawBibleInfo(bibleData);
     
     
                                // hide loading
                                loading.hide();
                        }
     
                        public void onFailure(Throwable caught) {
                                RootPanel.get().add(new HTML(caught.toString()));
     
                        }
                });
        }
     
     
    }

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 165
    Points : 248
    Points
    248
    Par défaut
    Citation Envoyé par Jiraf Voir le message
    at lgm.ft.client.GRBLapp.onModuleLoad(GRBLapp.java:32)
    C'est la ligne 32 de la classe GRBLapp qui pose problème. Un null pointer indique que tu utilises une variable qui n'est pas instanciée.

  6. #6
    Futur Membre du Club
    Inscrit en
    Mars 2010
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 26
    Points : 7
    Points
    7
    Par défaut
    Merci, j'ai déjà essayé de fix ça et au moins ça permet de passer à l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    com.google.gwt.user.client.rpc.StatusCodeException: 404
    Ca viendrait de mon web.xml avec notamment les chemin de mon servlet ... J'ai pas mal regardé, repris les exemple que google fournis mais j'arrive pas à comprendre d'où elle vient (si elle vient bien de là).
    Du coup j'ai host mon projet sur googlecode pour que ce soit plus simple ...

    http://code.google.com/p/grbl-lgm/so...e/#svn%2Ftrunk

    En plus, galel, j'ai vu que tu as déjà répondu à ce genre de problème dans un autre topic et j'ai donc bien re-regardé le nom de l'appli ds mon xxx.gwt.xml mais pour l'instant je bloque !

    Je continu à chercher !

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 165
    Points : 248
    Points
    248
    Par défaut
    Peut-être que la trace complète nous donnerait plus d'information.

    As-tu déjà essayé de faire un appel asynchrone "simple", c'est à dire sans appel à la base et ne retournant qu'un DTO instancié à la main?

  8. #8
    Futur Membre du Club
    Inscrit en
    Mars 2010
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 26
    Points : 7
    Points
    7
    Par défaut
    Oui, le simple code que l'on a lorsque l'on crée un nouveau projet GWT propose ça, et ca marchait très bien.

    Sinon qu'est ce que tu appelles "trace complète" ?

    Merci de ton aide =)

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 165
    Points : 248
    Points
    248
    Par défaut
    Trace complète: l'ensemble des lignes affichées dans la console après la ligne com.google.gwt.user.client.rpc.StatusCodeException: 404

    Si l'exemple de base fonctionnait as-tu modifier des fichiers de configuration? As-tu créé ta propre classe pour les services ou as-tu utilisé celle générée automatiquement?

  10. #10
    Futur Membre du Club
    Inscrit en
    Mars 2010
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 26
    Points : 7
    Points
    7
    Par défaut
    La seule trace d'erreur que j'ai c'est un warning :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [WARN] No file found for: /grblapp/rpcService
    (console)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Problem accessing /grblapp/rpcService. Reason : NOT_FOUND
    (navigateur)

    Et sinon, oui j'ai changé les fichier de configuration (web.xml) car j'ai crée de nouvelles classes. J'ai pourtant refait mes chemins en me basant sur les tutos proposés par Google mais visiblement je me suis trompé quelque part.
    J'ai essayé divers possibilités même si elle me paraissaient impossible.

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 165
    Points : 248
    Points
    248
    Par défaut
    Citation Envoyé par Jiraf Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Problem accessing /grblapp/rpcService. Reason : NOT_FOUND
    Ton service n'est manifestement pas trouvé, cela vient donc de sa déclaration. Pour un service tu dois avoir deux interface côté client et un classe implémentant l'une de tes interfaces côté serveur. Attention il y a des convention de nommage entre les interfaces et la classes. L'annotation @RemoteServiceRelativePath("stockPrices") utilisée dans l'interface qui "extends" RemoteService référence un nom de servlet qui doit être déclaré dans le web.xml


    Pour plus d'infos http://code.google.com/intl/fr-FR/we...orial/RPC.html

  12. #12
    Futur Membre du Club
    Inscrit en
    Mars 2010
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 26
    Points : 7
    Points
    7
    Par défaut
    Je vais essayé d'expliquer ma démarche du mieux possible (peut être que je verrai mon erreur en même temps !)

    J'ai donc bien évidemment deux interfaces côté client :

    RpcCallService
    Déclarée de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    @RemoteServiceRelativePath("rpcService")
    public interface RpcCallService extends RemoteService {
     
            public GrblData[] getGrblInfo();
     
    }
    RpcCallServiceAsync
    Déclarée de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public interface RpcCallServiceAsync {
     
            public void getGrblInfo(AsyncCallback<GrblData[]> callback);
     
    }

    Ensuite j'ai celle côté serveur (Impl) :

    RpcCallServiceImpl
    Que je déclare de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class RpcCallServiceImpl extends RemoteServiceServlet implements RpcCallService {
     
            public GrblData[] getGrblInfo() {
     
                    DB_Grbl db = new DB_Grbl();
                    GrblData[] grblData = db.getGrblInfo();
     
                    return grblData;
            }
     
    }


    Ensuite mon web.xml :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <web-app>
     
      <!-- Servlets -->
      <servlet>
      <servlet-name>RpcCallServiceImpl</servlet-name>
      <servlet-class>
        lgm.ft.server.RpcCallServiceImpl
      </servlet-class>
    </servlet>
    <servlet-mapping>
      <servlet-name>RpcCallServiceImpl</servlet-name>
      <url-pattern>/lgm.ft.grblapp/rpcService</url-pattern>
    </servlet-mapping>
     
      <!-- Default page to serve -->
      <welcome-file-list>
        <welcome-file>GRBLapp.html</welcome-file>
      </welcome-file-list>
     
    </web-app>

    J'ai l'impression que ca vient de la déclaration de l'interface "RpcCallService" avec mon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @RemoteServiceRelativePath("rpcService")
    qui serait pas bon (en tout cas c'est la seule chose qui me vient à l'esprit quand je regarde ce que google raconte).

    Car dans mon web.xml le chemin est à mon avis bon : nom_du_projet/nom_du_service.

  13. #13
    Futur Membre du Club
    Inscrit en
    Mars 2010
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 26
    Points : 7
    Points
    7
    Par défaut
    1. Define an interface (StockPriceService) for your service that extends RemoteService and lists all your RPC methods.
    2. Create a class (StockPriceServiceImpl) that extends RemoteServiceServlet and implements the interface you created above.
    3. Define an asynchronous interface (StockPriceServiceAsync) to your service to be called from the client-side code.
    Je crois pas me tromper en disant que mon code respecte bien ces étapes, la seule chose dont je suis pas sur c'est : "and lists all your RPC methods"

  14. #14
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 165
    Points : 248
    Points
    248
    Par défaut
    Citation Envoyé par Jiraf Voir le message
    <url-pattern>/lgm.ft.grblapp/rpcService</url-pattern>
    Cela peut venir de là.
    Normalement dans ton projet eclipse tu as un répertoire war dont un des sous répertoire contient les fichiers généré par GWT (en général le nom de ton projet), c'est ce nom qu'il faut mettre devant /rpcService (à la place de lgm.ft.grblapp), je pense qu'il faut mettre grblapp

  15. #15
    Futur Membre du Club
    Inscrit en
    Mars 2010
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 26
    Points : 7
    Points
    7
    Par défaut
    Hmm désolé de t'avoir fait perdre ton temps, effectivement ça venait bien de là ...
    J'avais bien essayé cette solution mais Eclipse me sort une erreur de "spelling" et bête comme je suis j'avais directement lâché l'affaire avant même de compiler avec cette solution.
    Or ben le "spelling" on s'en fou =). J'ai plus cette erreur et ma procédure RPC fonctionne.

    Merci

    Je met pas en résolu car j'ai des erreurs MySQL, je vais bien regarder ça et changerai en résolu si c'est tout bon.


    Donc pour ceux qui passe avec ce type d'erreur, bien vérifier ds son web.xml que la balise url-pattern soit remplie avec nom_projet/nom_service. Et comme l'a dit galel le nom exact du projet se trouve dans le dossier WAR.

  16. #16
    Futur Membre du Club
    Inscrit en
    Mars 2010
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 26
    Points : 7
    Points
    7
    Par défaut
    Re ><

    J'ai cette erreur à la compile :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server.
    J'ai vu que ca venait du fait d'avoir laissé coché l'AppEngine à la création de mon projet (l'AppEngine ne m'interesse pas,je veux faire tourner ça en local), je me suis donc empressé de le décocher et la j'arrive à une autre erreur et en même temps l'url du dev mode n'est plus générée ...

    Voilà l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Exception in thread "main" java.lang.NoSuchMethodError: org.mortbay.thread.Timeout.<init>(Ljava/lang/Object;)V
    	at org.mortbay.io.nio.SelectorManager$SelectSet.<init>(SelectorManager.java:306)
    	at org.mortbay.io.nio.SelectorManager.doStart(SelectorManager.java:223)
    	at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39)
    	at org.mortbay.jetty.nio.SelectChannelConnector.doStart(SelectChannelConnector.java:303)
    	at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39)
    	at org.mortbay.jetty.Server.doStart(Server.java:233)
    	at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39)
    	at com.google.gwt.dev.shell.jetty.JettyLauncher.start(JettyLauncher.java:565)
    	at com.google.gwt.dev.DevMode.doStartUpServer(DevMode.java:494)
    	at com.google.gwt.dev.DevModeBase.startUp(DevModeBase.java:1058)
    	at com.google.gwt.dev.DevModeBase.run(DevModeBase.java:800)
    	at com.google.gwt.dev.DevMode.main(DevMode.java:304)

    Quand je fais des recherches sur cette erreur je me retrouve avec des gens qui se plaignent de ne pas pouvoir lancer l'appengine justement ...
    Donc je sais pas trop ou donner de la tête.

    Apparemment, recréer un projet en décochant bien dès le début l'AppEngine serait une solution ... Je vais essayé mais si pendant ce temps quelqu'un à une autre solution, u're welcome.

  17. #17
    Futur Membre du Club
    Inscrit en
    Mars 2010
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 26
    Points : 7
    Points
    7
    Par défaut
    Bon ben la technique de re-créer un projet en décochant l'AppEngine fonctionne (même si c'est pas satisfaisant), si quelqu'un à une idée du pourquoi je suis tout de même preneur !

    Maintenant tout roule, merci pour l'aide galel.

Discussions similaires

  1. Novice MySQL : installation client/server
    Par futneguet dans le forum MySQL
    Réponses: 6
    Dernier message: 18/05/2010, 11h47
  2. Connexion Client/Server avec MySQL
    Par Adomi Razaki dans le forum Administration
    Réponses: 1
    Dernier message: 15/05/2010, 09h23
  3. GWT connexion Mysql
    Par Matla69 dans le forum GWT et Vaadin
    Réponses: 7
    Dernier message: 16/02/2010, 16h52
  4. Réponses: 2
    Dernier message: 26/06/2007, 19h16
  5. [Connexion MySQL] Can't connect to MySQL server
    Par mat_dum dans le forum Outils
    Réponses: 12
    Dernier message: 17/07/2003, 07h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo