package com.revolsys.ui.web.servlet; import java.io.IOException; import javax.servlet.FilterChain; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import org.springframework.transaction.support.AbstractPlatformTransactionManager; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; import org.springframework.web.filter.GenericFilterBean; import com.revolsys.transaction.Propagation; import com.revolsys.transaction.Transaction; import com.revolsys.ui.web.utils.HttpSavedRequestAndResponse; import com.revolsys.util.Exceptions; public class TransactionFilter extends GenericFilterBean { private WebApplicationContext applicationContext; @Override public void destroy() { this.applicationContext = null; } @Override public void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse, final FilterChain filterChain) throws IOException, ServletException { final AbstractPlatformTransactionManager transactionManager = (AbstractPlatformTransactionManager)this.applicationContext .getBean("transactionManager"); try ( HttpSavedRequestAndResponse saved = new HttpSavedRequestAndResponse(servletRequest, servletResponse); Transaction transaction = new Transaction(transactionManager, Propagation.REQUIRED);) { try { filterChain.doFilter(servletRequest, servletResponse); } catch (final Throwable e) { transaction.setRollbackOnly(); throw e; } } catch (IOException | ServletException | Error | RuntimeException e) { HttpServletLogUtil.logRequestException(this, e); throw e; } catch (final Throwable e) { HttpServletLogUtil.logRequestException(this, e); throw Exceptions.wrap(e); } } @Override protected void initFilterBean() throws ServletException { final ServletContext servletContext = getServletContext(); this.applicationContext = WebApplicationContextUtils .getRequiredWebApplicationContext(servletContext); } }