package io.milton.mini;
import io.milton.vfs.db.utils.SessionManager;
import io.milton.http.Filter;
import io.milton.http.FilterChain;
import io.milton.http.Request;
import io.milton.http.Response;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author brad
*/
public class MiltonMiniOpenSessionInViewFilter implements Filter {
private static final Logger log = LoggerFactory.getLogger(MiltonMiniOpenSessionInViewFilter.class);
public static void setRollbackOnly(Request request) {
request.getAttributes().put("rollback", Boolean.TRUE);
}
private final SessionManager sessionManager;
public MiltonMiniOpenSessionInViewFilter(SessionManager sessionManager) {
this.sessionManager = sessionManager;
}
@Override
public void process(final FilterChain chain, final Request request, final Response response) {
long tm = System.currentTimeMillis();
Transaction tx = null;
try {
Session s = sessionManager.open();
tx = s.beginTransaction();
chain.process(request, response);
Boolean b = (Boolean) request.getAttributes().get("rollback");
if (b != null && b) {
log.warn("Rolling back");
tx.rollback();
} else {
//Only commit on mutating methods
if (request.getMethod().isWrite) {
tx.commit();
} else {
tx.rollback();
}
}
} catch(Throwable e) {
log.error("Exception caught in filter", e);
if( tx != null ) {
log.warn("Rollback..");
tx.rollback();
}
throw new RuntimeException(e);
} finally {
sessionManager.close();
}
tm = System.currentTimeMillis() - tm;
log.info("Finished request: " + tm + "ms for " + request.getAbsolutePath() + " method=" + request.getMethod());
}
}