Intégration OSGi et AspectJ

View more Tutorials:

1- Introduction

Ce document a été rédigé sur la base  :
 
  • Eclipse 4.7, 4.6 (OXYGEN, NEON)

1.1- Suggest

Assurez-vous que votre  Eclipe a été installé  Ajdt Plugin , si vous n'avez pas installé vous pouvez consulter les documents suivants  :
 

2- Le modèle de l'exemple

Exemples de modèles comprennent trois Project 
 
  • target-runtime  
  • osgi-define-aspectj
  • affected-osgi
  1. osgi-define-aspectj
    •  C'est un osgi project  tant aspectj project incluant définissant un aspectj est SumAspectj.aj
  2. affected-osgi
    • C'est un osgi project et n'est pas aspectj project. Il dépend osgi-define-aspectj, et prennent effet dans le projet sont définis ci-dessus. 

3- Project target-runtime

Créer un projet java régulière, avec le nom « cible-runtime » ( target-runtime):
  • File/New/Other
Copy:
  • http://download.eclipse.org/tools/ajdt/47/dev/update/       (Eclipse 4.7 OXYGEN)
  • http://download.eclipse.org/tools/ajdt/46/dev/update/       (Eclipse 4.6 NEON)
Enfin, cliquez sur "Définir comme Target Runtime" ( Set As Target Runtime) à la bibliothèque d'exécution sur l'effet global du projet sur Workspace.

4- Project "osgi-define-aspectj"

Créer project "osgi-define-aspectj":
  • File/New/Other..
  • org.o7planning.tutorial.osgidefineaspectj.Activator
Convertir ce projet en aspectj projet :
Le résultat de la conversion :
 
 
Nous allons créer quelques-uns classes et un  aspectj pour obtenir un résultat tel qu'illustré ci-dessous  :
 
Tout d'abord, ajoutez l'aspectj " SumAspecj" et cliquez sur Eclipse:
 
  • File/New/Others...
  • Package: org.o7planning.tutorial.osgidefineaspectj
  • Name: SumAspectj
SumAspectj.aj
package org.o7planning.tutorial.osgidefineaspectj;

public aspect SumAspectj {
 
  before() : execution(* *.sum(..)) {
      System.out.println("Before execution sum");
  }
 
}
MathUtils.java
package org.o7planning.tutorial.osgidefineaspectj;

public class MathUtils {
   
   public static int sum(int a, int b) {
       return a + b;
   }
}
TestSumInternal.java
package org.o7planning.tutorial.osgidefineaspectj;

public class TestSumInternal {
   
   public static void main(String[] args) {
       
       int value= MathUtils.sum(10,20);
       System.out.println("Value ="+value);

   }

}
Exécuter la classe  TestSumInternal et les résultats montrent que chaque fois que la méthode a au nom "sum" a été exécuté  SumAspectj fonctionnera et il enregistre des lignes de texte "avant la somme de l'exécution"(" Before execution sum")
Ensuite, nous déclarons 'export package' et 'aspectj' pour les autres osgi peuvent utiliser.
Donc, jusqu'à présent, nous avons créé est un projet osgi avec la participation d'aspectj . Et exécutez avec succès à l'intérieur de l'osgi.
Cependant chaque  bundle  osgi utilise  son ClasssLoader, donc  aspectj fonctionne uniquement en intérieur de cet  osgi. Pour le faire fonctionner un autre  osgi  bundle, nécessite une certaine configuration. Faisons un projet à l'autre de sorte qu'il soit influencé par le projet déclaré dans le  project.

5- Project "affected-osgi"

De même, vous créez un autre projet  osgi à avec le nom de "affected-osgi" .
Déclarez-le dépende d' osgi  « osgi-définir-aspectj ». Et deux  bundle  :
  • org.eclipse.equinox.console
  • org.apache.felix.gogo.shell
Math2Utils.java
package org.o7planning.tutorial.affectedosgi;

public class Math2Utils {
   
   
   public static float sum(float a,float b)  {
       return a+b;
   }
   
   public static int sum(int a, int b)  {
       return a+b;
   }  
   
}
Activator.java
package org.o7planning.tutorial.affectedosgi;

import org.o7planning.tutorial.osgidefineaspectj.MathUtils;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

public class Activator implements BundleActivator {

   private static BundleContext context;

   static BundleContext getContext() {
       return context;
   }

   public void start(BundleContext bundleContext) throws Exception {
       Activator.context = bundleContext;

       this.testSumAspectj();
   }

   private void testSumAspectj() {
       System.out.println("-----------------------");
       int value1 = MathUtils.sum(100, 100);
       System.out.println("Value =" + value1);

       System.out.println("-----------------------");
       int value2 = Math2Utils.sum(100, 100);
       System.out.println("Value =" + value2);

       System.out.println("-----------------------");
       float value3 = Math2Utils.sum(100f, 100f);
       System.out.println("Value =" + value3);
   }

   public void stop(BundleContext bundleContext) throws Exception {
       Activator.context = null;
   }

}
Maintenant, nous allons configurer pour exécuter osgi  "affected-osgi".
  1. Nomez la configuration pour exécuter l'application est de "Exécuter projet-osgi affecté"
    (Run affected-osgi project)
  2. Cocher sélectionnez vos projets 2.
  3. Décochez toutes Target Platform
  4. Cliquez sur "Add Required Bundles" pour Eclipse calcule automatiquement que les bundles dépendent.
  5. Cliquez sur Apply
Résultats  osgi en cours d'exécution du projet « touchés-osgi » ( affected-osgi)pour obtenir les résultats  :
Les résultats ont montré qu' aspectj  « SumAspectj » définie dans le « osgi-défine-aspectj » pas encore influencé l'autre osgi . Ensuite, nous allons continuer à s'assurer que la configuration est «  SumAspectj » affectera i  "affected-osgi".
Ajoutez les déclarations des  bundles qui demandent à  osgi  "affected-osgi".
  1. org.eclipse.osgi
  2. org.aspectj.weaver
  3. org.eclipse.equinox.weaving.aspectj
  4. org.eclipse.equinox.weaving.caching
  5. org.eclipse.equinox.ds
Déclaration de paramètre d'environnement en cours d'exécution:
  • -Dosgi.framework.extensions=org.eclipse.equinox.weaving.hook  
  • -Daj.weaving.verbose=true
  • -Dorg.aspectj.weaver.showWeaveInfo=true
  • -Dorg.aspectj.osgi.verbose=true
Déclarez morceaux (fragments) pour l'expansion d'osgi   org.eclipse.osgi.
  • -Dosgi.framework.extensions=org.eclipse.equinox.weaving.hook
Les lignes suivantes vous pouvez également ajouter pour chercher des fautes (Debug):
  • -Daj.weaving.verbose=true
  • -Dorg.aspectj.weaver.showWeaveInfo=true
  • -Dorg.aspectj.osgi.verbose=true
 Assurez que bundle: org.eclipse.equinox.weaving.aspectj a é té automatiquement start à Level 2.
Enfin, vous exécutez osgi « touchés-osgi »  "affected-osgi" et Voici les résultats que vous attendez.

View more Tutorials: