Java Aspect Components (JAC) JAC http://jac.objectweb.org 2 Lionel Seinturier Lionel.Seinturier@lip6.fr Université Pierre & Marie Curie 23/2/06 Un framework de programmation par aspect pour Java Projet LIP6/CNAM/INRIA du consortium ObjectWeb Objectifs disposer d'un environnement pour la construction orientée aspects 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 JAC Open container 3 JAC 4 business + aspect code: 100% Java API for aspects definition dynamic chains of aspects JAC weaver class loader business + aspects code bytecode manipulator JAC weaver accessibility locally remotely (RMI & CORBA itfs) Tisser un aspect = déployer un ensemble d'objets (implantant un aspect) sur les objets d'une application de base Librairie d aspects disponibles dans JAC (19) 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)
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» 7 8 JAC IDE Development process UMLAF project management extended UML notation for aspects aspect developer development of configurable aspects (persistence, transaction, ) integrator write configurations development of Business components business developer set of aspect components set of aspect configurations set of business components deployment JAC container
Support pour la distribution 9 Notion de coupe distribuée 10 - notion de coupe distribuée - aspect de communication distante - aspects pour la programmation répartie - réplication, cohérence, diffusion, cache, équilibrage charge - ensemble de points de jonctions localisés sur +sieurs hôtes - gérée par un AspectManager - répliqué - maintenu en cohérence Aspect de communication distante 11 Modèle de programmation de JAC 12 - gestion des communications distantes (2 versions : RMI, CORBA) - déploiement (instantiation à distance) - objets et d aspects - souches clientes et squelettes serveurs wrapper stub/skel o1 o2 remote o2 JAC host 1 JAC host 2 Une classe d aspect Objets métiers inchangés étend org.objectweb.jac.core.aspectcomponent définit des coupes (appel méthode pointcut héritée) définit des méthodes d aspect définit des méthodes de configuration Méthodes d aspects dans des classes dites Wrapper étend org.objectweb.jac.core.wrapper 3 «catégories» de méthodes wrappantes (before/after) de rôle (augmentation de l interface des objets métiers) de traitement d exceptions
Modèle de programmation de JAC 13 Aspect definition & Pointcut descriptor 14 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 ".*", // object regexp "my.myclass", // class regexp "get():int", // method regexp "foo.jac.com", // host regexp method regexp eg: get.* set.* keywords: SETTERS, MODIFIERS, } } MyWrapper.class ); // wrapping class Mots-clés pour les expressions régulières de méthodes 15 Expressions régulières d objets 16 Classes analysées par JAC au chargement (parsing du bytecode) Stockage de l information dans un référentiel propre à JAC STATICS CONSTRUCTORS Objets métiers dans un conteneur JAC nommés automatiquement (nom de classe + indice auto-incrémenté) par un aspect de nommage Exemple d utilisation MODIFIERS ACCESSORS SETTERS( ) GETTERS( ) ADDERS( ) REMOVERS( ) 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.*)
Advice code 17 Metadata 18 Chains of wrappers around pointcuts define before/after code can be added removed dynamically 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; } } Runtime structural reflection of the business code API to navigate add/remove tag on elements (class, method, field) 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) ); Aspect configuration 19 Application description 20 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 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; lauching code aspects initially woven Example : bank.jac applicationname: distransbank launchingclass: org.objectweb.jac.samples.distransbank.account aspects: distrans distrans.acc true
Lancement d'une application avec aspects 21 Comparaison JAC/AspectJ 22 1. Ecriture des classes de base 2. Ecriture des classes d'aspect 3. Ecriture des fichiers (texte) de configuration d aspects 4. Ecriture d'un descripteur d'application (fichier texte) 5. Lancement de l'application JAC AOP framework, application server Aspects written in pure Java Working on bytecode allowing to add, remove or modify aspects dynamically Automatically distributes aspects on distant servers Allows aspect developement and aspect configuration UML IDE supporting aspects Set of pre-developed configurable aspects AspectJ Java language extension New grammar to express aspects Working on source code Each modification needs compiling Does not handle distribution Only allows aspect developement IDE support for Eclipse, JBuilder, Forte, Emacs No pre-developed configurable aspects Current version 0.12.1 LGPL Current version 1.2.1 CPL Conclusion 23 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)