From fc256f48aa7e1a378f540fc1fdbde46739ff903c Mon Sep 17 00:00:00 2001
From: rsanchez <rsanchez@curisit.net>
Date: Wed, 28 Jan 2015 23:12:42 +0000
Subject: [PATCH] #0 fix - Fixed Application modification service

---
 securis/src/main/java/net/curisit/securis/ioc/RequestsInterceptor.java |   50 ++++++++++++++++++++++++++++++++++----------------
 1 files changed, 34 insertions(+), 16 deletions(-)

diff --git a/securis/src/main/java/net/curisit/securis/ioc/RequestsInterceptor.java b/securis/src/main/java/net/curisit/securis/ioc/RequestsInterceptor.java
index 39f9c7b..595f00d 100644
--- a/securis/src/main/java/net/curisit/securis/ioc/RequestsInterceptor.java
+++ b/securis/src/main/java/net/curisit/securis/ioc/RequestsInterceptor.java
@@ -9,16 +9,17 @@
 import javax.inject.Inject;
 import javax.persistence.EntityManager;
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import javax.ws.rs.Priorities;
 import javax.ws.rs.WebApplicationException;
 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.Context;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 import javax.ws.rs.ext.Provider;
+import javax.ws.rs.ext.WriterInterceptor;
+import javax.ws.rs.ext.WriterInterceptorContext;
 
 import net.curisit.securis.db.User;
 import net.curisit.securis.security.BasicSecurityContext;
@@ -37,8 +38,11 @@
 
 @Provider
 @Priority(Priorities.AUTHENTICATION)
-public class RequestsInterceptor implements ContainerRequestFilter, ContainerResponseFilter {
+public class RequestsInterceptor implements ContainerRequestFilter, WriterInterceptor {
     private static final Logger LOG = LogManager.getLogger(RequestsInterceptor.class);
+
+    @Context
+    private HttpServletResponse servletResponse;
 
     @Context
     private HttpServletRequest servletRequest;
@@ -58,6 +62,8 @@
     @Override
     public void filter(ContainerRequestContext containerRequestContext) throws IOException {
         EntityManager em = emProvider.getEntityManager();
+        LOG.info("GETTING EM: {}", em);
+
         ResteasyProviderFactory.pushContext(EntityManager.class, em);
 
         ResourceMethodInvoker methodInvoker = (ResourceMethodInvoker) containerRequestContext
@@ -68,12 +74,11 @@
 
         boolean next = checkSecurableMethods(containerRequestContext, method);
         if (next) {
-            prepareTransaction(containerRequestContext, method);
+            prepareTransaction(containerRequestContext, method, em);
         }
     }
 
-    private void prepareTransaction(ContainerRequestContext containerRequestContext, Method method) {
-        EntityManager em = ResteasyProviderFactory.getContextData(EntityManager.class);
+    private void prepareTransaction(ContainerRequestContext containerRequestContext, Method method, EntityManager em) {
 
         if (method.isAnnotationPresent(EnsureTransaction.class)) {
             LOG.debug("Beginning a new transaction");
@@ -155,17 +160,30 @@
     }
 
     @Override
-    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
+    public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException {
+        context.proceed();
         EntityManager em = ResteasyProviderFactory.getContextData(EntityManager.class);
-
-        if (em != null && em.getTransaction().isActive()) {
-            LOG.debug("Transaction is active, ready to finish it");
-            if (responseContext.getStatus() == Status.OK.getStatusCode()) {
-                em.getTransaction().commit();
-                LOG.debug("COMMIT");
-            } else {
-                em.getTransaction().rollback();
-                LOG.debug("ROLLBACK");
+        try {
+            if (em != null && em.getTransaction().isActive()) {
+                if (servletResponse.getStatus() == Status.OK.getStatusCode()) {
+                    em.getTransaction().commit();
+                    LOG.debug("COMMIT");
+                } else {
+                    // This code is never executed if there is an error the
+                    // filter chain is broken
+                    em.getTransaction().rollback();
+                    LOG.debug("ROLLBACK");
+                }
+            }
+        } finally {
+            if (em.isOpen()) {
+                LOG.info("CLOSING EM: {}, trans: {}", em, em.isJoinedToTransaction());
+                try {
+                    em.close();
+                } catch (Exception ex) {
+                    ex.printStackTrace();
+                    LOG.error("Error closing EM: {}, {}", em, ex);
+                }
             }
         }
     }

--
Gitblit v1.3.2