strongrelaxaj : integrating adaptability of relaxaj and expressiveness of strongaspectj

23
StrongRelaxAJ: integrating adaptability of RelaxAJ and expressiveness of StrongAspectJ Tomoyuki Aotani Manabu Touyama and Hidehiko Masuhara University of Tokyo, Japan Early stage work

Upload: luann

Post on 25-Feb-2016

49 views

Category:

Documents


0 download

DESCRIPTION

Early stage work. StrongRelaxAJ : integrating adaptability of RelaxAJ and expressiveness of StrongAspectJ. Tomoyuki Aotani Manabu Touyama and Hidehiko Masuhara University of Tokyo, Japan. Background: improving typ e-safety and expressiveness of around advice. AspectJ [Kiczales’01]. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: StrongRelaxAJ : integrating adaptability of  RelaxAJ  and expressiveness of  StrongAspectJ

StrongRelaxAJ: integrating adaptability of RelaxAJ and expressiveness of StrongAspectJ

Tomoyuki AotaniManabu Touyama and Hidehiko Masuhara

University of Tokyo, Japan

Early stage work

Page 2: StrongRelaxAJ : integrating adaptability of  RelaxAJ  and expressiveness of  StrongAspectJ

Background: improving type-safety and expressiveness of around advice

AspectJ[Kiczales’01]

RelaxAJ[Masuhara’10]

StrongAspectJ[De Frain’08]

StrongRelaxAJ

Safe & flexible

genericSafe &generic

flexible

Page 3: StrongRelaxAJ : integrating adaptability of  RelaxAJ  and expressiveness of  StrongAspectJ

void showPreview(Frame mainWin){ JDialog popup= new JDialog(mainWin); JButton close=new JButton("close"); popup.getContentPane().add(close); popup.setVisible(true);}

Background – AspectJ is less flexible:changing a JDialog to a JWindow

JWindow popup= new JWindow(mainWin);

Replace with JWindow:

JWindow around(Frame f): call(JDialog.new(Frame))&&args(f){ new JWindow(f);}

Wrong

JDialog JWindow

Component

WindowRPC

Page 4: StrongRelaxAJ : integrating adaptability of  RelaxAJ  and expressiveness of  StrongAspectJ

Background – AspectJ is less flexible: JDialog cannot be replaced due to types

JWindow around(Frame f): call(JDialog.new(Frame))&&args(f){ new JWindow(f);}

JDialog JWindow

Component

WindowRPC

Must be a subtypeof JDialog in AspectJ

• forall Rs. Ra <= Rs must be hold– Rs: return type of a join point shadow– Ra: return type of around advice

new JDialog(mainWin);

Not satisfied!

apply

Page 5: StrongRelaxAJ : integrating adaptability of  RelaxAJ  and expressiveness of  StrongAspectJ

Background – RelaxAJ[Masuhara’10]:accepting any type if safely used

• forall Rs. Ra <= Rs is NOT required– Rs: return type of a join point shadow– Ra: return type of around advice

• Instead, Ra must be a subtype of all the usage types of the returned value– receiver’s type of a method call– field’s type of a field set

Page 6: StrongRelaxAJ : integrating adaptability of  RelaxAJ  and expressiveness of  StrongAspectJ

Background – RelaxAJ[Masuhara’10]:accepting any type if safely used

void showPreview(Frame mainWin){ JDialog popup= new JDialog(mainWin); JButton close=new JButton("close"); popup.getContentPane() .add(close); popup.setVisible(true);}

JWindow around(Frame f): call(JDialog.new(Frame))&&args(f){ return new JWindow(mainWin);}

RelaxAJcompiler

used as RPC

used as ComponentJDialog JWindow

Component

WindowRPC

OK!

collect usage types of returned value

check relation

Page 7: StrongRelaxAJ : integrating adaptability of  RelaxAJ  and expressiveness of  StrongAspectJ

Problems of RelaxAJ

• Lack of expressiveness:return type of around advice must be a single class

• Strange typing:signature of proceed is the same to the one of around advice– Same to AspectJ

Page 8: StrongRelaxAJ : integrating adaptability of  RelaxAJ  and expressiveness of  StrongAspectJ

Problems of RelaxAJ

• Lack of expressiveness:return type of around advice must be a single class

• Strange typing:signature of proceed is the same to the one of around advice– Same to AspectJ

Page 9: StrongRelaxAJ : integrating adaptability of  RelaxAJ  and expressiveness of  StrongAspectJ

void showPreview(Frame mainWin){ JDialog popup= new JDialog(mainWin); JButton close=new JButton("close"); popup.getContentPane().add(close); popup.setVisible(true);}

Extended example: replacing a JDialog with a JWindow conditionally

JWindow popup= new JWindow(mainWin);

Replace with JWindow:

if DECORATE is false

JWindow around(Frame f): call(JDialog.new(Frame))&&args(f){ if(DECORATE) return proceed(f); else return new JWindow(f);}

Wrong

Page 10: StrongRelaxAJ : integrating adaptability of  RelaxAJ  and expressiveness of  StrongAspectJ

void showPreview(Frame mainWin){ JDialog popup= new JDialog(mainWin); JButton close=new JButton("close"); popup.getContentPane().add(close); popup.setVisible(true);}

Extended example: replacing a JDialog with a JWindow conditionally

JWindow popup= new JWindow(mainWin);

Replace with JWindow:

if DECORATE is false

JWindow around(Frame f): call(JDialog.new(Frame))&&args(f){ if(DECORATE) return proceed(f); else return new JWindow(f);}

Wrong

returns JDialog not JWindow

What can be the return type?JDialog JWindow

Component

WindowRPCnot subtype

Page 11: StrongRelaxAJ : integrating adaptability of  RelaxAJ  and expressiveness of  StrongAspectJ

Problem 1: no suitable return typefor the advice

void showPreview(Frame mainWin){ JDialog popup= new JDialog(mainWin); JButton close=new JButton("close"); popup.getContentPane().add(close); popup.setVisible(true);}

JDialog JWindow

Component

WindowRPC

T around(Frame f): call(JDialog.new(Frame))&&args(f){ if(DECORATE) return proceed(f); else return new JWindow(f);}

Return type T should be:• T <: RPC• T <: Window• JWindow <: T• JDialog <: T

No such type!

Page 12: StrongRelaxAJ : integrating adaptability of  RelaxAJ  and expressiveness of  StrongAspectJ

Problems of RelaxAJ

• Lack of expressiveness:return type of around advice must be a single class

• Strange typing:signature of proceed is the same to the one of around advice– Same to AspectJ

Page 13: StrongRelaxAJ : integrating adaptability of  RelaxAJ  and expressiveness of  StrongAspectJ

Extended example:making a JDialog modal

void showPreview(Frame mainWin){ JDialog popup= new JDialog(mainWin); JButton close=new JButton("close"); popup.getContentPane().add(clase); popup.setVisible(true);}

JDialog d= new JDialog(mainWin);d.setModal(true);JWindow popup= new JWindow(mainWin);

Make the JDialog modaland use JWindow as a popup

JWindow around(Frame f): call(JDialog.new(Frame))&&args(f){ proceed(f).setModal(true); return new JWindow(f);}

JDialog JWindow

Component

WindowRPC

Wrong

Page 14: StrongRelaxAJ : integrating adaptability of  RelaxAJ  and expressiveness of  StrongAspectJ

Problem 2: return types of around advice and its proceed are the same

void showPreview(Frame mainWin){ JDialog popup= new JDialog(mainWin); JButton close=new JButton("close"); popup.getContentPane().add(clase); popup.setVisible(true);}

JDialog d= new JDialog(mainWin);d.setModal(true);JWindow popup= new JWindow(mainWin);

Make the JDialog modaland use JWindow as a popup

JWindow around(Frame f): call(JDialog.new(Frame))&&args(f){ proceed(f).setModal(true); return new JWindow(f);}

JDialog JWindow

Component

WindowRPC Sig. of proceed:Frame -> JWindow

Wrong

But it never returns JWindow!

Page 15: StrongRelaxAJ : integrating adaptability of  RelaxAJ  and expressiveness of  StrongAspectJ

Our solution: StrongRelaxAJ

• Extending RelaxAJ with– Bounded type variables:

representing “some type thatcan be used as type A and B”

– Explicit signature of proceed:specifying the return type ofproceed

• These features are found in StrongAspectJ– StrongRelaxAJ may= StrongAspectJ + RelaxAJ

<T extends A&B>Ra around() : pointcut() : Rp proceed() { ....}

Advice in StrongRelaxAJ:

Page 16: StrongRelaxAJ : integrating adaptability of  RelaxAJ  and expressiveness of  StrongAspectJ

Type variables: representing “some type that can be used as type A and B”

void showPreview(Frame mainWin){ JDialog popup= new JDialog(mainWin); JButton close=new JButton("close"); popup.getContentPane().add(close); popup.setVisible(true);}

JWindow popup= new JWindow(mainWin);

Replace with JWindow:

<T extends Component & RPC>T around(Frame f): call(JWindow.new(Frame))&&args(f){ if(!DECORATE) return proceed(f); else return new JWindow(f);}

Some type that be used asComponent and RPC

if DECORATE is false

JDialog JWindow

Component

WindowRPC JDialog as T

JWindow as T

Page 17: StrongRelaxAJ : integrating adaptability of  RelaxAJ  and expressiveness of  StrongAspectJ

Explicit signature of proceed:specifying the return type of proceed

void showPreview(Frame mainWin){ JDialog popup= new JDialog(mainWin); JButton close=new JButton("close"); popup.getContentPane().add(clase); popup.setVisible(true);}

JDialog d= new JDialog(mainWin);d.setModal(true);JWindow popup= new JWindow(mainWin);

Make the JDialog modaland use JWindow as a popup

JWindow around(Frame f): call(JDialog.new(Frame))&&args(f) : JDialog proceed(Frame){ proceed(f).setModal(true); return new JWindow(f);}JDialog JWindow

Component

WindowRPCSig. of proceed:Frame -> JDialog

OK!

Page 18: StrongRelaxAJ : integrating adaptability of  RelaxAJ  and expressiveness of  StrongAspectJ

Relationship between the return types of advice and proceed

language relationshipAspectJ Ra == Rp

<: RsStrongAspectJ Ra <: Rs <:

RpRelaxAJ Ra == Rp &

forall i. Ra <: Ui

StrongRelaxAJ Rs <: Rp &forall i. Ra <: Ui

o=(Rs)e;((U1)o).m1();((U2)o).m2();

Ra around(): match(Rs e) : Rp proceed(){ …}• Rs: ret. type of shadow• Ra: ret. type of advice• Ui: usage type of advice return

Page 19: StrongRelaxAJ : integrating adaptability of  RelaxAJ  and expressiveness of  StrongAspectJ

Experiments: # of application chances in applications

total usage type > 1 %

jEdit 42450 72 0.17

JHotDraw (DrawApp) 4668 2 0.04

jython 41980 60 0.14

antlr 8807 4 0.05

freemind 27436 17 0.06

• Counted the number of variables that is used as more than 2 types in Shimple (SSA) by using Soot[Vallée-Rai’99]

A few, but not none!

Page 20: StrongRelaxAJ : integrating adaptability of  RelaxAJ  and expressiveness of  StrongAspectJ

Conclusions and future work

• StrongRelaxAJ:an extension to RelaxAJ with– Bounded type variables– Explicit signature of proceed

• A few chances to apply StrongRelaxAJ aspects according to the result of preliminaly experiments

• Future work includes– Completing type-checking rule– Discussing type-safety formally– Mining useful examples from real applications

Page 21: StrongRelaxAJ : integrating adaptability of  RelaxAJ  and expressiveness of  StrongAspectJ
Page 22: StrongRelaxAJ : integrating adaptability of  RelaxAJ  and expressiveness of  StrongAspectJ

Type-checking the return types of proceed and advice

o=(Rs)e;((U1)o).m1();((U2)o).m2();

Ra1 around(): match(Rs e) : Rp1 proceed(){ …}

Ra2 around(): match(Rs e) : Rp2 proceed(){ …}

• Ra2 <= Rp1• Rs <= Rp1• Ra1 <= U1• Ra1 <= U2

• Ra1 <= Rp2• Rs <= Rp2• Ra2 <= U1• Ra2 <= U2

Independent of order(precedence)

Page 23: StrongRelaxAJ : integrating adaptability of  RelaxAJ  and expressiveness of  StrongAspectJ

Background: around advice is usefulchanging Window to JWindow

void showPreview(Frame mainWin){ Window popup= new Window(mainWin); ...}

JWindow popup= new JWindow(mainWin);

Replace with JWindow:

JWindow

Component

WindowRPC

JWindow around(Frame f): call(Window.new(Frame))&&args(f){ new JWindow(mainWin);}