rsanchez
2015-01-28 fc256f48aa7e1a378f540fc1fdbde46739ff903c
securis/src/main/java/net/curisit/securis/ioc/RequestsInterceptor.java
....@@ -9,16 +9,17 @@
99 import javax.inject.Inject;
1010 import javax.persistence.EntityManager;
1111 import javax.servlet.http.HttpServletRequest;
12
+import javax.servlet.http.HttpServletResponse;
1213 import javax.ws.rs.Priorities;
1314 import javax.ws.rs.WebApplicationException;
1415 import javax.ws.rs.container.ContainerRequestContext;
1516 import javax.ws.rs.container.ContainerRequestFilter;
16
-import javax.ws.rs.container.ContainerResponseContext;
17
-import javax.ws.rs.container.ContainerResponseFilter;
1817 import javax.ws.rs.core.Context;
1918 import javax.ws.rs.core.Response;
2019 import javax.ws.rs.core.Response.Status;
2120 import javax.ws.rs.ext.Provider;
21
+import javax.ws.rs.ext.WriterInterceptor;
22
+import javax.ws.rs.ext.WriterInterceptorContext;
2223
2324 import net.curisit.securis.db.User;
2425 import net.curisit.securis.security.BasicSecurityContext;
....@@ -37,8 +38,11 @@
3738
3839 @Provider
3940 @Priority(Priorities.AUTHENTICATION)
40
-public class RequestsInterceptor implements ContainerRequestFilter, ContainerResponseFilter {
41
+public class RequestsInterceptor implements ContainerRequestFilter, WriterInterceptor {
4142 private static final Logger LOG = LogManager.getLogger(RequestsInterceptor.class);
43
+
44
+ @Context
45
+ private HttpServletResponse servletResponse;
4246
4347 @Context
4448 private HttpServletRequest servletRequest;
....@@ -58,6 +62,8 @@
5862 @Override
5963 public void filter(ContainerRequestContext containerRequestContext) throws IOException {
6064 EntityManager em = emProvider.getEntityManager();
65
+ LOG.info("GETTING EM: {}", em);
66
+
6167 ResteasyProviderFactory.pushContext(EntityManager.class, em);
6268
6369 ResourceMethodInvoker methodInvoker = (ResourceMethodInvoker) containerRequestContext
....@@ -68,12 +74,11 @@
6874
6975 boolean next = checkSecurableMethods(containerRequestContext, method);
7076 if (next) {
71
- prepareTransaction(containerRequestContext, method);
77
+ prepareTransaction(containerRequestContext, method, em);
7278 }
7379 }
7480
75
- private void prepareTransaction(ContainerRequestContext containerRequestContext, Method method) {
76
- EntityManager em = ResteasyProviderFactory.getContextData(EntityManager.class);
81
+ private void prepareTransaction(ContainerRequestContext containerRequestContext, Method method, EntityManager em) {
7782
7883 if (method.isAnnotationPresent(EnsureTransaction.class)) {
7984 LOG.debug("Beginning a new transaction");
....@@ -155,17 +160,30 @@
155160 }
156161
157162 @Override
158
- public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
163
+ public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException {
164
+ context.proceed();
159165 EntityManager em = ResteasyProviderFactory.getContextData(EntityManager.class);
160
-
161
- if (em != null && em.getTransaction().isActive()) {
162
- LOG.debug("Transaction is active, ready to finish it");
163
- if (responseContext.getStatus() == Status.OK.getStatusCode()) {
164
- em.getTransaction().commit();
165
- LOG.debug("COMMIT");
166
- } else {
167
- em.getTransaction().rollback();
168
- LOG.debug("ROLLBACK");
166
+ try {
167
+ if (em != null && em.getTransaction().isActive()) {
168
+ if (servletResponse.getStatus() == Status.OK.getStatusCode()) {
169
+ em.getTransaction().commit();
170
+ LOG.debug("COMMIT");
171
+ } else {
172
+ // This code is never executed if there is an error the
173
+ // filter chain is broken
174
+ em.getTransaction().rollback();
175
+ LOG.debug("ROLLBACK");
176
+ }
177
+ }
178
+ } finally {
179
+ if (em.isOpen()) {
180
+ LOG.info("CLOSING EM: {}, trans: {}", em, em.isJoinedToTransaction());
181
+ try {
182
+ em.close();
183
+ } catch (Exception ex) {
184
+ ex.printStackTrace();
185
+ LOG.error("Error closing EM: {}, {}", em, ex);
186
+ }
169187 }
170188 }
171189 }