package controllers;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.TimeZone;
import javax.jcr.Session;
import models.CacheableUser;
import org.jcrom.Jcrom;
import play.libs.F;
import play.mvc.Controller;
import providers.CacheableUserProvider;
import service.JcrSessionFactory;
public abstract class SessionAwareController extends Controller {
protected final JcrSessionFactory sessionFactory;
protected final Jcrom jcrom;
protected final CacheableUserProvider subjectHandler;
protected SessionAwareController(final JcrSessionFactory sessionFactory,
final Jcrom jcrom, final CacheableUserProvider subjectHandler) {
this.sessionFactory = sessionFactory;
this.jcrom = jcrom;
this.subjectHandler = subjectHandler;
}
protected CacheableUser getUser() {
return subjectHandler.getUser(ctx().session());
}
protected <A extends Object> A inUserSession(final F.Function<Session, A> f) {
return sessionFactory.inSession(getUser().getJackrabbitUserId(), f);
}
private static final SimpleDateFormat httpDateFormat = new SimpleDateFormat(
"EEE, dd MMM yyyy HH:mm:ss z", Locale.ENGLISH);
protected static String asHttpDate(final Calendar calendar) {
httpDateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
return httpDateFormat.format(calendar.getTime());
}
protected static String asHttpDate(final Date date) {
GregorianCalendar c = new GregorianCalendar();
c.setTime(date);
return asHttpDate(c);
}
protected static Calendar fromHttpDate(final String timeStr)
throws ParseException {
final Calendar cal = Calendar.getInstance();
cal.setTime(httpDateFormat.parse(timeStr));
return cal;
}
protected boolean modified(Date date) throws ParseException {
String clientcached = ctx().request().getHeader("If-Modified-Since");
if(clientcached != null) {
return fromHttpDate(asHttpDate(date)).getTime().after(
fromHttpDate(clientcached).getTime());
}
return true;
}
}