/**************************************************************************************
* 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.core;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.codehaus.aspectwerkz.aspect.AdviceType;
import org.codehaus.aspectwerkz.definition.AdviceDefinition;
import org.codehaus.aspectwerkz.definition.AspectDefinition;
import org.codehaus.aspectwerkz.definition.SystemDefinition;
import org.codehaus.aspectwerkz.definition.SystemDefinitionContainer;
import org.codehaus.aspectwerkz.reflect.ClassInfo;
import org.codehaus.aspectwerkz.reflect.ReflectHelper;
import org.codehaus.aspectwerkz.reflect.impl.java.JavaClassInfo;
import org.codehaus.aspectwerkz.transform.aopalliance.AopAllianceAspectModel;
import org.codehaus.aspectwerkz.transform.inlining.AspectModelManager;
import java.lang.reflect.Method;
/**
* @author <a href="mailto:alex AT gnilux DOT com">Alexandre Vasseur</a>
*/
public class Yapbaop extends AopAllianceAspectModel {//extend not required but wants to acess constants
// register the AOP Alliance model (do not require the -D option of AW ext container)
static {
System.setProperty("aspectwerkz.extension.aspectmodels", AopAllianceAspectModel.class.getName().replace('/', '.'));
AspectModelManager.getModels();
}
// the AOP Alliance aspect for method
private final static Method AOP_ALLIANCE_METHOD_AROUND;
static {
try {
AOP_ALLIANCE_METHOD_AROUND = MethodInterceptor.class.getDeclaredMethod("invoke",
new Class[]{MethodInvocation.class});
} catch (Throwable t) {
throw new Error(t.toString());
}
}
public static Handle bindAspect(Class aopAllianceAspect, String pointcut) {
ClassLoader cl = Thread.currentThread().getContextClassLoader();
ClassInfo aspectInfo = JavaClassInfo.getClassInfo(aopAllianceAspect);
// check some
if (aspectInfo.getMethod(ReflectHelper.calculateHash(AOP_ALLIANCE_METHOD_AROUND)) == null) {
throw new RuntimeException("Aspect is not AOP Alliance compatible - " + aopAllianceAspect.getName());
}
SystemDefinition def = SystemDefinitionContainer.getVirtualDefinitionAt(cl);
AspectDefinition aspectDef = new AspectDefinition(aspectInfo.getName(), aspectInfo, def);
AdviceDefinition adviceDef = AdviceDefinition.newInstance("invoke", // as per AOPAlliance
AdviceType.AROUND,
"execution(" + pointcut + ")",
null,
aspectInfo.getName(),
aspectInfo.getName(),
aspectInfo.getMethod(ReflectHelper.calculateHash(AOP_ALLIANCE_METHOD_AROUND)),
aspectDef);
// make it an AOP Alliance aspect for the compiler
aspectDef.setAspectModel(ASPECT_MODEL_TYPE);
// add the advice
aspectDef.addAroundAdviceDefinition(adviceDef);
// add the aspect
def.addAspect(aspectDef);
return new Handle(adviceDef);
}
public static class Handle {
private AdviceDefinition m_definition;
private Handle(AdviceDefinition def) {
m_definition = def;
}
public void unbind() {
m_definition.setExpressionInfo(null);
}
}
}