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}