extending the field access pointcuts of aspectj to arrays
DESCRIPTION
Extending the Field Access Pointcuts of AspectJ to Arrays. Kung Chen and Chin-Hung Chien* National Chengchi University Hon Hai Precision Industry Co., Ltd*. ICS 2006 – Taipei, December 2006. Agenda. Background: Aspect-Oriented Programming (AOP) in AspectJ Motivation - PowerPoint PPT PresentationTRANSCRIPT
Extending the Field Access Pointcuts of AspectJ to Arrays
ICS 2006 – Taipei, December 2006
Kung Chen and Chin-Hung Chien*National Chengchi University
Hon Hai Precision Industry Co., Ltd*
Agenda
• Background: Aspect-Oriented Programming (AOP) in AspectJ
• Motivation
• Design Considerations
• Specification of the New Pointcuts
• Implementation
• Conclusions
Basic Mechanisms of AOP
where
Do what
aspect
Class Classadvice
weaving
pointcut
pointcut
pointcut
• Aspect• Pointcut• Advice
• Weaving
Implement Crosscutting concerns modularly
Aspects in AspectJaspect Name [extends a] { pointcut1; pointcut2; … advice1; advice2; …
fields methods}
Crosscutting points
Actions to take in matched pointcuts
Pointcut: selecting a collection of join points
Join Points Model of AspectJ, 1
• Join point is a well-defined point in a program’s execution
• Method call:public void move(int dx, int dy) { setX(_x + dx); setY(_y + dy); }
Method call join point:
Join Points Model of AspectJ, 2
• Our focus: Field reference and set join points:
public void setX(int newx) { x = newx; ..println(x); }
field set join point:field reference join point:
Agenda
• Background: Aspect-Oriented Programming (AOP) in AspectJ
• Motivation
• Design Considerations
• Specification of the New Pointcuts
• Implementation
• Conclusions
Field Access Join Points of AspectJ
• Join Points– field reference– field set
• Pointcut Designators– get(aFieldSignature)– set(aFieldSignature)
aspect GuardedX { static final int MAX_CHANGE = 100; before(int newval): set(static int T.x) && args(newval) { if (Math.abs(newval - T.x) > MAX_CHANGE) throw new RuntimeException(); }}
• Example
Limitations in Using Field Access Pointcuts
• What if the fields we are interested in are arrays?
01 public class FieldPointcuts {02 static int ar[];03 public static void main(04 String[] args) {05 ar = new int[] {100}; //set06 ar[0] = 200; //get 07 }08 }
set(* *.ar)
after() returning (int[] a) : get(* *.ar)
What We Expect
• Field access pointcuts can also be applied to array elements and further expose information on– the index values of the array element being se
t or retrieved, and– the value being set to or retrieved from the arr
ay element.
ar[0] = 200;
Related Work
• Bruno Harbulot proposed the following arrayset pointcut designator:
before(int i, Object s, Object[] a): arrayset() && args(i, s) && target(a)
{ System.out.println (" Arrayset: ["+i+"/"+(a.length-1)+"] = "+s) ; }
• The idea is to treat array element set as a call to a “set(int index, object newValue)”
Problems with Harbulot’s Work
• Ambiguous matching of join points
arrayset() && args(i, s) && target(a)
arrayset() && args(i1,i2,s) && target(a)
ss[0][1] = “two join points”;
sss[0][1][2] = “two join points, too”;
Mismatch
Mismatch
actually two assignments to two 1-D arrays on the byte-code level
actually three assignments to
three 1-D arrays on the byte-code level
Match
Agenda
• Background: Aspect-Oriented Programming (AOP) in AspectJ
• Motivation
• Design Considerations
• Specification of the New Pointcuts
• Implementation
• Conclusions
How We Address This Problem
• Fix the array target(s) of interest– only need to focus on arrays which are fields
of some class– arrays local to a method are irrelevant
• Include a specification of field signature in our array set/get pointcuts.
Requirements
• Our arrayset field set pointcut must be flexible enough to select all of them, either individually or as a group.
• Assignments to a multi-dimensional array can take several forms.
01 class Watch { 02 String [][][] sss= new [2][2][2];03 String [][] ss= {{“x”,”y”},{“w”,”z”}}; 04 String [] s= {“abc”, “def”};05 sss[0] = ss;06 sss[0][1] = s;07 sss[0][1][1] = “change”;08 ss [0] = s;09 ss[0][1] = “Me too”;10 s[0] = ss[1][1];… }
Agenda
• Background: Aspect-Oriented Programming (AOP) in AspectJ
• Motivation
• Design Considerations
• Specification of the New Pointcuts
• Implementation
• Conclusions
New Field Access Pointcuts• Conservative extension of the standard field poin
tcuts:– arrayset(aFieldSignature)– arrayget(aFieldSignature)
• Orthogonal to other AspectJ pointcuts– target(), within() and withincode()
• All array field set join points are treated as having a variable arguments:– the sequence of index values– the value the field is being set to
arrayset(* Watch.*)
arrayget(* Watch.*)
Context Exposure, 1• Using the args() pointcut
aspect Monitor {before(int ix1, int ix2, int newVal): arrayset(* Watch.*) && args(ix1, ix2, newVal) { //advice if (newVal > B.bounds[ix1, ix2]) { ArraySetSignature sig = (ArraySetSignature)tjp.getSignature();
String field = sig.getFieldType() + sig.getName(); throws new RuntimeException("Bad change"+ field) }}
01 class Watch { 02 String [][][] sss= new [2][2][2];03 String [][] ss= {{“x”,”y”},{“w”,”z”}}; 04 String [] s= {“abc”, “def”};05 sss[0] = ss;06 sss[0][1] = s;07 sss[0][1][1] = “change”;08 ss [0] = s;09 ss[0][1] = “Me too”;10 s[0] = ss[1][1];… }
• Selective matching – assignments in Line 6 and 9 are captured.
Context Exposure, 2• Can also use the method thisJoinPoint.getArgs()
void around() : arrayset( * data.*.* ) { try { ArraySetSignature sig = (ArraySetSignature)tjp.getSignature(); Object[] args = tjp.getArgs(); Integer rhsValue = (Integer)args[args.length-1]; if (rhsValue.intValue() > MAX) { Log.add("Warning: " + sig.getName()); for (int i=0; i<args.length-1; i++) { Log.add("["+ args[i] +"]"); Log.add(" exceeds MAX"); } proceed(); } catch(IndexOutOfBoundException e) {} }
• Provides great flexibility.
Agenda
• Background: Aspect-Oriented Programming (AOP) in AspectJ
• Motivation
• Design Considerations
• Specification of the New Pointcuts
• Implementation
• Conclusions
Implementation Using the AspectBench Compiler(abc) for AspectJ
• We follow the standard steps outlined by the abc team to develop this extension.
• But the following steps are non-trivial:– Identification of join point shadow– Extension of the pointcut matcher of abc
FSM Based Shadow Matcher
Cond. #1: instanceOf(getRhs(ca), ArrayFieldRef)Cond. #2: instanceOf(getRhs(ca), ArrayRef) && equalBase(getRhs(ca), ima) && instanceOf (getLhs(ca), Local)Cond. #3: instanceOf(getLhs(ca), ArrayRef) && equalBase(getLhs(ca), ima)Cond. #4: !hasNext()
#1: $r2 = r0.<C:java.lang.Object[][][]a>#2: $r3 = $r2[0]#3: $r4 = $r3[1]#4: $r5 = new java.lang.String#5: specialinvoke $r5.<java.lang.String: void <init>(java.lang.String)>("foo")#6: $r4[2] = $r5
class C { … Object a[][][] = new Object[2][2][2]; … a[0][1][2] = new String("foo"); … }
Conclusions
• The field access pointcuts of AspectJ can be extended to expose index-value context for array fields.
• A FSM-based implementation is presented using the abc compiler for AspectJ.
• You are welcome to download it and try it yourself.
Q & A