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

Langage Java Discussion :

[Conception] Systeme de plugin


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 33
    Par défaut [Conception] Systeme de plugin
    Bonjour,

    J'ai lu avec attention le tutoriel présenté sur le site, Création d'un système de plugins en java et en vu d'un developpement d'un tel système, j'ai quelques questions à vous soumettre:

    il faut commencer par déterminer quels sont les services que nous allons offrir aux plugins
    1-Si determiner les services à offrir à un plugin en particulier ne me parait pas tres compliqué, il me semble toutefois plus difficile de definir TOUS les services dont pourront avoir besoin nos plugins à venir.
    L'ajout de nouveau services par la suite ne sera t'il pas lourd à gérer, en particulier au niveau des plugins existants dans le cas ou l'interface (ou plutot les interfaces) qu'ils implementent change?

    C'est pourquoi il faut définir une politique stricte d'accès aux données et s'y tenir. Par exemple vous pouvez choisir de passer les données par copie plutôt que par référence afin de garantir que tout changement effectué par le plugins n'ai pas de répercursion sur le reste de l'application.
    2- Pour moi, passer les données par copie, cela signifie de rendre toutes mes classes contenants mes données cloneable. N'est ce pas une méthode un peu lourde?
    De plus, mes données étants assez volumineuses, leur duplication risque d'entrainer une augmentation plus que sensible de la mémoire utilisée. J'ai du mal à evaluer ce risque là!

    4- Enfin, peut on parler de sécurité des données si mon plugin peut récupérer une instance de mon application par un simple Application.getApplication(), lui permettant ensuite d'attaquer directement mes données?
    Est ce un problème de conception initiale de mon appli?

  2. #2
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par guams
    1-Si determiner les services à offrir à un plugin en particulier ne me parait pas tres compliqué, il me semble toutefois plus difficile de definir TOUS les services dont pourront avoir besoin nos plugins à venir.
    L'ajout de nouveau services par la suite ne sera t'il pas lourd à gérer, en particulier au niveau des plugins existants dans le cas ou l'interface (ou plutot les interfaces) qu'ils implementent change?
    Cela dépend de quoi tu parles par "service".

    Si tu parles des méthodes des interfaces qui seront implémenter par les plugins, alors c'est sûr que ces interfaces ne devront pas être implémenté.

    Si tu veux les faires évoluer tu devras créer plusieurs interfaces différentes, que chaque Plugins devra implémenter ou non...

    Par exemple si tes plugins ne comporte à l'origine qu'une seule méthode qui sera appellé 'n' fois par ton programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public interface Plugin {
    	public void execute();
    }
    Et que tu souhaites par la suite pouvoir appeller une méthode d'initialisation une seule fois lors de la création du plugin, il faut alors créer une autre interface qui devra être implémenté par le plugin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public interface Initialisable {
    	public void init();
    }
    Ensuite il te suffit de vérifier le type avant d'effectuer les appels de méthodes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Plugin plugin = ...;
    if (plugin instanceof Initialisable) {
    	((Initialisable)plugin).init();
    }
    Tu peux bien sûr utiliser l'héritage au niveau des interfaces :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public interface InitialisablePlugin extends Plugin {
    	public void init();
    }




    Maintenant, si par "service" tu veux parler des services offerts par ton application pour les plugins, alors cela peut très bien évoluer sans problème (sauf si tu supprimes des méthodes bien sûr). De toutes manières les anciens plugins n'appeleront pas les nouvelles méthodes...


    Mais je n'ai peut-être pas très bien compris la question...




    Citation Envoyé par guams
    2- Pour moi, passer les données par copie, cela signifie de rendre toutes mes classes contenants mes données cloneable. N'est ce pas une méthode un peu lourde?
    Tu peux tout simplement utiliser un constructeur de copie...
    Citation Envoyé par guams
    De plus, mes données étants assez volumineuses, leur duplication risque d'entrainer une augmentation plus que sensible de la mémoire utilisée. J'ai du mal à evaluer ce risque là!
    Cela peut avoir un certain coût en effet. Mais si les plugins ne doivent pas être authoriser à modifier ces données tu n'as pas beaucoups de choix :


    Citation Envoyé par guams
    4- Enfin, peut on parler de sécurité des données si mon plugin peut récupérer une instance de mon application par un simple Application.getApplication(), lui permettant ensuite d'attaquer directement mes données?
    Est ce un problème de conception initiale de mon appli?
    Je pense que tu peux limiter cela en utilisant le ClassLoader... mais je ne me suis posé la question...


    Bon courage...

    a++

    PS : il n'y a pas de question 3-

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 33
    Par défaut
    Citation Envoyé par adiGuba
    Cela dépend de quoi tu parles par "service".

    Mais je n'ai peut-être pas très bien compris la question...
    si si, tu y as tres bien repondu!


    Tu peux tout simplement utiliser un constructeur de copie...
    Ok, il faut que je me penche là dessus vu que je n'ai jamais fait ce genre de manip!

    Cela peut avoir un certain coût en effet. Mais si les plugins ne doivent pas être authoriser à modifier ces données tu n'as pas beaucoups de choix :
    Les classes immuables me semblent à priori difficile à utiliser dans mon contexte vu que les champs de mes classes de données sont susceptibles d'etre mis à jour à differents moments dans mon appli, je ne peux donc pas tous les declarer final.

    Je pense que tu peux limiter cela en utilisant le ClassLoader... mais je ne me suis posé la question...
    Aurais tu une piste ou un semblant de piste, je n'ai absolument aucune idée sur la manière de faire ca!
    Ceci dit, je vais explorer cette piste de mon coté.

    PS : il n'y a pas de question 3-
    Tu es quand même arrivé à me quoter 4 fois!

    En tout cas, merci pour ces elements de reponse!

  4. #4
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par guams
    Les classes immuables me semblent à priori difficile à utiliser dans mon contexte vu que les champs de mes classes de données sont susceptibles d'etre mis à jour à differents moments dans mon appli, je ne peux donc pas tous les declarer final.
    Tu peux faire cela par "contrat" sans pour autant les définir en final.

    Deux solutions me viennent à l'esprit :

    1. Tu peux utiliser la visibilité de "package" (pas de mot-clef) afin de ne rendre les méthodes mutateurs accessibles que par les classes du même package :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class MonObjet {
     
    	private String name;
     
    	public String getName() {
    		return this.name;
    	}
     
    	void setName(String newName) {
    		this.name = name;
    	}

    2. Tu peux utiliser une classe Wrapper pour empêcher la modification des données.
    Par exemple tu as une interface qui définit seulement les méthodes d'accès aux attributs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public interface MonInterface {
     
    	public String getName();
     
    }
    La classe principale que tu utilises dans ton application implémente cette interface mais implémente également les méthodes mutateurs dont tu as besoin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class MonObjet implements MonInterface {
     
    	private String name;
     
    	public String getName() {
    		return this.name;
    	}
     
    	public void setName(String newName) {
    		this.name = name;
    	}

    Enfin, tu crée un classe wrapper immuable qui implémente l'interface et qui se contente de renvoyer tous les appels de méthodes défini dans l'interface vers la référence qui lui est passé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public final class MonObjetWrapper {
     
    	private final MonInterface inner;
     
    	public MonObjetWrapper(MonInterface inner) {
    		this.inner = inner;
    	}
     
    	public String getName() {
    		return this.inner.getName();
    	}
    Ainsi, lorsque tu dois passer un objet de type MonInterface aux plugins, tu lui passes à l'intérieur du wrapper.

    Dans ton application :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonObject obj = new MonObject();
    Lorsque tu le passes à un plugins :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonInterface wrapper = new MonObjetWrapper(obj);
    a++

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 33
    Par défaut
    Ah tiens, j'avais pas vu que les wrappers sous cet angle là!

    Cette methode me plait bien!

    Par contre, une remarque:


    Citation Envoyé par adiGuba
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public final class MonObjetWrapper {
     
    	private final MonInterface inner;
     
    	public MonObjetWrapper(MonInterface inner) {
    		this.inner = inner;
    	}
     
    	public String getName() {
    		return this.inner.getName();
    	}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonInterface wrapper = new MonObjetWrapper(obj);
    Il faudrait que la classe MonObjetWrapper implemente MonInterface, non?

  6. #6
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par guams
    Il faudrait que la classe MonObjetWrapper implemente MonInterface, non?
    Oui bien sûr ! C'est ce que je comptais faire à l'origine mais j'ai dû oublier cela quand j'ai tapé le code

    a++

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 33
    Par défaut
    Citation Envoyé par guams
    4- Enfin, peut on parler de sécurité des données si mon plugin peut récupérer une instance de mon application par un simple Application.getApplication(), lui permettant ensuite d'attaquer directement mes données?
    Est ce un problème de conception initiale de mon appli?
    Mon petit doigt me dit que pour ce problème là, il doit y avoir quelque chose à faire avec le security manager, en ajoutant des permissions sur ce genre de methode statiques qui empecheraient de les appeler depuis des classes chargées avec un autre ClassLoader que celui qui charge mon appli!

    Ceci dit, mon petit doigt n'y connait pas grand chose en SecurityManager et il vous demande donc si ca vaut le coup de poursuivre les investigations dans cette voie!?

Discussions similaires

  1. Conception d'un systeme de "plugin"
    Par ruda.tom dans le forum Plateformes réactives et architectures modulaires
    Réponses: 2
    Dernier message: 21/02/2007, 21h43
  2. Comment concevoir un systeme de plugin avec java
    Par ghassen_ing dans le forum Langage
    Réponses: 6
    Dernier message: 16/10/2006, 13h29
  3. [Conception] Gestion de "plugins"
    Par Tentative dans le forum Général Java
    Réponses: 4
    Dernier message: 06/01/2006, 19h55
  4. [Conception][graphisme] réaliser un système "d'anchor" (ancre)
    Par pierre.zelb dans le forum Général Java
    Réponses: 2
    Dernier message: 25/07/2005, 16h19
  5. Réponses: 13
    Dernier message: 20/06/2005, 14h13

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