/**************************************************************************************
* Copyright (c) Jonas Bon�r, Alexandre Vasseur. All rights reserved. *
* http://aspectwerkz.codehaus.org *
* ---------------------------------------------------------------------------------- *
* The software in this package is published under the terms of the LGPL license *
* a copy of which has been included with this distribution in the license.txt file. *
**************************************************************************************/
package test.aspect;
import test.Loggable;
import org.codehaus.aspectwerkz.definition.Pointcut;
import org.codehaus.aspectwerkz.definition.Pointcut;
import org.codehaus.aspectwerkz.joinpoint.JoinPoint;
import org.codehaus.aspectwerkz.joinpoint.MethodRtti;
import org.codehaus.aspectwerkz.joinpoint.Rtti;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
/**
* @author <a href="mailto:jboner@codehaus.org">Jonas Bon�r </a>
* @author <a href="mailto:alex AT gnilux DOT com">Alexandre Vasseur</a>
* @Aspect perJVM
*/
public class MemberMethodTestAspect {
// ============ Pointcuts ============
/**
* @Expression call(* test.MemberMethodAdviceTest.get*(..)) && within(test.MemberMethodAdviceTest)
*/
Pointcut member_pc1;
/**
* @Expression execution(* test.MemberMethodAdviceTest.*Param**(..))
*/
Pointcut member_pc2;
/**
* @Expression execution(* test.MemberMethodAdviceTest.exceptionThrower*(..))
*/
Pointcut member_pc3;
/**
* @Expression call(* test.MemberMethodAdviceTest.methodAdvicedMethod()) && within(test.MemberMethodAdviceTest)
*/
Pointcut member_pc4;
/**
* @Expression execution(* test.MemberMethodAdviceTest.meth*AdvicedMethod())
*/
Pointcut member_pc5;
/**
* @Expression call(* test.MemberMethodAdviceTest.method*icedMethodNewThread(..)) && within(test.MemberMethodAdviceTest)
*/
Pointcut member_pc6;
/**
* @Expression execution(* test.MemberMethodAdviceTest.method*dvicedMethodNewThread(..))
*/
Pointcut member_pc7;
/**
* @Expression call(* test.MemberMethodAdviceTest.multipleMethodAdvicedMethod(..)) && within(test.MemberMethodAdviceTest)
*/
Pointcut member_pc8;
/**
* @Expression execution(* test.MemberMethodAdviceTest.multipleChainedMethodAdvicedMethod(..))
*/
Pointcut member_pc9;
/**
* @Expression call(* test.MemberMethodAdviceTest.joinPointMetaData(..)) && within(test.MemberMethodAdviceTest)
*/
Pointcut member_pc10;
/**
* @Expression call(void test.MemberMethodAdviceTest.passingParameterToAdviceMethod(..)) && within(test.MemberMethodAdviceTest)
*/
Pointcut member_pc11;
/**
* @Expression execution(void test.MemberMethodAdviceTest.multiplePointcutsMethod(..))
*/
Pointcut member_pc12;
/**
* @Expression call(void test.MemberMethodAdviceTest.multiplePointcutsMethod(..)) && within(test.MemberMethodAdviceTest)
*/
Pointcut member_pc13;
/**
* @Expression execution(* test.MemberMethodAdviceTest.takesArrayAsArgument(String[]))
*/
Pointcut member_pc14;
/**
* @Expression call(long test.MemberMethodAdviceTest.getPrimitiveAndNullFromAdvice()) && within(test.MemberMethodAdviceTest)
*/
Pointcut member_pc15;
/**
* @Expression execution(void test.MemberMethodAdviceTest.beforeAdvicedMethod())
*/
Pointcut member_pc16;
/**
* @Expression call(void test.MemberMethodAdviceTest.afterAdvicedMethod()) && within(test.MemberMethodAdviceTest)
*/
Pointcut member_pc17;
/**
* @Expression execution(void test.MemberMethodAdviceTest.beforeAfterAdvicedMethod())
*/
Pointcut member_pc18;
/**
* @Expression call(void test.MemberMethodAdviceTest.beforeAroundAfterAdvicedMethod()) && within(test.MemberMethodAdviceTest)
*/
Pointcut member_pc19;
/**
* @Expression call(* test.MemberMethodAdviceTest.longNoAroundAdvice(..)) && within(test.MemberMethodAdviceTest)
*/
Pointcut noAroundAdvice;
// ============ Advices ============
/**
* @Around member_pc1 || member_pc2 || member_pc3 || member_pc4 || member_pc14 || member_pc9
*/
public Object advice1(final JoinPoint joinPoint) throws Throwable {
return joinPoint.proceed();
}
/**
* @Around member_pc5 || member_pc8 || member_pc9 || member_pc12 || member_pc19
*/
public Object advice2(final JoinPoint joinPoint) throws Throwable {
((Loggable) joinPoint.getTarget()).log("before1 ");
final Object result = joinPoint.proceed();
((Loggable) joinPoint.getTarget()).log("after1 ");
return result;
}
/**
* @Around member_pc8 || member_pc9 || member_pc13 || member_pc19
*/
public Object advice3(final JoinPoint joinPoint) throws Throwable {
((Loggable) joinPoint.getTarget()).log("before2 ");
final Object result = joinPoint.proceed();
((Loggable) joinPoint.getTarget()).log("after2 ");
return result;
}
/**
* @Around member_pc10
*/
public Object advice4(JoinPoint joinPoint) throws Throwable {
final Object result = joinPoint.proceed();
MethodRtti mrtti = (MethodRtti) joinPoint.getRtti();
String metadata = joinPoint.getCalleeClass().getName()
+ mrtti.getMethod().getName()
+ joinPoint.getTarget().hashCode()
+ mrtti.getParameterValues()[0]
+ mrtti.getParameterTypes()[0].getName()
+ mrtti.getReturnType().getName()
+ mrtti.getReturnValue();
return metadata;
}
/**
* @Around member_pc6 || member_pc7
*/
public Object advice5(final JoinPoint joinPoint) throws Throwable {
((Loggable) joinPoint.getTarget()).log("before ");
final Object result = joinPoint.proceed();
((Loggable) joinPoint.getTarget()).log("after ");
return result;
}
/**
* @Around member_pc15
*/
public Object advice6(JoinPoint joinPoint) throws Throwable {
// test to serialize the join point instance
try {
ObjectOutput out = new ObjectOutputStream(new FileOutputStream("joinpoint.ser"));
out.writeObject(joinPoint);
out.close();
File file = new File("joinpoint.ser");
ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
joinPoint = (JoinPoint) in.readObject();
in.close();
} catch (Exception e) {
System.err.println("FIXME: serialization for JIT compiled join points");
}
return null;
}
/**
* @Before member_pc16 || member_pc18 || member_pc19 || noAroundAdvice
*/
public void before(final JoinPoint joinPoint) throws Throwable {
((Loggable) joinPoint.getTarget()).log("pre ");
}
/**
* @After member_pc17 || member_pc18 || member_pc19
*/
public void after(final JoinPoint joinPoint) throws Throwable {
((Loggable) joinPoint.getTarget()).log("post ");
}
/**
* @After call(* test.MemberMethodAdviceTest.callWithincodeCtor(..))
* && withincode(test.MemberMethodAdviceTest.new(int))
*/
public void afterWithinCtor(final JoinPoint joinPoint) {
((Loggable) joinPoint.getTarget()).log("post ");
}
}