/**************************************************************************************
* 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 yapbaop.demo;
import org.codehaus.aspectwerkz.proxy.Proxy;
import org.codehaus.aspectwerkz.intercept.Advisable;
import org.codehaus.aspectwerkz.intercept.Advice;
import org.codehaus.aspectwerkz.intercept.AfterThrowingAdvice;
import org.codehaus.aspectwerkz.joinpoint.JoinPoint;
import yapbaop.core.Yapbaop;
/**
* @author <a href="mailto:alex AT gnilux DOT com">Alexandre Vasseur</a>
*/
public class YapbaopDemo {
static int COUNT = 0;
String m_name;
public YapbaopDemo() {
m_name = "YapbaopDemo-" + COUNT++;
}
public void method() {
System.out.println(m_name + " .method");
}
public void canThrow(boolean doThrow) {
System.out.println(m_name + " .canThrow");
if (doThrow)
throw new RuntimeException("Was asked to throw");
}
public static void main(String args[]) throws Throwable {
// no aspect
System.out.println(" ( no aspect )");
YapbaopDemo me0 = new YapbaopDemo();
me0.method();
System.out.println(" ( bind a new aspect )");
Yapbaop.Handle handle = Yapbaop.bindAspect(DemoAspect.class, "* yapbaop.demo.YapbaopDemo.*(..)");
YapbaopDemo me1 = (YapbaopDemo) Proxy.newInstance(YapbaopDemo.class);
me1.method();
handle.unbind();
// get a new one but not using the proxy cache then..
System.out.println(" ( unbind it and get a new proxy YapbaopDemo-2)");
YapbaopDemo me2 = (YapbaopDemo) Proxy.newInstance(YapbaopDemo.class, false, false/*not advisable*/);
me1.method();// still has advice
me2.method();// no advice
// lets add some per instance interceptor now
// don't use the cache, and ensure we have an advisable version
System.out.println(" ( real per instance interception, lets add an afterThrowing on YapbaopDemo-3..)");
YapbaopDemo me3 = (YapbaopDemo) Proxy.newInstance(YapbaopDemo.class, false, true/*IS advisable*/);
me3.method();// nothing happen
// note here that composition is not allowed for now since only execution pointcut are valid
((Advisable)me3).aw_addAdvice(
"execution(* *.canThrow(..))",
new AfterThrowingAdvice() {
public void invoke(JoinPoint joinPoint, Throwable throwable) throws Throwable {
System.out.print("afterThrowing on ");
System.out.print(((YapbaopDemo)joinPoint.getTarget()).m_name);
System.out.println(" : afterThrowing on " + joinPoint.getSignature().toString());
System.out.println(" exception is " + throwable.getClass().getName()
+ " / " + throwable.getMessage());
}
}
);
me3.canThrow(false);// nothing
System.out.println(" ( nothing happen on YapbaopDemo-2 off course)");
try {
me2.canThrow(true);// after throwing NOT triggered !! this is me2
} catch (Throwable t) {
System.out.println("got " + t.getClass().getName() + " / " + t.getMessage());
}
System.out.println(" ( after throwing per instance on YapbaopDemo-3 happens)");
try {
me3.canThrow(true);// after throwing IS triggered !! this is me3
} catch (Throwable t) {
System.out.println("got " + t.getClass().getName() + " / " + t.getMessage());
}
}
}