private Object invokeOriginalChainIfExists(Invocation invocation, Method method, Object targetObject, Object[] args) throws Throwable
{
//Try to attach to the caller chain
if (invocation instanceof MethodCalledByConstructorInvocation)
{
MethodCalledByConstructorInvocation inv = (MethodCalledByConstructorInvocation) invocation;
Constructor<?> callingCon = inv.getCalling();
Class<?> callingClass = callingCon.getDeclaringClass();
if (isAdvised(callingClass))
{
ClassAdvisor advisor = AspectManager.instance().getAdvisor(callingClass);
if (advisor != null)
{
int index = advisor.getConstructorIndex(callingCon);
if (index >= 0)
{
HashMap<String, TLongObjectHashMap> calledClassesMap = advisor.getMethodCalledByConInterceptors()[index];
if (calledClassesMap != null)
{
TLongObjectHashMap calledMethods = calledClassesMap.get(method.getDeclaringClass().getName());
if (calledMethods != null)
{
long calledHash = MethodHashing.calculateHash(method);
//CallerMethodInfo info = (CallerMethodInfo) calledMethods.get(calledHash);
MethodByConInfo info = (MethodByConInfo) calledMethods.get(calledHash);
if (info != null && info.hasAdvices())
{
//return advisor.invokeConstructorCaller(index, targetObject, args, info);
return advisor.invokeConstructorCaller(info, inv.getCallingObject(), targetObject, args);
}
}
}
}
}
}
}
else if (invocation instanceof MethodCalledByMethodInvocation)
{
MethodCalledByMethodInvocation inv = (MethodCalledByMethodInvocation) invocation;
Method callingMethod = inv.getCallingMethod();
if (isAdvised(callingMethod.getDeclaringClass()))
{
ClassAdvisor advisor = AspectManager.instance().getAdvisor(callingMethod.getDeclaringClass());
if (advisor != null)
{
long callingMethodHash = MethodHashing.calculateHash(callingMethod);
long calledHash = MethodHashing.calculateHash(method);
@SuppressWarnings("unchecked")
HashMap calledClassesMap = (HashMap) advisor.getMethodCalledByMethodInterceptors().get(callingMethodHash);
if (calledClassesMap != null)
{
TLongObjectHashMap calledMethods = (TLongObjectHashMap) calledClassesMap.get(method.getDeclaringClass().getName());
if (calledMethods != null)
{
//CallerMethodInfo info = (CallerMethodInfo) calledMethods.get(calledHash);
MethodByMethodInfo info = (MethodByMethodInfo) calledMethods.get(calledHash);
if (info != null && info.hasAdvices())
{
//return advisor.invokeCaller(callingMethodHash, targetObject, args, info, inv.getCallingObject());
return advisor.invokeCaller(info, inv.getCallingObject(), targetObject, args);
}
}
}
}
}