/** * */ package org.minnal.jpa; import javax.ws.rs.container.PreMatching; import org.activejpa.jpa.JPA; import org.activejpa.jpa.JPAContext; import org.glassfish.jersey.server.ContainerRequest; import org.glassfish.jersey.server.ContainerResponse; import org.glassfish.jersey.server.monitoring.RequestEvent; import org.glassfish.jersey.server.monitoring.RequestEventListener; import org.minnal.core.config.DatabaseConfiguration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author ganeshs * */ @PreMatching public class OpenSessionInViewFilter implements RequestEventListener { private DatabaseConfiguration configuration; private ThreadLocal<Boolean> contextCreated = new ThreadLocal<Boolean>(); private static final Logger logger = LoggerFactory.getLogger(OpenSessionInViewFilter.class); public OpenSessionInViewFilter(DatabaseConfiguration configuration) { this.configuration = configuration; } protected JPAContext getContext() { return JPA.instance.getDefaultConfig().getContext(configuration.isReadOnly()); } protected void requestReceived(ContainerRequest request) { JPAContext context = getContext(); context.getEntityManager(); contextCreated.set(true); } protected void requestCompleted(ContainerRequest request, ContainerResponse response) { if (contextCreated.get() == null) { return; } contextCreated.remove(); JPAContext context = getContext(); if (context.isTxnOpen()) { context.closeTxn(true); } context.close(); } @Override public void onEvent(RequestEvent event) { logger.trace("Received the event {}", event); switch (event.getType()) { case REQUEST_MATCHED: requestReceived(event.getContainerRequest()); break; case FINISHED: requestCompleted(event.getContainerRequest(), event.getContainerResponse()); break; default: break; } } /** * @return the configuration */ public DatabaseConfiguration getConfiguration() { return configuration; } }