Sommaire
<<
Problématiques (concern)
<
Applications: AspectJ et JAC
>
Le projet JAC
>>
Liens / Contacts


Applications

De nombreux projets de recherche visant à implanter les paradigmes de la POA sont désormais bien avancés et proposent des outils puissants permettant leur mise en œuvre.
Dans le domaine des langages ouverts et réflexifs : OpenC++, OpenJava, Javassist, …
Dans le domaine des ORB, AspectIX…
De plus, les dernières générations des outils modernes tendent désormais à intégrer de plus en plus de possibilités pour le support des aspects en standard. Ces possibilités, qui ne sont pas encore bien comprises par l'industrie, ne demandent qu'à être exploitées dans le cadre d'une méthodologie et d'un environnement de développement cohérents.

Il existe plusieurs projets d'implémentation de la POA, en Java notamment.
Le deux plus performants actuellement sont AspectJ et Java Aspect Components (JAC), le plus récent.


Le projet POA le plus célèbre demeure sans nul doute AspectJ
AspectJ est une implémentation open-source pour Java du Xerox PARC.
AspectJ est une extension du langage Java qui définit une sémantique permettant de mettre en place les concepts POA.
AspectJ fournit les outils de compilation, débugging et de documentation du code.
Le compilateur d’AspectJ construit une classe compatible avec les spécifications du bytecode Java, permettant à une JVM d’interpréter cette classe.
=> Explications techniques <=

AspectJ
JAC
Extension du langage JAVA
Framework POA, serveur d’applications
Nouvelle grammaire pour les aspects
Aspects écrits en Java pur
Utilise le code source.
Chaque modification nécessite une nouvelle compilation
Un bytecode permet l’ajout, la suppr. et la modification dynamique des aspects
Ne gère pas la distribution
Distribue automatiquement les aspects sur des serveurs distants
Ne permet que le développement d’aspects
Permet le développement d’aspects et/ou leur configuration à chaud
Atelier UML supportant les aspects

Un serveur + un atelier UML + une IHM de configuration.
S’intègre à JBuilder, Forte et Emacs.

Pas d’aspects pré-développés
Bibliothèque d’aspects pré-développés configurables
Version 1.0.5
Version 0.8.1
Open Source Mozilla Public License
Disponible en licence LGPL

JAC apporte des solutions aux défauts d'AspectJ
Ce n’est pas un nouveau langage avec une nouvelle grammaire pour coder les aspects. Les aspects sont écrits en Java pur, évitant ainsi l’apprentissage d’une nouvelle syntaxe et l’introduction d’un compilateur supplémentaire.
JAC permet d’ajouter ou d’enlever les aspects dynamiquement. Cette fonctionnalité est très utile lors du développement ou de la maintenance de l’application. Il est par exemple possible de modifier les caractéristiques de cohérence ou de synchronisation de vos objets, sans redémarrer le serveur.
JAC distribue automatiquement les aspects sur les serveurs distants. Ce qui permet aux aspects JAC de gérer des préoccupations telles que le déploiement, la cohérence des données, la tolérance aux pannes ou la montée en charge.
Il propose deux niveaux de granularités:
Le premier niveau est le niveau de programmation. C’est le même niveau qu’AspectJ, il permet de programmer de nouveaux aspects. Ce niveau requiert des compétences poussées en POA.
Le second niveau est le niveau de configuration. Il permet aux développeurs de configurer les aspects existants afin qu’ils répondent aux exigences de leur application. Ce niveau ne demande pas de compétences particulières en POA et peut être facilement utilisé par n’importe quel développeur Java.
JAC est aussi un serveur d’applications orienté aspect.
=> Explications techniques: § JAC / Technique <=

Explications techniques du fonctionnement d'AspectJ

AspectJ utilise le langage Java pour implémenter les besoins individuels, et spécifie une extension de Java pour les règles de tramages. Ces règles sont spécifiées en termes de pointcuts, joinpoints, advice et aspects.
Les joinpoints définissent des points spécifiques dans l’exécution d’un programme, le pointcut est le constructeur de langage qui permet de spécifier les joinpoints, et advice définit les portions d’un aspect qui doivent être exécutées lors de pointcuts.
Un aspect combine ces trois primitives.
On peut créer et modifier des aspects; en prime, AspectJ autorise également à "aspecter" des classes. Concrètement, il est possible d’introduire de nouvelles données membres et de nouvelles méthodes, tout comme on peut déclarer qu’une classe implémente d’autres classes ou interfaces.
L’AspectJ weaver, un compilateur aspect, combine ensemble les différents aspects.
Comme le système final créé par le compilateur AspectJ est un byte code pur, il ne peut être utilisé que sur une Java Virtual Machine (JVM) compatible.
AspectJ comporte un certain nombre d’outils tel qu'un débogueur et une intégration aux environnements de développement.

Dans la partie technique de ce site, nous nous interressons uniquement à JAC.
Pour un complément d'information sur AspectJ, voici une implémentation de l’unité de log pour un tramage quelconque.
Ne vous inquiétez pas si vous ne comprenez pas tout en détail.
L’essentiel est de noter que le système de gestion de carte bancaire n’est en rien au courant du log effectué.

public aspect LogCreditCardProcessorOperations
{ Logger logger = new StdoutLogger();

pointcut publicOperation():
execution(public * CreditCardProcessor.*(..));

 

pointcut publicOperationCardAmountArgs(CreditCard card, Money amount):
publicOperation() && args(card, amount);

before(CreditCard card, Money amount):
publicOperationCardAmountArgs(card, amount)
{ logOperation("Starting", thisjoin point.getSignature().toString(), card, amount);
}

 

after(CreditCard card, Money amount) returning:
publicOperationCardAmountArgs(card, amount)
{ logOperation("Completing", thisjoin point.getSignature().toString(), card, amount);
}

after (CreditCard card, Money amount) throwing (Exception e):
publicOperationCardAmountArgs(card, amount)
{ logOperation("Exception " + e, thisjoin point.getSignature().toString(), card, amount);
}

 

private void logOperation(String status, String operation, CreditCard card, Money amount)
{ logger.log(status + " " + operation + " Card: " + card + " Amount: " + amount);
}
}


Sommaire
<<
Problématiques (concern)
<
Applications: AspectJ et JAC
>
Le projet JAC
>>
Liens / Contacts