package org.atomnuke.plugin.proxy.japi;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import org.atomnuke.plugin.InstanceContext;
import org.atomnuke.plugin.operation.ComplexOperation;
import org.atomnuke.plugin.operation.OperationFailureException;
import org.atomnuke.util.result.ResultCatchImpl;
/**
*
* @author zinic
*/
public class InstanceContextInvocationHandler implements InvocationHandler {
private final InstanceContext context;
public InstanceContextInvocationHandler(InstanceContext context) {
this.context = context;
}
@Override
public Object invoke(Object proxy, final Method method, final Object[] args) throws OperationFailureException {
final ResultCatchImpl resultCatch = new ResultCatchImpl();
context.perform(new ComplexOperation<Object, ResultCatchImpl>() {
@Override
public void perform(Object instance, ResultCatchImpl argument) throws OperationFailureException {
try {
argument.setResult(method.invoke(instance, args));
} catch (Exception ex) {
throw new OperationFailureException(ex);
}
}
}, resultCatch);
return resultCatch.result();
}
}