| .. | .. |
|---|
| 9 | 9 | import javax.inject.Inject; |
|---|
| 10 | 10 | import javax.persistence.EntityManager; |
|---|
| 11 | 11 | import javax.servlet.http.HttpServletRequest; |
|---|
| 12 | +import javax.servlet.http.HttpServletResponse; |
|---|
| 12 | 13 | import javax.ws.rs.Priorities; |
|---|
| 13 | 14 | import javax.ws.rs.WebApplicationException; |
|---|
| 14 | 15 | import javax.ws.rs.container.ContainerRequestContext; |
|---|
| 15 | 16 | import javax.ws.rs.container.ContainerRequestFilter; |
|---|
| 16 | | -import javax.ws.rs.container.ContainerResponseContext; |
|---|
| 17 | | -import javax.ws.rs.container.ContainerResponseFilter; |
|---|
| 18 | 17 | import javax.ws.rs.core.Context; |
|---|
| 19 | 18 | import javax.ws.rs.core.Response; |
|---|
| 20 | 19 | import javax.ws.rs.core.Response.Status; |
|---|
| 21 | 20 | import javax.ws.rs.ext.Provider; |
|---|
| 21 | +import javax.ws.rs.ext.WriterInterceptor; |
|---|
| 22 | +import javax.ws.rs.ext.WriterInterceptorContext; |
|---|
| 22 | 23 | |
|---|
| 23 | 24 | import net.curisit.securis.db.User; |
|---|
| 24 | 25 | import net.curisit.securis.security.BasicSecurityContext; |
|---|
| .. | .. |
|---|
| 37 | 38 | |
|---|
| 38 | 39 | @Provider |
|---|
| 39 | 40 | @Priority(Priorities.AUTHENTICATION) |
|---|
| 40 | | -public class RequestsInterceptor implements ContainerRequestFilter, ContainerResponseFilter { |
|---|
| 41 | +public class RequestsInterceptor implements ContainerRequestFilter, WriterInterceptor { |
|---|
| 41 | 42 | private static final Logger LOG = LogManager.getLogger(RequestsInterceptor.class); |
|---|
| 43 | + |
|---|
| 44 | + @Context |
|---|
| 45 | + private HttpServletResponse servletResponse; |
|---|
| 42 | 46 | |
|---|
| 43 | 47 | @Context |
|---|
| 44 | 48 | private HttpServletRequest servletRequest; |
|---|
| .. | .. |
|---|
| 58 | 62 | @Override |
|---|
| 59 | 63 | public void filter(ContainerRequestContext containerRequestContext) throws IOException { |
|---|
| 60 | 64 | EntityManager em = emProvider.getEntityManager(); |
|---|
| 65 | + LOG.info("GETTING EM: {}", em); |
|---|
| 66 | + |
|---|
| 61 | 67 | ResteasyProviderFactory.pushContext(EntityManager.class, em); |
|---|
| 62 | 68 | |
|---|
| 63 | 69 | ResourceMethodInvoker methodInvoker = (ResourceMethodInvoker) containerRequestContext |
|---|
| .. | .. |
|---|
| 68 | 74 | |
|---|
| 69 | 75 | boolean next = checkSecurableMethods(containerRequestContext, method); |
|---|
| 70 | 76 | if (next) { |
|---|
| 71 | | - prepareTransaction(containerRequestContext, method); |
|---|
| 77 | + prepareTransaction(containerRequestContext, method, em); |
|---|
| 72 | 78 | } |
|---|
| 73 | 79 | } |
|---|
| 74 | 80 | |
|---|
| 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) { |
|---|
| 77 | 82 | |
|---|
| 78 | 83 | if (method.isAnnotationPresent(EnsureTransaction.class)) { |
|---|
| 79 | 84 | LOG.debug("Beginning a new transaction"); |
|---|
| .. | .. |
|---|
| 155 | 160 | } |
|---|
| 156 | 161 | |
|---|
| 157 | 162 | @Override |
|---|
| 158 | | - public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException { |
|---|
| 163 | + public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException { |
|---|
| 164 | + context.proceed(); |
|---|
| 159 | 165 | 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 | + } |
|---|
| 169 | 187 | } |
|---|
| 170 | 188 | } |
|---|
| 171 | 189 | } |
|---|