package org.wahlzeit.servlets;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.Key;
import org.wahlzeit.model.Client;
import org.wahlzeit.model.Guest;
import org.wahlzeit.model.UserManager;
import org.wahlzeit.services.LogBuilder;
import org.wahlzeit.services.OfyService;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.List;
import java.util.logging.Logger;
/**
* This servlet is run to cleanup expired sessions.
*/
public class SessionCleanupServlet extends HttpServlet {
private static final String SESSION_ENTITY_TYPE = "_ah_SESSION";
private static final String EXPIRES_PROP = "_expires";
private static final Logger log = Logger.getLogger(SessionCleanupServlet.class.getName());
@Override
public void service(HttpServletRequest request, HttpServletResponse response) {
if ("clear".equals(request.getQueryString())) {
clearAll(response);
}
}
/**
* Clears all {@link HttpSession}s in the datastore that are expired and if they are guest sessions, deletes the
* corresponding {@link Guest} object, too.
*/
private void clearAll(HttpServletResponse response) {
List<Object> killList = OfyService.ofy().load().
kind(SESSION_ENTITY_TYPE).
filter(EXPIRES_PROP + " <", System.currentTimeMillis()).list();
log.config(LogBuilder.createSystemMessage().
addParameter("number of old sessions to delete from datastore", killList.size()).toString());
try {
for (Object o : killList) {
Entity httpSessionEntity = (Entity) o;
Key key = httpSessionEntity.getKey();
// GAE does not use session id as key name, instead "_ahs<sessionId>"
String sessionId = key.getName().substring(4);
log.config(LogBuilder.createSystemMessage().
addAction("delete session").
addParameter("session id", sessionId).toString());
Client client = UserManager.getInstance().getClientByHttpSessionId(sessionId);
if (client != null && client instanceof Guest) {
UserManager.getInstance().deleteClient(client);
}
OfyService.ofy().delete().entity(httpSessionEntity).now();
}
response.setStatus(HttpServletResponse.SC_OK);
} catch (Exception e) {
log.config(LogBuilder.createSystemMessage().
addException("problem when deleting session and guest", e).toString());
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
}
}