Java Aspect Components (JAC) Java Aspect Components (JAC) 2 JAC http://jac.objectweb.org Un framework de programmation par aspect pour Java Projet LIP6/CNAM/INRIA du consortium ObjectWeb Lionel Seinturier Objectifs [email protected] Ö disposer d'un environnement pour la construction orientée aspects Université Pierre & Marie Curie Ö de plates-formes et d’applications middleware Ö dynamique, reconfigurable Ö sans extension syntaxique (Java pur) Ö permettant d’adapter du bytecode Ö proposant des outils pour gérer la composition d’aspects 23/2/06 Java Aspect Components (JAC) Java Aspect Components (JAC) 3 4 JAC Open container JAC ¾ business + aspect code: 100% Java ¾ API for aspects definition ¾ dynamic chains of aspects Tisser un aspect = déployer un ensemble d'objets (implantant un aspect) sur les objets d'une application de base JAC weaver Librairie d’aspects disponibles dans JAC (19) ¾ class loader ¾ business + aspects code ¾ bytecode manipulator JAC weaver accessibility ¾ locally ¾ remotely (RMI & CORBA itfs) Ö Ö Ö Ö Ö Ö Ö déploiement/communication distantes (RMI & CORBA) persistance des données (JDBC, fichiers, Hibernate) transaction (JOTM) cache réplication, équilibrage de charge authentification, gestion de profils utilisateur GUI (Swing & HTML) Java Aspect Components (JAC) Java Aspect Components (JAC) 5 6 JAC Aspect GUI Swing JAC Aspect GUI HTML But : séparer le code de présentation du code métier Ö architecture MVC « aspectisée » Java Aspect Components (JAC) Java Aspect Components (JAC) 7 8 JAC IDE Development process UMLAF ¾ project management ¾ extended UML notation for aspects aspect developer development of configurable aspects (persistence, transaction, …) integrator development of Business components write configurations set of aspect components set of aspect configurations deployment JAC container set of business components business developer Java Aspect Components (JAC) Java Aspect Components (JAC) 9 10 Support pour la distribution Notion de coupe distribuée - notion de coupe distribuée - aspect de communication distante - aspects pour la programmation répartie - ensemble de points de jonctions localisés sur +sieurs hôtes - gérée par un AspectManager - réplication, cohérence, diffusion, cache, équilibrage charge - répliqué - maintenu en cohérence Java Aspect Components (JAC) Java Aspect Components (JAC) 11 12 Aspect de communication distante Modèle de programmation de JAC - gestion des communications distantes (2 versions : RMI, CORBA) - déploiement (instantiation à distance) Objets métiers inchangés Une classe d’aspect 9 étend org.objectweb.jac.core.AspectComponent 9 définit des coupes (appel méthode pointcut héritée) 9 définit des méthodes d’aspect 9 définit des méthodes de configuration - objets et d’aspects - souches clientes et squelettes serveurs stub/skel Méthodes d’aspects dans des classes dites Wrapper wrapper o1 o2 JAC host 1 9 étend org.objectweb.jac.core.Wrapper 9 3 « catégories » de méthodes remote o2 JAC host 2 9 wrappantes (before/after) 9 de rôle (augmentation de l’interface des objets métiers) 9 de traitement d’exceptions Java Aspect Components (JAC) Java Aspect Components (JAC) 13 14 Modèle de programmation de JAC Aspect definition & Pointcut descriptor ¾ aspect definition ¾ pointcut descriptor ¾ advice code ¾ metadata ¾ aspect configuration ¾ application description import org.objectweb.jac.core.AspectComponent; public class MyTraceAC extends AspectComponent { public MyTraceAC() { pointcut( // define a pointcut ".*", "my.MyClass", "get():int", "foo.jac.com", // // // // MyWrapper.class object regexp class regexp method regexp host regexp method regexp eg: get.* || set.* keywords: SETTERS, MODIFIERS, … // wrapping class ); } } Java Aspect Components (JAC) Java Aspect Components (JAC) 15 16 Mots-clés pour les expressions régulières de méthodes Expressions régulières d’objets Classes analysées par JAC au chargement (parsing du bytecode) Stockage de l’information dans un référentiel propre à JAC Objets métiers dans un conteneur JAC nommés STATICS CONSTRUCTORS MODIFIERS ACCESSORS SETTERS(…) GETTERS(…) ADDERS(…) REMOVERS(…) ¾ automatiquement (nom de classe + indice auto-incrémenté) ¾ par un aspect de nommage Exemple d’utilisation modification de l’état (champs public) lecture de l’état écrivains d’un champ lecteurs d’un champ méth. qui ajoutent un champ dans une collection idem retrait ¾ classe Account avec champ String owner ¾ tissage aspect de nommage sur tous les objets de la classe Owner ¾ récupération par introspection valeur de owner ¾ nom de l’objet ¾ utilisable dans l’expression de coupe (ex. Bob S.*) Java Aspect Components (JAC) Java Aspect Components (JAC) 17 18 Advice code Metadata Chains of wrappers around pointcuts ¾ define before/after code ¾ can be added removed dynamically Runtime structural reflection of the business code API to ¾ navigate ¾ add/remove tag on elements (class, method, field) import org.aopalliance.intercept.MethodInvocation; import org.objectweb.jac.core.Wrapper; public class MyWrapper extends Wrapper { public Object invoke( MethodInvocation mi ) throws Throwable { // ... before code ... Object ret = proceed(mi); // next wrapper // or business object // ... after code ... return ret; } } import org.objectweb.jac.core.rtti.ClassRepository; import org.objectweb.jac.core.rtti.ClassItem; import org.objectweb.jac.core.rtti.MethodItem; ClassItem ci = ClassRepository.get().getClass("my.MyClass"); MethodItem[] mi = ci.getMethods("foo"); mi[0].setAttribute( "persistent", new Boolean(true) ); Java Aspect Components (JAC) Java Aspect Components (JAC) 19 20 Aspect configuration Application description Scripting the configuration of aspects ¾ application independant (eg JDBC URL for persistence) ¾ application dependant (eg which field is persistent) ¾ sequence of calls to the aspect methods ¾ lauching code ¾ aspects initially woven Example : gui.acc setTitle myGUI "DEMO"; setSubPanesGeometry myGUI 2 HORIZONTAL {false,false}; setPaneContent myGUI 0 Object {invoices0}; addReferenceToPane myGUI invoices.Invoices invoices 1; addReferenceToPane myGUI invoices.Invoices clients 1; setPosition myGUI 0 0 60 60; setSplitterLocation myGUI 0 0.6; Example : bank.jac applicationName: distransbank launchingClass: org.objectweb.jac.samples.distransbank.Account aspects: distrans distrans.acc true Java Aspect Components (JAC) Java Aspect Components (JAC) 21 22 Lancement d'une application avec aspects 1. 2. 3. 4. 5. Ecriture des classes de base Ecriture des classes d'aspect Ecriture des fichiers (texte) de configuration d’aspects Ecriture d'un descripteur d'application (fichier texte) Lancement de l'application Java Aspect Components (JAC) 23 Conclusion JAC vs others ¾ 100% Java, no syntax extensions ¾ dynamic & remote deploy/undeploy ¾ UMLAF RAD tool (IDE, library of aspects) ¾ GUI aspect (Swing or HTML/servlet) Current developments ¾ integrating JAC-technology with component models (Fractal) Comparaison JAC/AspectJ JAC AspectJ AOP framework, application server Java language extension Aspects written in pure Java New grammar to express aspects Working on bytecode allowing to add, remove or modify aspects dynamically Working on source code Each modification needs compiling Automatically distributes aspects on distant servers Does not handle distribution Allows aspect developement and aspect configuration Only allows aspect developement UML IDE supporting aspects IDE support for Eclipse, JBuilder, Forte, Emacs Set of pre-developed configurable aspects No pre-developed configurable aspects Current version 0.12.1 Current version 1.2.1 LGPL CPL