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

Java Discussion :

[Conception] Gestion de "plugins"


Sujet :

Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 54
    Points : 42
    Points
    42
    Par défaut [Conception] Gestion de "plugins"
    Bonjour,

    Je travaille pour le moment sur un éditeur de code source.

    Dans l'organisation du projet, il faut redéfinir certaines classes dont AbstractEditor dans le but de créer un "nouvel" éditeur adapté à un type de langage en particulier. La classe de base contient entre autre un JDesktopPane contenant les différents editeurs.

    Dans le package editeur.main ce trouve les classes de base de l'éditeur dont AbstractEditor.

    Dans le package editeur.plugins ce trouve les différents package contenant chacun un editeur.

    Par exemple : editeur.plugins.java, editeur.plugins.php... chacun d'eux contenant diverses classes mais obligatoirement une classe héritant de AbstractEditor et nommée Editor.java.

    Je voudrais donc pouvoir dresser une liste des "plugins" et pouvoir instantier dans ma classe de base des objets de type AbstractEditor en fonction du choix.

    Par exemple : AbstractEditor ae = new editeur.plugins.java.Editor (...); si j'ai choisi le type d'éditeur "java".
    AbstractEditor ae = new editeur.plugins.php.Editor (...); dans le cas de "php".


    Je ne vois pas comment m'y prendre pour réaliser ceci.
    Si vous avez des suggestions, ou une solution qui parait plus évidente je suis preneur.

    Je suis occupé à tenter de lister tous les fichiers contenus dans le dossier plugins et se nommants Editor.java mais après je suis perdu...

  2. #2
    Rédacteur
    Avatar de Hikage
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 177
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 177
    Points : 6 301
    Points
    6 301
    Par défaut
    Je ne suis pas expert, mais dans un premier temps, il y a peut etre moyen de faire un fichier propertie du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    php = editeur.plugins.php.Editor
    java = editeur.plugins.java.Editor
    python = editeur.plugins.python.Editor
    Et ainsi faire une methode Factory qui permet d'instancier la bonne classe selon un parametre qui vaudrait "php", "java", ..

    Non ?
    Hikage
    SCJP / SCWCD & SCWSJD Certified / Spring Framework Certified
    [Personal Web] [CV]

    F.A.Q Spring Framework - Participez !

  3. #3
    Membre habitué
    Inscrit en
    Septembre 2003
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 174
    Points : 194
    Points
    194
    Par défaut
    Salut,

    Tu peux peut-être utiliser Commons Discovering qui te permet à partir d'un fichier de conf, de lister et d'instancier les classes qui implémentent une interface donnée.
    Je ne pense pas que tu puisses lister les classes héritant d'une classe abstraite (il faudrait vérifier) mais tu peux ça pourrait être une alternative.


    sylvain_2020

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 54
    Points : 42
    Points
    42
    Par défaut
    Ok, merci beaucoup.

    Je vais regarder vos deux propositions de plus prêt.

    Edit :
    Voilà, la première solution est impecable !

    Voici ma classe Factory, si ca peut aider quelqu'un...
    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
     
    import java.lang.reflect.Constructor;
    import java.util.Hashtable;
     
    public class Factory {
     
    	protected Hashtable<String, Class> editors = new Hashtable<String, Class> ();
     
    	/**
             * @param key nom d'identification (Ex : Classe File)
             * @param cls package + nom de la classe (Ex : java.io.File)
             */
    	public void addEditor (String key, String cls) throws ClassNotFoundException {
    		editors.put(key, Class.forName(cls));
    	}
     
    	/**
             * @param key nom d'identification (Ex : Classe File)
             * Les autres paramètres peuvent, par exemple, être les paramètres 
             * passés au constructeur.
             */
    	public AbstractEditor newEditor (String key, Truc truc) {
    		try {
    			Class c =  (Class) editors.get(key);
     
    			// Le type des paramètres du constructeur (référence complète)
    			Class [] cTab = {Class.forName ("machin.Truc")};
     
    			Constructor constructeur = c.getConstructor (cTab);			
     
    			if (c != null) {
    				// Les objets qui l'on va passer au constructeur
    				Object [] oTab = {truc};
     
    				return (AbstractEditor) constructeur.newInstance (oTab);
    			} else
    				return null;
     
    		} catch (Exception e) { return null; }
    	}
    }

  5. #5
    Rédacteur
    Avatar de Hikage
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 177
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 177
    Points : 6 301
    Points
    6 301
    Par défaut
    Content d'avoir pu aider

    Rq : pense au tag resolu en bas a gauche
    Hikage
    SCJP / SCWCD & SCWSJD Certified / Spring Framework Certified
    [Personal Web] [CV]

    F.A.Q Spring Framework - Participez !

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

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