package net.curisit.securis.ioc; import java.io.IOException; import java.lang.reflect.Method; import javax.annotation.Priority; import javax.interceptor.InvocationContext; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.ws.rs.Priorities; import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerRequestFilter; import javax.ws.rs.container.ContainerResponseContext; import javax.ws.rs.container.ContainerResponseFilter; import javax.ws.rs.core.Response.Status; import javax.ws.rs.ext.Provider; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.jboss.resteasy.core.ResourceMethodInvoker; import org.jboss.resteasy.spi.ResteasyProviderFactory; @Provider @Priority(Priorities.AUTHENTICATION) public class TransactionsManager implements ContainerRequestFilter, ContainerResponseFilter { private static final Logger LOG = LogManager.getLogger(TransactionsManager.class); private EntityManagerFactory entityManagerFactory = javax.persistence.Persistence.createEntityManagerFactory("localdb"); private EntityManager getEM() { return entityManagerFactory.createEntityManager(); } // @Inject // private ThreadLocal threadLocal; // @AroundInvoke public Object invoke(InvocationContext context) throws Exception { EntityManager em = getEM(); if (!em.getTransaction().isActive()) { em.getTransaction().begin(); LOG.info("INIT trans"); ResteasyProviderFactory.pushContext(EntityManager.class, em); Object result = context.proceed(); em.getTransaction().commit(); LOG.info("COMMIT trans"); return result; } LOG.info("No trans"); Object result = context.proceed(); return result; } @Override public void filter(ContainerRequestContext requestContext) throws IOException { ResourceMethodInvoker methodInvoker = (ResourceMethodInvoker) requestContext.getProperty("org.jboss.resteasy.core.ResourceMethodInvoker"); Method method = methodInvoker.getMethod(); EntityManager em = getEM(); ResteasyProviderFactory.pushContext(EntityManager.class, em); if (method.isAnnotationPresent(EnsureTransaction.class)) { LOG.info("WE need transaction!!!"); em.getTransaction().begin(); } LOG.info("Sent to context, em: {}, {}?", em, method.toGenericString()); } @Override public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException { // TODO Auto-generated method stub // ResteasyProviderFactory.pushContext(EntityManager.class, em); EntityManager em = (EntityManager) ResteasyProviderFactory.getContextData(EntityManager.class); LOG.info("Operating on em: {}", em); if (em != null && em.getTransaction().isActive()) { LOG.info("There is transaction go ahead..."); if (responseContext.getStatus() == Status.OK.getStatusCode()) { em.getTransaction().commit(); LOG.info("COMMIT"); } else { em.getTransaction().rollback(); LOG.info("ROLLBACK"); } } else { LOG.info("There is NO transaction"); } } }