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

avec Java Discussion :

Rediriger sortie de script en temps reel


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2009
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 37
    Points : 16
    Points
    16
    Par défaut Rediriger sortie de script en temps reel
    Bonjour,

    Tout d'abord, je m'excuse d'avance pour les fautes d'accents, mais je me trouve sur un clavier qwerty...

    Pour mon travail, je developpe une interface en Java, qui utilise des scripts externes censes etre utilises en Bash sous Linux/Unix.

    Lorsque je lance un script, je redirige la sortie vers un textArea afin d'afficher le resultat a l'utilisateur. (en utilisant System.setOut... et en recuperant le inputStream).

    Voici mon package qui me permet de lancer ma commande et recuperer l'output a la fin du processus :
    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
     
     
    package Tools;
     
    import java.io.*;
     
    public class ExecuteThatCommand {
     
              String[] command = {"sh", "-c", null};
              String errMsg;
              String outMsg;
              int outCode;
     
              static class PipeInputStreamToOutputStream implements Runnable {
                        PipeInputStreamToOutputStream(InputStream is, OutputStream os) {is_ = is;os_ = os;}
                        public void run() {
                                  try {
                                            byte[] buffer = new byte[1024];
                                            for (int count = 0; (count = is_.read(buffer)) >= 0;) {
                                                        os_.write(buffer, 0, count);
                                            }
                                  } catch (IOException e) {e.printStackTrace();}
                        }
                        private final InputStream is_;
                        private final OutputStream os_;
              }
     
              public void prepare(String arg) {
                        command[2] = arg;
                        errMsg = null;
                        outMsg = null;
                        outCode = -1;
              }
     
              public void run() {
                        ByteArrayOutputStream baosOut = new ByteArrayOutputStream();
                        ByteArrayOutputStream baosErr = new ByteArrayOutputStream();
                        try {
                                  final Process process = Runtime.getRuntime().exec(command);
                                  new Thread(new PipeInputStreamToOutputStream(process.getInputStream(), baosOut)).start();
                                  new Thread(new PipeInputStreamToOutputStream(process.getErrorStream(), baosErr)).start();
                                  outCode = process.waitFor();
                        } catch (Exception e) {
                                  StringWriter sw = new StringWriter();
                                  PrintWriter pw = new PrintWriter(sw);
                                  e.printStackTrace(pw);
                                  errMsg = sw.toString();
                                  outMsg = "Java Errors append : ";
                                  outCode = -1;
                        }
                        outMsg = baosOut.toString();
                        errMsg = baosErr.toString();
              }
     
              public String getCompleteMessage() {if (errMsg != null && outMsg != null) {return outMsg + errMsg;} else {return "";}}
              public String getErrMessage() {if (errMsg != null) {return errMsg;} else {return "";}}
              public String getOutMessage() {if (outMsg != null) {return outMsg;} else {return "";}}
              public int getOutCode() {return outCode;}
    }
    Jusque la tout va bien, mais mon probleme est que certains scripts peuvent etre longs (tres longs), et j'aimerais rediriger la sortie de ces scripts vers mon textArea en temps reel afin que l'utilisateur soit informe de l'etat du script.

    En cherchant sur internet, j'ai trouve quelques solutions comme rediriger la sortie vers un fichier et lire le fichier (ce qui me parait un peu moche comme methode), ou bien des solutions qui ne fonctionnent pas en temps reel.

    Auriez vous une idee a me soumettre afin de realiser cela?

    Merci,

    Raphael.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    au lieu, dans votre thread, de redireiger vers un bytearayoutputstream, faites directement dedans l'opération d'écriture dans le TextArea. Un truc dans ce gout là


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    static class StreamToTextArea implements Runnable {
                        StreamToTextArea(InputStream is, JtextArea out) {reader = new BufferedReader(new InputStreamReader(is,"UTF-8"));this.out = out;}
                        public void run() {
                                  try {
                                            String line = null;
                                            while ((line=reader.readLine()!=null){
                                                out.setText(out.getText()+line); // a passer dans un SwingUtilities.invokeLater!
                                            }
                                  } catch (IOException e) {e.printStackTrace();}
                        }
                        private final BufferedReader reader;
                        private final JTextArea out;
              }

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2009
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 37
    Points : 16
    Points
    16
    Par défaut
    Merci pour ta reponse, j'ai deja essaye cette methode en passant par un bufferedReader.
    Le probleme est que tout s'affiche bien dans mon textArea mais uniquement a la fin de mon script.

  4. #4
    Membre averti

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 246
    Points : 402
    Points
    402
    Par défaut
    Question bête, mais est-tu sûre que ton script envoi bien les données au fur et à mesure sur la sortie standard ?

    car si il les garde en mémoire et ne les publies qu'à la fin...
    (question qui m'est venu en lisant le post.)
    C'est en aidant les autres qu'on en apprend beaucoup soi-même

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2009
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 37
    Points : 16
    Points
    16
    Par défaut
    Oui oui, pour mes tests je lance un petit script test que j'ai fait, qui affiche un entier incremente toutes les secondes pendant 10 secondes.

    En le lancant sur une console, j'ai bien mes entiers qui s'affichent au fur et a mesure.

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    il y a bien un retour à la ligne à chaque fois?

  7. #7
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Avant de commencer quelques petites remarques :
    • Il est préférable de fermer explicitement les flux avec un try/finally.
    • Il ne faut pas oublier le flux d'entrée ! Si tu ne l'utilise pas il est plus sûr de le fermer immédiatement sous peine de dead-lock si jamais il est utilisé par le script.
    • Et perso j'utiliserais un try/finally pour détruire le process... juste au cas où...


    @tchize_ : Le setText(getText()+line) est assez affreux...
    Il serait préférable d'utiliser append() (pour un JTextArea) ou getDocument().insertString()...


    @raph382 : Je pense qu'il s'agit d'une mauvaise utilisation de l'EDT.
    As-tu bien utilisé SwingUtilities.invokeLater() ou quelque chose dans le genre pour ajouter le texte au composant ?
    Sinon tu n'exécuterais pas ton process ExecuteThatCommand depuis l'EDT par hasard ?


    a++

  8. #8
    Membre à l'essai
    Inscrit en
    Juillet 2009
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 37
    Points : 16
    Points
    16
    Par défaut
    Je ne suis pas un expert en Java, voici ce que je fais en resume... je ne sait pas si c'est bon ou pas :

    1) Je cree mon interface dans laquelle j'instancie une certaine classe (appelons la monProg).
    2) Lorsque l'utilisateur agis sur l'interface, cela va setter les variables de monProg necessaires a l'execution.
    3) Une fois toutes les variable entrees, un bouton de l'interface devient enabled, l'utilisateur clique alors dessus,
    4) Cela appelle une @action qui implemente task dans laquelle jappelle monProg.exec()
    5) Dans cette methodeexec() j'instancie un ExecutethatCommand(), et je le lance, ensuite je recupere le resultat.

    Je precise que des le debut je redirige toutes mes sorties en faisant System.setOut(.......(monJTextArea)) ce qui a pour effet de m'afficher dans mon textArea tout mes system.out.println().
    Dans tous les cas, si je ne lance pas ca, mes system.out.println s'affichent dans la console netbeans, et le probleme est toujours le meme : meme si je suis les differents conseils trouves, le texte ne s'affichera toujours qu'a la fin de l'execution de mon script.

    Merci beaucoup pour votre aide,

    Raphael.

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    raph: comme je l'ai dit, il y a des retour à la ligne dans l'output du script? Car, si ce n'est pas le cas, les données restent dans un buffer système et donc sont non visible par java car aucun flush n'est fait sur la sortie standard.
    Pourriez vous lancer le script avec redirection de sa sortie vers un fichier et attacher le fichier au forum?

  10. #10
    Membre à l'essai
    Inscrit en
    Juillet 2009
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 37
    Points : 16
    Points
    16
    Par défaut
    Oui il y'a bien des retour a la ligne (il y'en a meme 2 d'ailleurs, car j'en force un pour etre sur).

    voici le fichier : http://www.developpez.net/forums/att...1&d=1294419858


    Je precise que le fichier vient d'un system Unix, ne pas ouvrir avec notepad qui ne reconnais pas les sauts de lignes justement...
    Fichiers attachés Fichiers attachés

  11. #11
    Membre à l'essai
    Inscrit en
    Juillet 2009
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 37
    Points : 16
    Points
    16
    Par défaut
    Quelqu'un aurait-il une idee?

    Merci,

  12. #12
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Pourriez vous nous donner le code que vosu avez maintenant (qui affiche sur le textarea) ?

  13. #13
    Membre à l'essai
    Inscrit en
    Juillet 2009
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 37
    Points : 16
    Points
    16
    Par défaut
    Dans le textarea, les lignes sont sautees,
    j'ai donc : 123456789

    Par contre si je ne met pas dans le textArea mais je fais un system.out.println, j'ai bien dans la console Netbeans :

    1

    2

    3

    4

    5

    6

    7

    8

    9

    Effectivement, tu a peut etre raison quant aux retours a la ligne.
    Mon script qui tourne derriere est en python, comment faire un retour a la ligne mis a part "\n" et les retours a la ligne automatiques?

    Merci,

    Raphael

  14. #14
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    c'est bien \n
    Les retours ne sont pas "sautés". System.out.println rajoute d'office un saut de ligne

    Donnez nous le code qui lit votre inputstream pour l'envoyer vers les textarea svp. Supprimer le BufferedReader et plutot utiliser un InputStreamReader pourait aider.

  15. #15
    Membre à l'essai
    Inscrit en
    Juillet 2009
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 37
    Points : 16
    Points
    16
    Par défaut
    Voici le code :

    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
     
    import java.io.*;
    import javax.swing.JTextArea;
     
    public class ExecuteThatCommand {
    	String[] command = {"sh", "-c", null};
        String errMsg;
        String outMsg;
        int outCode;
        static class PipeInputStreamToOutputStream implements Runnable {
            PipeInputStreamToOutputStream2(InputStream is, JTextArea ja) {reader=new BufferedReader(new InputStreamReader(is));this.out=ja;}
            public void run() {
                try {
                    String line=null;
                    while((line=reader.readLine())!=null) {
                        out.append(line + "\n");
                    }
                } catch (IOException e) {e.printStackTrace();}
            }
            private final BufferedReader reader;
            private final JTextArea out;
        }
     
        public void prepare(String arg) {
            command[2] = arg;
            errMsg = null;
            outMsg = null;
            outCode = -1;
        }
     
        public void run(JTextArea ja) {
            try {
                final Process process = Runtime.getRuntime().exec(command);
                new Thread(new PipeInputStreamToOutputStream(process.getInputStream(), ja)).start();
                new Thread(new PipeInputStreamToOutputStream(process.getErrorStream(), ja)).start();
                outCode = process.waitFor();
            } catch (Exception e) {
                StringWriter sw = new StringWriter();
                PrintWriter pw = new PrintWriter(sw);
                e.printStackTrace(pw);
                errMsg = sw.toString();
                outMsg = "Java Errors append : ";
                outCode = -1;
            }
        }
     
        public String getCompleteMessage() {if (errMsg != null && outMsg != null) {return outMsg + errMsg;} else {return "";}}
        public String getErrMessage() {if (errMsg != null) {return errMsg;} else {return "";}}
        public String getOutMessage() {if (outMsg != null) {return outMsg;} else {return "";}}
        public int getOutCode() {return outCode; }
    }

  16. #16
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    et avec ceci? Contrairement au bufferedReader, il ne devrais pas attendre de sauf si le buffer est vide.

    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
    static class PipeInputStreamToOutputStream implements Runnable {
            PipeInputStreamToOutputStream2(InputStream is, JTextArea ja) {reader=new InputStreamReader(is);this.out=ja;}
            public void run() {
                try {
                    char[] elements =null;
                    int count = 0;
                    while((count=reader.readLine(elements,0,elements.length))>=0) {
                        if (count>0)
                            out.append(new String(elements,0,count));
                        Thread.sleep(100); // eviter le surcharge sur le proco
                    }
                } catch (IOException e) {e.printStackTrace();}
            }
            private final Reader reader;
            private final JTextArea out;
        }

  17. #17
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    au fait, je viens de tester avec votre code comme ceci:
    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
    import javax.swing.JFrame;
    import javax.swing.JTextArea;
     
    public class Main {
     
    	/**
             * @param args
             */
    	public static void main(String[] args) throws Exception{
     
     
    		ExecuteThatCommand ex = new ExecuteThatCommand();
    		JFrame f = new JFrame();
    		JTextArea jta = new JTextArea();
    		f.getContentPane().add(jta);
    		f.setSize(500,200);
    		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		f.setVisible(true);
    		ex.prepare("/tmp/test.sh");
    		ex.run(jta);
    	}
     
    }
    et avec ce script dans test.sh
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #!/bin/bash
    echo 1
    sleep 3
    echo 2
    sleep 3
    echo 3
    sleep 3
    echo 4
    sleep 3
    echo 5
    sleep 3
    echo 6
    sleep 3
    echo done
    et je n'ai aucun soucis, les données s'affichent au fur et à mesure

    Je n'ai pas l'impression que le problème se situe dans le domaine java, mais la suppression du BufferedReader vaut quand même peut-être le coup.

  18. #18
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    bon, je confirme que c'est bien python qui joue les trouble fête. J'ai essayé ce script python et j'ai le même problème que vous:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/usr/bin/python
    import time
     
    print "Hello, World!"
    time.sleep(2)
    print "Hello, World!"
    time.sleep(2)
    print "Hello, World!"
    time.sleep(2)
    print "Hello, World!"
    time.sleep(2)
    print "done"
    En fouinant un peu, j'ai trouvé les solution suivantes:

    Soit ajouter une var d'environnement pour python:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    final Process process = Runtime.getRuntime().exec(command,new String[]{"PYTHONUNBUFFERED=x"});
    Soit ajouter un paramètre à l'exécution de python
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/usr/bin/python -u
    import time
     
    print "Hello, World!"
    time.sleep(2)
    print "Hello, World!"
    time.sleep(2)
    print "Hello, World!"
    time.sleep(2)
    print "Hello, World!"
    time.sleep(2)
    print "done"
    Soit faire du flush à la main
    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
    #!/usr/bin/python   
    import time
    import sys
    print "Hello, World!"
    sys.stdout.flush()
    time.sleep(2)
    print "Hello, World!"
    sys.stdout.flush()
    time.sleep(2)
    print "Hello, World!"
    sys.stdout.flush()
    time.sleep(2)
    print "Hello, World!"
    sys.stdout.flush()
    time.sleep(2)
    print "done"
    La deuxième option me semble la plus propre, mais un peu invasive malgré tout.

  19. #19
    Membre à l'essai
    Inscrit en
    Juillet 2009
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 37
    Points : 16
    Points
    16
    Par défaut
    Perfect, ca marche!!!
    Et dire que je me suis casse le cerveau la dessus pendant 2 jours...

    Merci beaucoup.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/06/2012, 13h49
  2. filtrage temps reel de la sortie d'un programme dans terminal
    Par filipaillou dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 30/04/2010, 14h31
  3. [script] temps reel d'execution
    Par rberthou dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 30/06/2009, 14h51
  4. Réponses: 5
    Dernier message: 19/07/2004, 17h27
  5. Linux et le temps réel
    Par Shrem dans le forum Administration système
    Réponses: 6
    Dernier message: 11/12/2002, 08h21

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