2009-01-26 6 views
1

J'ai 2 plug-ins d'éclipse que je construis; appelons-les plugin A et plugin B ...Limitation des données de point d'extension fournies entre les plugins

Le plugin A nécessite une licence pour fonctionner et le plugin B est gratuit dans le monde. J'ai créé un point d'extension dans le plugin B auquel le plugin A contribue (et dans certains cas remplace) les données. Je voudrais trouver un moyen de ne pas tenir compte de ces données dans le plugin B si le plugin A n'est pas sous licence (sans avoir à vérifier si le plugin peut démarrer).

Y a-t-il un tel mécanisme dans Eclipse qui me permette d'accomplir un tel exploit? Ma solution de contournement actuelle consiste à vérifier si le plugin est démarré (via le Bundle) et s'il ne tente pas de le démarrer. Si le plugin A est sans licence, je lance une exception dans la méthode start().

Répondre

0

Exigences

Alors, vous êtes en train d'écrire deux plugins.

Le plugin B a un point d'extension. Si l'utilisateur a le paquet pour le plugin A, et la licence, le plugin puis A devrait contribuer extensions au PE dans le plugin B.

approches

modèle de sécurité de OSGi est en grande partie construit sur la valeur par défaut Autorisations Java et Responsable de la sécurité. Il y a une discussion dans cette présentation de Apache Felix. Je pense qu'il serait possible de construire un système de licences autour de cela.

Vous êtes en train solution semble que cela pourrait fonctionner, mais il y a deux préoccupations:

  • arrêter un paquet de départ peut empêcher les services en cours d'enregistrement, mais il effectuer un changement dans l'extension enregistrement? c'est-à-dire les extensions enregistrées en utilisant plugin.xml. Je suppose que les services DS seraient bien, mais je devrais essayer.
  • Il se peut que l'arrêt du faisceau ne soit pas suffisant - peut-il être redémarré plus tard? Je voudrais probablement le désamorcer.
  • Un ensemble sans licence est une opportunité pour informer l'utilisateur sur les licences. Alors, comment dites-vous à l'utilisateur que le bundle n'a pas de licence, et ne pourra pas être utilisé, et btw, voici comment vous l'accordez.

Jusqu'ici vous n'avez rien dit sur la façon dont la licence doit être implémentée. Je suppose que vous opterez pour un LicenseService, ou peut-être même un singleton.

Rapportez ce que vous avez trouvé.

0

Une solution possible que je peux penser est que vous contribuez une classe du plugin A au plugin B. Puis, quand le plugin B lit les articles de contribution, il peut essayer de créer une instance de cette classe.

La classe, issue du module A, peut alors lever une exception dans le constructeur s'il n'est pas sous licence. Cela indiquera au plugin B que les informations du plugin A peuvent être ignorées.

Une implémentation possible dans le plugin B peut ressembler à ceci:

IExtensionPoint extensionPoint = registry.getExtensionPoint("mypoint"); 
    IConfigurationElement[] elements = extensionPoint.getConfigurationElements(); 
    for (int i = 0; i < elements.length; i++) { 
     try { 
     (License)elements[i].createExecutableExtension("class"); 
     // ..... Read any other items you need.... 
     } 
     catch(LicenceException e){ 
     // Plugin is invalid, do not use 
     } 
    } 
1

ne aurais pas dû vérifier sa licence elle-même et non-override/sans contribuer de données (ou passer outre de fournir des données identiques) si elle n'est pas autorisé? Pourquoi placer le fardeau de la vérification de la licence sur B quand B ne s'en soucie pas (comme c'est gratuit).

Je choisirais A pour démarrer en mode limité si la licence n'est pas trouvée. Vous pourriez également, comme l'a suggéré jamesh, donner à l'utilisateur la possibilité de fournir la licence, par ex. avec un plugin A-UI supplémentaire informant l'utilisateur de la licence manquante et de l'offre de licence.

Questions connexes