package enterpriseapp.hibernate;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.hibernate.Session;
import org.hibernate.StaleObjectStateException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SessionInterceptor implements Filter {
private static final Logger logger = LoggerFactory.getLogger(SessionInterceptor.class);
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
final Session session = Db.getCurrentSession();
if(session.getTransaction().isActive()) {
session.getTransaction().commit();
}
if(session.isOpen()) {
session.close();
}
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
final Session session = Db.getCurrentSession();
try {
if(!session.getTransaction().isActive()) {
session.beginTransaction();
}
chain.doFilter(request, response);
if(session.getTransaction().isActive()) {
session.getTransaction().commit();
}
} catch(StaleObjectStateException e) {
logger.error("", e);
if(session.getTransaction().isActive()) {
session.getTransaction().rollback();
}
throw e;
} catch(Throwable e) {
logger.error("", e);
if(session.getTransaction().isActive()) {
session.getTransaction().rollback();
}
throw new ServletException(e);
}
}
}