package org.nuxeo.ecm.core.storage.sql.jdbc;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import javax.transaction.Transaction;
import org.nuxeo.ecm.core.storage.sql.Mapper;
import org.nuxeo.runtime.transaction.TransactionHelper;
public class JDBCMapperTxSuspender implements InvocationHandler {
protected final Mapper mapper;
protected JDBCMapperTxSuspender(Mapper mapper) {
this.mapper = mapper;
}
protected Object doInvoke(Method method, Object[] args) throws Throwable {
try {
return method.invoke(mapper, args);
} catch (InvocationTargetException cause) {
throw cause.getTargetException();
}
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Transaction tx = TransactionHelper.suspendTransaction();
try {
return doInvoke(method, args);
} finally {
if (tx != null) {
TransactionHelper.resumeTransaction(tx);
}
}
}
public static Mapper newConnector(Mapper mapper) {
return (Mapper)Proxy.newProxyInstance(
Thread.currentThread().getContextClassLoader(), new Class<?>[] {
Mapper.class },
new JDBCMapperTxSuspender(mapper));
}
}