200 likes | 305 Views
Semantics-based Crosscutting for Message Invocations in AspectJ. Karl Lieberherr. Crosscuts. Crosscuts are defined in terms of key events in the execution of Java programs. We focus on message invocations.
E N D
Semantics-based Crosscutting for Message Invocations in AspectJ Karl Lieberherr
Crosscuts • Crosscuts are defined in terms of key events in the execution of Java programs. • We focus on message invocations. • A message is used to refer to the combination of a method name, its result type and the types of its parameters.
A simple aspect crosscut gets(): (Point & (int getX() | int getY() | new())) | (Line & (Point getP1() | Point getP2() | new())) static advice(): gets() { after { log.write(“A point or line was accessed or constructed”); } }
Constraints • There are classes Point and Line. • Point has getX() and getY() and a constructor without parameters • Line has getP1() and getP2() and a constructor without parameters
Example 3: Count Collaboration • collaboration Counting { • participantSource{ • expectTraversalGraph getT(); • // newTraversalGraph(classGraph, • // new Strategy(“from Source to Target”)); • public int count (){ // traversal/visitor weaving • getT().traverse(this, new Visitor(){ int r; • public void before(Target host){ r++; } • public void start() { r = 0;} …) } } • // ClassGraph classGraph = new ClassGraph();
Example 3: Count Collaboration • participantTarget{} • } Use in Bus simulation example: Source -- BusRoute Target -- Person
Resulting Java Program • classBusRoute{ • // newTraversalGraph(classGraph, • // new Strategy(“from BusRoute via BusStop to Person”)); • public int count (TraversalGraph getT){ • getT.traverse(this, new Visitor(){ int r; • public void before(Person host){ r++; } • public void start() { r = 0;} …) } • } • // ClassGraph classGraph = new ClassGraph();
Exercise: simulate traversal-visitor style in AspectJ • Write traversal methods tr1 manually. • For each visitor entry: write crosscut and advice: crosscut forTarget_tr1(Target h): h & void tr1(); static advice(Target h): forTarget_tr1(h){ after { … /* use h */ }}
Exercise: simulate collaborations/ adapters with AspectJ • Expand each adapter class Logging { crosscut gets(): (Point & (int getX() | int getY() | new())) | (Line & (Point getP1() | Point getP2() | new())) static advice(): gets() { after { log.write(“A point or line was accessed or constructed”); } } }
Corresponding collaboration collaboration Logging { participant DataToLog { expect methodToLog(); expect stringToPrint(); replace methodToLog(){ expected(s); log.write(stringToPrint();}}}
Corresponding adapter adapter LoggingUse { Point is Logging.DataToLog with { methodToLog() = {int getX(), int getY(), new()} stringToPrint() { return(“Point accessed or constructed”);}} Line is Logging.DataToLog with { methodToLog() = {Point getP1(), Point getP2(), new()} stringToPrint() { return(“Line accessed or constructed”);}}}
Using Abstract Crosscuts for Reusability of Aspects abstractpublicclass AbstractLogAndIgnore { abstractcrosscut methods(); staticadvice methods() { catch {RemoteException e) { ErrorLog.print(“remote call failed in:” + thisMethodName + “:” + e); } } }
Instantiate through Subclassing publicclass JWAMRemoteExceptionHandler extends AbstractLogAndIgnore{ crosscut methods(): RegistryServer & * *(..) | RMIMessageBrokerImpl & private * * (..); }
Adapters versus Abstract Crosscuts • With crosscut refinement we can only specify the details of crosscuts. • With adapters we can do more: specify crosscut details and implement the expected methods. • But we can also introduce implementations of abstract methods through subclassing. Does not work: Method of aspect not participant.
Collaborations/adapters in AspectJ • Works if adapter is pure crosscut: E.g.: methodToLog() = {int getX(), int getY(), new()}
From AspectJ to collaborations/adapters • Static advices go into collaborations (replaced methods) • Crosscuts go into adapters • What do we do about crosscut signatures? We can have arguments in replaced methods.
Mappings • One participant to several classes • AspectJ: mention classes in crosscut • CA: {X,Y,Z} is Collab.P or multiple X is ... • One method to several methods • AspectJ: enumerate them or use wildcards • CA: enumerate them or use wildcards
Conclusions • Collaborations and adapters can not be easily expressed in AspectJ. • Instantiated collaborations can be expressed in AspectJ.
How does AspectJ help in implementing collaborations/adapters? • Implements wildcards • Implements advices (around), Implements replace • What if AspectJ work stops? Source code available?
Adaptive software consists of three parts: • succinct constraints C on customizers • initial behavior specications expressed in terms of C • behavior enhancements expressed in terms of C