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