com.jdon.aop.reflection.ProxyMethodInvocation Maven / Gradle / Ivy
/**
* Copyright 2003-2006 the original author or authors.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.jdon.aop.reflection;
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Method;
import java.util.List;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import com.jdon.bussinessproxy.target.TargetServiceFactory;
import com.jdon.container.access.TargetMetaRequestsHolder;
import com.jdon.util.Debug;
/**
* MethodInvocation Implemention by this class, Interceptor will action.
*
* @author banq
*/
public class ProxyMethodInvocation implements MethodInvocation, java.io.Serializable {
/**
*
*/
private static final long serialVersionUID = 8210744876679222009L;
private final static String module = ProxyMethodInvocation.class.getName();
protected final TargetServiceFactory targetServiceFactory;
private final Method method;
private final Object[] args;
private Object target;
protected final List interceptors;
protected final MethodInvokerUtil mUtil;
protected int currentInterceptorInt = -1;
public ProxyMethodInvocation(List interceptors, TargetMetaRequestsHolder targetMetaRequestsHolder,
TargetServiceFactory targetServiceFactory, Method method, Object[] args) {
Debug.logVerbose("[JdonFramework] method.getName() :" + method.getName(), module);
this.interceptors = interceptors;
this.targetServiceFactory = targetServiceFactory;
this.mUtil = new MethodInvokerUtil(targetMetaRequestsHolder);
this.method = method;
this.args = args;
}
/**
* Invokes next interceptor/proxy target. now there is no mixin
*/
public Object proceed() throws Throwable {
// Debug.logVerbose("[JdonFramework] <-----> enter ProxyMethodInvocation proceed() for "
// + currentInterceptorInt, module);
if (currentInterceptorInt == interceptors.size() - 1) {
Debug.logVerbose("[JdonFramework] finish call all inteceptors", module);
return methodInvoke();
}
Object interceptor = interceptors.get(++currentInterceptorInt);
if (interceptor != null) {
MethodInterceptor methodInterceptor = (MethodInterceptor) interceptor;
// Debug.logVerbose("[JdonFramework] now call inteceptor : "
// + methodInterceptor.getClass().getName(), module);
return methodInterceptor.invoke(this);
} else {
Debug.logVerbose("[JdonFramework] null finish call all inteceptors", module);
return methodInvoke();
}
}
private Object methodInvoke() throws Throwable {
Debug.logVerbose("[JdonFramework]enter method reflection ", module);
Object result = null;
try {
if (target == null) {// interceptor not set target
Debug.logVerbose("[JdonFramework] all interceptors not set this target object, now create it", module);
target = mUtil.createTargetObject(targetServiceFactory);
}
Debug.logVerbose("[JdonFramework] target:" + target.getClass().getName() + " service's method:" + method.getName() + " running.. ",
module);
Debug.logVerbose("[JdonFramework] it is pojo target service", module);
result = mUtil.execute(method, target, args);
} catch (Exception ex) {
Debug.logError("[JdonFramework]run error: " + ex, module);
throw new Throwable(ex);
} catch (Throwable tex) {
throw new Throwable(tex);
}
return result;
}
public Object[] getArguments() {
return this.args;
}
public Object getThis() {
/**
* try { if (target == null) target =
* mUtil.createTargetObject(targetServiceFactory, targetMetaRequest); }
* catch (Exception e) {
* Debug.logError("[JdonFramework]createTargetObject error :" + e,
* module); }
**/
return target;
}
public void setThis(Object target) {
this.target = target;
}
public AccessibleObject getStaticPart() {
return null;
}
public Method getMethod() {
return method;
}
}