package auth;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import play.cache.Cache;
import play.mvc.Http;
import java.io.Serializable;
import java.util.HashMap;
/**
* Simulates the Servlet's HTTPSession object.
*/
public class WebSession {
private static Logger logger = LoggerFactory.getLogger(WebSession.class);
private long lastAccessTime;
private String id;
public static long TIME_OUT = 20 * 60000; // 20 min.
private HashMap<String,Serializable> sessionData = new HashMap<String,Serializable>();
private WebSession(String id) {
this.id = id;
this.lastAccessTime = System.currentTimeMillis();
}
public static WebSession newSession(Http.Session session) {
String id = java.util.UUID.randomUUID().toString();
logger.info("New session created id=" + id);
session.put("uuid", id);
WebSession s = new WebSession(id);
Cache.set(id, s);
return s;
}
public static WebSession getSession(Http.Session session) {
return getSession(session, false);
}
public static WebSession getSession(Http.Session session, boolean autoCreate) {
WebSession s = null;
if (session == null) {
logger.info("Session is null!");
return null;
}
String id = session.get("uuid");
if (id == null) {
if (!autoCreate) {
return null;
} else {
s = WebSession.newSession(session);
}
} else {
s = (WebSession) Cache.get(id);
if (s == null) {
logger.error("Cannot get session with id=" + id + " from cache!");
}
}
if (s != null) {
if (s.lastAccessTime < System.currentTimeMillis() - TIME_OUT) {
// session expired
logger.info("Session expired! id=" + id);
removeSession(id);
s = null;
}
}
if (s!= null) {
s.touch();
}
return s;
}
public static Object get(Http.Session session, String key) {
WebSession s = getSession(session);
if (s != null) {
return s.get(key);
}
return null;
}
public static void removeSession(String id) {
if (id != null) {
logger.info("Removing session id=" + id);
Cache.set(id, null);
}
}
public Object get(String key) {
touch();
return sessionData.get(key);
}
private void touch() {
lastAccessTime = System.currentTimeMillis();
}
public String getId() {
return id;
}
public void put(String key, Object value) {
touch();
sessionData.put(key, (Serializable) value);
}
}