001package org.nuxeo.ecm.core.storage.sql.jdbc;
002
003import java.lang.reflect.InvocationHandler;
004import java.lang.reflect.InvocationTargetException;
005import java.lang.reflect.Method;
006import java.lang.reflect.Proxy;
007
008import javax.transaction.Transaction;
009
010import org.nuxeo.ecm.core.storage.sql.Mapper;
011import org.nuxeo.runtime.transaction.TransactionHelper;
012
013public class JDBCMapperTxSuspender implements InvocationHandler {
014
015    protected final Mapper mapper;
016
017    protected JDBCMapperTxSuspender(Mapper mapper) {
018        this.mapper = mapper;
019    }
020
021    protected Object doInvoke(Method method, Object[] args) throws Throwable {
022        try {
023            return method.invoke(mapper, args);
024        } catch (InvocationTargetException cause) {
025            throw cause.getTargetException();
026        }
027    }
028
029    @Override
030    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
031        Transaction tx = TransactionHelper.suspendTransaction();
032        try {
033            return doInvoke(method, args);
034        } finally {
035            if (tx != null) {
036                TransactionHelper.resumeTransaction(tx);
037            }
038        }
039    }
040
041    public static Mapper newConnector(Mapper mapper) {
042        return (Mapper) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
043                new Class<?>[] { Mapper.class }, new JDBCMapperTxSuspender(mapper));
044    }
045}