X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Finternal%2Fkernel%2FWebCmsSessionImpl.java;fp=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Finternal%2Fkernel%2FWebCmsSessionImpl.java;h=f5203c940a556fbb0028c6e61be9c9c6d90757d2;hb=e7934b53bd71a084dc069f6500f7a168a28efdaf;hp=0000000000000000000000000000000000000000;hpb=49e91020c0dec2a0e754bcc2911f91aaa3d59f3d;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/WebCmsSessionImpl.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/WebCmsSessionImpl.java new file mode 100644 index 000000000..f5203c940 --- /dev/null +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/WebCmsSessionImpl.java @@ -0,0 +1,89 @@ +package org.argeo.cms.internal.kernel; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.argeo.cms.auth.WebCmsSession; +import org.osgi.framework.ServiceRegistration; +import org.osgi.service.http.HttpContext; +import org.osgi.service.useradmin.Authorization; + +public class WebCmsSessionImpl implements WebCmsSession { + private final static Log log = LogFactory.getLog(WebCmsSessionImpl.class); + + private final String id; + private final Authorization authorization; + + private List subHttpSessions = new ArrayList<>(); + + private ServiceRegistration serviceRegistration; + + public WebCmsSessionImpl(String id, Authorization authorization) { + this.id = id; + this.authorization = authorization; + } + + public void cleanUp() { + for (SubHttpSession subSession : subHttpSessions) + subSession.cleanUp(); + serviceRegistration.unregister(); + } + + @Override + public Authorization getAuthorization() { + return authorization; + } + + @Override + public void addHttpSession(HttpServletRequest request) { + subHttpSessions.add(new SubHttpSession(request)); + } + + public String getId() { + return id; + } + + public void setServiceRegistration(ServiceRegistration serviceRegistration) { + this.serviceRegistration = serviceRegistration; + } + + public String toString() { + return "CMS Session #" + id; + } + + static class SubHttpSession { + private final HttpSession httpSession; + private final String sessionId; + private final String originalURI; + private final String servletPath; + + private final Date start = new Date(); + + public SubHttpSession(HttpServletRequest request) { + this.httpSession = request.getSession(); + this.sessionId = httpSession.getId(); + this.originalURI = request.getRequestURI(); + this.servletPath = request.getServletPath(); + } + + public Date getStart() { + return start; + } + + public void cleanUp() { + try { + httpSession.setAttribute(HttpContext.AUTHORIZATION, null); + httpSession.setMaxInactiveInterval(1); + } catch (Exception e) { + log.warn("Could not clean up " + sessionId, e); + } + } + + } +}