Upload
liang
View
30
Download
0
Embed Size (px)
DESCRIPTION
Remote Pointcut - A Language Construct for Distributed AOP. Muga Nishizawa (Tokyo Tech, Japan) Shigeru Chiba (Tokyo Tech, Japan) Michiaki Tatsubori (TRL, Japan IBM). This Talk. Our goal To modularize crosscutting concerns in distributed software Motivating problem - PowerPoint PPT Presentation
Citation preview
AOSD'04, Lancaster, UK 1
Remote Pointcut- A Language Construct for Distributed AOP
Muga Nishizawa (Tokyo Tech, Japan)Shigeru Chiba (Tokyo Tech, Japan)
Michiaki Tatsubori (TRL, Japan IBM)
AOSD'04, Lancaster, UK 2
This Talk Our goal
To modularize crosscutting concerns in distributed software
Motivating problem AspectJ can separate them But, the implementation is NOT simple E.g. a test code for distributed software
Our solution Remote pointcut
AOSD'04, Lancaster, UK 3
Test Code for Distributed Authentication Service
Confirm addUser() is executed on Database when client remotely calls registerUser() Client calls registerUser(),
registerUser() calls addUser()
Authenticator
Database
registerUser()
Client
addUser()
Register a new user on a DB
AOSD'04, Lancaster, UK 4
Ideal Design for Test Code
On Client, 1. flag = false. 2. call registerUser() on Authenticator. 3. if addUser() is executed on Database,
then flag = true. 4. assert flag == true.
Authenticator
Database
registerUser()
addUser()
Client
AOSD'04, Lancaster, UK 5
Test Code in Java Crosscutting concern
Database code must be edited for test
1. Flag = false2. Call registerUser()
3. assert flag == true
class Database { void addUser() { invoke Callback … … add the user to the database } … …}
Client
Flag = true
Callback
Database
Authenticator
RMI (Remote Method Invocation)
Crosscutting concern
AOSD'04, Lancaster, UK 6
Test Code in Java and AspectJ
The concern is separated Database code is not edited
1. Flag = false2. Call registerUser()
3. Assert flag == true
Client
Flag = true
Callback
class Database { void addUser() {
… … add the user to the database }}
Database
aspect DatabaseTest { before(): execution(void addUser()){ invoke Callback }}
DatabaseTest
RMI
AOSD'04, Lancaster, UK 7
This Design is Not Satisfactory When writing the test code, we must consider two
concerns: Test Distribution
It requires to divide the code into three sub-modules Network processing (RMI) and deployment
1. flag = false.2. call registerUser() on Authenticator.
3. if addUser() is invoked on Database,
flag = true.
4. Assert flag == ture
Three distributed sub-modules
Don’t consider this!
AOSD'04, Lancaster, UK 8
Our Solution - Remote Pointcut
To identify join points in a program on a remote host To run advice on a different host from the host w
here join points are pointcut Like RMI for distributed OOP
class Database { void addUser() { … … }}
Remote pointcut
aspect Log { before() : execution(void addUser()) { System.out.println(“addUser”); }}
Identified join point
AOSD'04, Lancaster, UK 9
Test Code using a Remote Pointcut Test program is a single non-distributed module
Authenticator
1. flag = false2. call registerUser()
3. assert flag == true
before(): cflow(call(void registerUser()))&&execution(void addUser()){ flag = true}
call addUser()
Remote Pointcut
class Database { void addUser() {
} … …}
Database
AuthenticatorTest(Aspect)
call registerUser()
AOSD'04, Lancaster, UK 10
Test Code Implementationaspect AuthenticatorTest extends TestCase { boolean flag;
void testRegisterUser() { flag = false; String userId = "muga", password = "xxx"; Authenticator auth = (Authenticator) Naming.lookup("auth"); auth.registerUser(userId, password); assertTrue(flag); }
before(): // remote pointcut cflow(call(void Authenticator.registerUser())) && execution(void Database.addUser()) { flag = true; }}
When addUser() is executed, the flag is set to true
Confirms the flag is true
Calls registerUser()
Declares and initializes the flag
AOSD'04, Lancaster, UK 11
DJcutter - Distributed AOP Language
It’s an extension of AspectJ language Remote pointcut Remote inter-type declaration
Load-time weaving Aspect weaving in DJcutter is performed at loa
d-time
AOSD'04, Lancaster, UK 12
DJcutter Language Specification Pointcut
DJcutter provides pointcut designators in AspectJ Call, execution, within, target, …
Hosts(Host, …) The join points in execution on the hosts
Cflow(Pointcut) All join points that occur between the entry and exit of
each join point specified by Pointcut
Advice Before, after, and around
AOSD'04, Lancaster, UK 13
Remote Inter-type Declaration To declare methods and fields in classes
on a remote host
Database
aspect AuthenticatorTest { boolean Database.containsUser(String userId) { // If the user entry specified by userId is found // in the database. }}
boolean containsUser();
Append at load-timeAuthenticatorTest
AOSD'04, Lancaster, UK 14
Use of Remote Inter-type Declaration
aspect AuthenticatorTest extends TestCase {
void testRegisterUser() { String userId = "muga", password = "xxx"; Authenticator auth = (Authenticator) Naming.lookup("auth"); Database db = (Database) Naming.lookup(“db”); assertTrue(! db.containsUser(userId)); auth.registerUser(userId, password); assertTrue(db.containsUser(userId)); }
boolean Database.containsUser(String userId) { // If the user entry specified by userId is // found in the database. }}
Confirms that the user entry
AOSD'04, Lancaster, UK 15
DJcutter Implementation - Load-time Weaving
Aspect source file
Java bytecode
Compiler
Aspect ServerClass Loader
Class Loader
entry
Distributed software
Distributed software
weave
weave
deploy
deploy
Runtime InfrastructureRuntime Infrastructure
Runtime Infrastructure
AOSD'04, Lancaster, UK 16
Related Work 1
Middleware for automatic distribution E.g. J-Orchestra and Addistant They completely hide distribution concern Conbination of AspectJ and them
We are not sure they are good for Tomcat, Oracle, …
AOSD'04, Lancaster, UK 17
Related Work 2 Other distributed AOP languages
E.g. D language framework JAC (Java Aspect Componenets)
DADO To modularize functional crosscutting concerns
DJcutter Remote pointcut To modularize non-functional crosscutting con
cerns
AOSD'04, Lancaster, UK 18
Conclusion Remote pointcut
To transparently identify join points on remote hosts Like RMI for distributed OOP
To run advice on a different host from the host where join points are pointcut Without consideration of distribution concern
DJcutter – Distributed AOP Language Remote pointcut Extension of AspectJ language
AOSD'04, Lancaster, UK 19
The End
Thanks
AOSD'04, Lancaster, UK 20
AOSD'04, Lancaster, UK 21
AOSD'04, Lancaster, UK 22
Even if writing RMI is very easy,
We still have a question: Why the test code consists of three sub-modules? Because of not test but distribution concern
1. flag = false.2. call registerUser() on Authenticator.
3. if addUser() is invoked on Database,
flag = true.
4. Assert flag == ture
Design Problem
AOSD'04, Lancaster, UK 23
DJcutter Implementation
Compiler To generate a Java-bytecode representing an
aspect Runtime infrastructure
To implement load-time weaving Aspect server Extended class loader
AOSD'04, Lancaster, UK 24
AOSD'04, Lancaster, UK 25
Our Solution
To run advice on a different host from the host where join points are pointcut
Implementing a single module without consideration of distribution
That is, it can separate distribution concern from the test code Non-distributed sub-modules, Automatic deployment, And separation of crosscutting concerns
AOSD'04, Lancaster, UK 26
Remote Pointcut
To identify join points in a program flow on remote host transparently Corresponding to RMI for distributed OOP Extends to pointcut designators in AspectJ
A single non-distributed module on a single host
class Database { void addUser() { System.out.println(“addUser”); … … }}
Database
Remote pointcut
aspect Log { before() : execution(void addUser()) { System.out.println(“addUser”); }}
Log
AOSD'04, Lancaster, UK 27
Three Distributed Sub-modules Ideally, a concern should be described a non-distributed single module We want to write without consideration of distribution
The test code is written with consideration of distribution As a result, sub-modules, complicated network
processing, deployment
1. flag = false.2. call registerUser() on Authenticator.
3. if addUser() is invoked on Database,
flag = true.
4. Assert flag == ture
AOSD'04, Lancaster, UK 28
Three Distributed Sub-modules Idealy, a concern should be described as a non-dist
ributed single module on a single host この test code は、分散した sub-modules に
なっている Separated, but far from the ideal test code Remote method invocation among sub-modules Deployment
Client
Callback
DatabaseTest
RMI
DatabaseTest
ClientCallback
DatabaseTest
AOSD'04, Lancaster, UK 29
Related Work
AOSD'04, Lancaster, UK 30
Ideal Test Code In the test code, we declare a flag for comfirming t
hat addUser() was executed
AuthenticatorTest Program call registerUser()
1. Sets flag to false2. Remotely calls registerUser()
3. Confirms that flag is ture
Flag is set to true, when addUser() is executed
Main part for testingcall addUser()
class DbServer { void addUser() { … … }}
Database
AOSD'04, Lancaster, UK 31
実際に実装するAuthServer
DbServer
AuthServerTest 1.registerUser() 呼出
2.addUser() 呼出
class AuthServerTest extends TestCase {
boolean wasAddUserCalled; void testRegisterUser() { Naming.rebind("test", new RecieverImpl()); wasAddUserCalled = false; String userId = "muga", password = "xxx"; AuthServer auth = (AuthServer) Naming.lookup("auth"); auth.registerUser(userId, password); assertTrue(wasAddUserCalled); }class ReceiverImpl extends UnicastRemoteObject implements NotificationReceiver {
void confirmCall() { wasAddUserCalled = true; } }interface NotificationReceiver { void confirmCall(); }
interface NotificationReceiver { void confirmCall(); }
aspect Notification { before(): execution(void DbServer.addUser()){ NotificationReceiver test = (NotificationReceiver) Naming.lookup("test"); test.confirmCall(); }}
RMI
AOSD'04, Lancaster, UK 32
Experimental Results