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

Eclipse Platform Discussion :

Création d'un plugin console


Sujet :

Eclipse Platform

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 43
    Points : 42
    Points
    42
    Par défaut Création d'un plugin console
    Bonjour,

    Je souhaite crée dans le cadre d'un projet d'école, un plugin Eclipse. Cependant nous n'avons que 2 semaines et avons peut être sous estimé la difficulté pour créer ca.

    Le plugin sert à récupérer les erreurs/exception lors de développement de programme. (Java pour l'instant car nous ne savons pas comment différencier les programmes lancés).

    J'ai crée un plugin Hello world pour voir comment cela fonctionne. J'ai donc un plugin qui se lance avec une icone dans la toolbar.

    Pour le moment mon plugin arrive à récupérer la console, récupérer les exceptions et écrire dans la console de l'utilisateur.
    Mais étant donnée que je ne connais pas les procédures pour développer un plugin eclipse je l'ai peut être mal fait

    Voici ce que j'ai fait en pseudo 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
     
     
    function findConsole() {
        foreach Console in ConsolePluging.getDefault().getConsoleManager()
            if Console.type = ProcessConsoleType
                return Console
    }
     
    function run() {
       pConsole = (ProcessConsole) findConsole()
       output = pConsole.newOutputSteam()
       pConsole.addPatternMatchListener(new IPatternMatchListener() {
           matchFound(PatternMatchEvent event) {
                String exception = ((ProcessConsole)event.getSource()).getDocument().get(event.getOffset(), event.getLength());
                String reponse = processError(exception)
                out.write(reponse);
           }
       }
    }
    Mon problème est que je dois lancer le programme test qui lève une exception puis ensuite cliquer sur l'icone de mon plugin pour le lancer.
    Est-il possible de lancer mon plugin en même temps que le run d'un programme ?
    Voir directement attacher mon plugin aux consoles pour que mon plugin fonctionne comme un espion qui track la console ?

    Merci d'avance,

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Un plugin Eclipse RCP peut démarrer de lui-même (il suffit qu'il ait un Activator (une classe), qu'on peut indiquer dans le formulaire qu'on remplit lorsqu'on créé le plugin). A partir du moment où le plugin est installé (mis dans le dossier plugins de Eclipse, ou via le dossier dropins).

    Pour écouter la console, il y a apparement une extension : voir la doc. Il n'y donc à priori pas besoin d'activator, l'extension se chargeant toute seule d'installer le ConsoleLineTracker, mais ça ne coûte rien d'en avoir un (il est créé automatiquement).

    Il faut un Eclipse RCP pour pouvoir faire un plugin. Tu fais "New Plug-in Project", tu remplis le formulaire qui s'affiche (le nom du plugin, la version de java, etc...), tu vas sur l'onglet Dependencies et tu y ajoutes une dépendance vers le plugin org.eclipse.debug.ui, qui définit le point d'extension ConsoleLineTracker. Il faut également ajouter une dépendance sur org.eclipse.jface.text, qui est utilisé par le ConsoleLineTracker. Ensuite, tu vas dans l'onglet Extensions, tu ajoutes une extension de type org.eclipse.debug.ui.consoleLineTrackers, et tu indiques le nom d'une classe, qui doit implémenter org.eclipse.debug.ui.console.IConsoleLineTracker (il suffit de cliquer sur class, et tu vas pouvoir directement créer la classe). Tu dois indiquer le processType java.

    Ensuite tu peux y mettre le code que tu veux.

    Pour tester ton plugin, tu fais Run as / Eclipse Application, qui va te lancer un nouvel eclipse, dans lequel tu pourras exécuter une classe Java pour tester le ConsoleTracker.

    Pour déployer ton plugin, passe par le menu Export, Deployabel Plug-ins and Fragments, tu choisis un dossier, tu laisses générer le plugin, tu vas dans le dossier, et tu vas y trouver un dossier plugins, avec un jar : tu le copies dans le dossier plugins de ton Eclipse, et tu le redémarres.

    Pour en savoir plus sur le dévellopement du plug-ins, voir le tutoriel de Lars Vogel. Tu pourrais, par exemple, faire une vue (View), pour y afficher les exceptions détectées dans la console.

    Voici un exemple bidon (j'affiche chaque ligne détectée dans la console dans une boite de dialogue) :
    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
    public class DemoConsoleTracker implements IConsoleLineTracker {
     
    	private Shell shell;
    	private IConsole console;
     
    	@Override
    	public void init(IConsole console) {
    		this.console = console;
    		Display display = Display.getDefault();
    		display.syncExec(()->shell = new Shell(display));
    	}
     
    	@Override
    	public void lineAppended(IRegion line) {
    		Display.getDefault().syncExec(()-> handleMessage(line));
    	}
     
    	private void handleMessage(IRegion line) {
    		int offset = line.getOffset();
    		int length = line.getLength();
    		try {
    			String text = console.getDocument().get(offset, length);
    			MessageDialog.openInformation(shell, "Line appended in console", text);
    		} catch (BadLocationException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
     
    	@Override
    	public void dispose() {
    		Display.getDefault().syncExec(()-> shell.dispose());
    	}
     
    }
    Ici, text contient la ligne ajoutée dans la console, il suffit de la parser, pour déterminer si elle contient un message du type stackTrace, par exemple. Ensuite, il y a plein de possibilités, comme utiliser des outils de JDT (pour accèder au contenu des classes), ou l'extensions ConsolsePatternMatchListeners, ou peut-être simple ajouter un IPatternMatchListener à l'instance de console.

    Pour la configuration de l'extension :

    Nom : Capture.PNG
Affichages : 164
Taille : 17,0 Ko

    En conclusion, je dirais que 2 semaines pour aborder tout ça quand on en a jamais fait peut être assez juste. Tout dépend de l'ambition. Je pense qu'afficher une vue, avec un TableViewer JFACE dans lequel vous affichez simplement les noms des exceptions peut-être fait assez rapidement, et ne fait pas appel à beaucoup de connaissance. Commencez déjà par ça. Vous jugerez sur le temps passé pour voir si vous voulez aller plus loin (par exemple, en cliquant sur une ligne, ouvrir la classe et se positionner sur la ligne dans le source).

    [EDIT] J'ajoute le résultat du test, fait avec la classe bidon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class Test {
    	public static void main(String[] args) {
    		try {
    			throw new Throwable("blah blah");
    		}
    		catch(Throwable t) {
    			t.printStackTrace();
    		}
    	}
    }
    Et qui m'affiche dans la console :

    java.lang.Throwable: blah blah
    	at Test.main(Test.java:5)
    Mon plugin affiche donc :

    Nom : Capture.PNG
Affichages : 154
Taille : 6,0 Ko

    Puis

    Nom : Capture.PNG
Affichages : 195
Taille : 5,9 Ko

    Puis (probablement un \n final)

    Nom : Capture.PNG
Affichages : 159
Taille : 5,3 Ko
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 43
    Points : 42
    Points
    42
    Par défaut
    Bonjour,

    merci pour cette réponse complète et rapide !

    J'avais fait tout ce que tu avais dit, mais je n'avais pas la connaissance de org.eclipse.debug.ui.console.IConsoleLineTracker, je transposerais mon code pour voir si cela marche.

    A vrai dire si j'arrive à implémenter IConsoleLineTracker, je pense que 2 semaine sera largement assez puisque qu'il fait 50% du boulot. J'ai juste besoin de récupérer l'exception et d’écrire l'url du post stackoverflow qui répond à son exception dans la console de l'utilisateur.
    Je ne compte pas faire de vue spécifique ou du dialog pour ne pas trop gêner l'utilisateur.

    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Exception thrown  :java.lang.ArrayIndexOutOfBoundsException: 3
    Out of the block
    ------------------------------------------------------------------------------------------------------------------
                                                           ExceptionResolver
    ------------------------------------------------------------------------------------------------------------------
        http://stackoverflow.com/questions/27208168/java-catching-exceptions-using-class-exception
    ------------------------------------------------------------------------------------------------------------------
    Une question d'ailleurs, il est possible de faire des appels http depuis un plugin eclipse ? Il n'y a pas de restriction de coté ?
    Etant donné que le programme qui traite l'exception pour trouver la réponse la plus proche utilise une grosse base de donnée, nous somme en train de faire une API et donc je devrais faire des appels http à celle ci.

    Encore merci !

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Qu'est ce que tu appelles la console utilisateur ? Si c'est la même où s'affiche déjà l'erreur, tu vas donc écrire dans la console qui est déjà écoutée pour intercepter les traces. Je ne sais pas si c'est possible de modifier le contenu, pendant le processus (risque de conflit), et tu vas devoir gérer l'antibouclage.

    Il n'y aucune restriction pour appeler des services http dans un plugin, ou autre. Mais je me dis que qui dit http, et base de données, dit délai. Un programme peut tracer des centaines d'exception sans s'arrêter, ce qui veut dire des centaines de requêtes, alors que ce n'est pas vraiment nécessaire. Le délai dû à la requête va faire qu'en plus le contenu de la console va se modifier avec un délai, donc potentiellement être génant lors de la consultation de celle-ci.

    Une bonne idée serait d'avoir un tooltip sur le lien qui est déjà affiché dans la console (je ne sais pas si c'est possible facilement, je n'ai pas regardé en détail), ainsi la requête ne serait fait qu'au besoin, et il n'y aurait pas à gérer de conflit avec la console. L'avantage du tooltip en plus, c'est de pouvoir mettre un lien dans le texte, vers stackoverflow (ou Developpez, ce serait mieux ), ou ajouter un bouton "Rechercher sur google", par exemple.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 43
    Points : 42
    Points
    42
    Par défaut
    Ce que j'ai appelé la "console utilisateur" c'était la console du process (ou s'affiche l'erreur). Avec ma première méthode j'ai déjà réussi à écrire dessus en créant un nouveau stream.


    L'idée d'un lien cliquable qui lance une deuxième partie du tooltip n'est pas bête lorsque de nombreuses stacktraces apparaissent sans que cela ferme l'application comme sur un serveur web par exemple. Mais je pense qu'on va limiter le périmètre à une application simple qui se quitte lors d'une exception comme ça il n'y aura pas de problème avec le délai.
    On avisera si tout marche bien avec cette première version pour l'évoluer.


    (Pour un lien vers Developpez c'est possible mais il faudrait un dump du forum pour pouvoir le miner. S'il est disponible il serait possible de le faire ^^)

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    L'interface org.eclipse.debug.ui.console.IConsoleLineTrackerExtension pourrait t'interesser : sa méthode close() sera notifié à la fin de la trace.

    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
    public class DemoConsoleTracker implements IConsoleLineTracker, IConsoleLineTrackerExtension{
     
    	private IConsole console;
     
    	@Override
    	public void init(IConsole console) {
    		this.console = console;
    	}
     
    	@Override
    	public void lineAppended(IRegion line) {
    	}
     
    	@Override
    	public void dispose() {
    	}
     
    	@Override
    	public void consoleClosed() {
    		try {
    			String allText = console.getDocument().get(0, console.getDocument().getLength());
    			console.getDocument().set( allText + "\nxxxx");
    		} catch (BadLocationException e) {
    			e.printStackTrace();
    		}
    	}
     
     
    }
    Affiche dans la console (avec le même programme de test que précedemment) :
    java.lang.Throwable: blah blah
    	at Test.main(Test.java:5)
    
    xxxx
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. Création d'un plugin eclipse avec maven
    Par afkkir dans le forum Maven
    Réponses: 7
    Dernier message: 10/07/2008, 14h34
  2. Creation d'un plugin console
    Par Drannor dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 10/04/2008, 14h33
  3. Création d'un plugin pour Eclipse
    Par Naeco dans le forum Eclipse Platform
    Réponses: 6
    Dernier message: 16/01/2007, 17h00
  4. création d'un plugin eclipse simple?
    Par castrogne dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 13/07/2006, 10h40
  5. Création d'un plugin pour navigateur web
    Par veuda dans le forum Réseau/Web
    Réponses: 7
    Dernier message: 07/11/2005, 15h56

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