1 package org
.argeo
.cms
.internal
.http
;
3 import java
.io
.Serializable
;
4 import java
.util
.LinkedHashMap
;
6 import javax
.jcr
.Repository
;
7 import javax
.jcr
.RepositoryException
;
8 import javax
.jcr
.Session
;
9 import javax
.servlet
.ServletException
;
10 import javax
.servlet
.http
.HttpServletRequest
;
12 import org
.apache
.commons
.logging
.Log
;
13 import org
.apache
.commons
.logging
.LogFactory
;
14 import org
.apache
.jackrabbit
.server
.SessionProvider
;
15 import org
.argeo
.cms
.internal
.auth
.CmsSessionImpl
;
16 import org
.argeo
.jcr
.JcrUtils
;
19 * Implements an open session in view patter: a new JCR session is created for
22 class CmsSessionProvider
implements SessionProvider
, Serializable
{
23 private static final long serialVersionUID
= -1358136599534938466L;
25 private final static Log log
= LogFactory
.getLog(CmsSessionProvider
.class);
27 private final String alias
;
29 private LinkedHashMap
<Session
, CmsSessionImpl
> cmsSessions
= new LinkedHashMap
<>();
31 public CmsSessionProvider(String alias
) {
35 public Session
getSession(HttpServletRequest request
, Repository rep
, String workspace
)
36 throws javax
.jcr
.LoginException
, ServletException
, RepositoryException
{
38 CmsSessionImpl cmsSession
= (CmsSessionImpl
) WebCmsSessionImpl
.getCmsSession(request
);
39 // if (cmsSession == null)
40 // return anonymousSession(request, rep, workspace);
41 if (log
.isTraceEnabled()) {
42 log
.debug("Get JCR session from " + cmsSession
);
44 Session session
= cmsSession
.getDataSession(alias
, workspace
, rep
);
45 cmsSessions
.put(session
, cmsSession
);
49 // private synchronized Session anonymousSession(HttpServletRequest request,
50 // Repository repository, String workspace) {
51 // // TODO rather log in here as anonymous?
52 // LoginContext lc = (LoginContext)
53 // request.getAttribute(NodeConstants.LOGIN_CONTEXT_ANONYMOUS);
55 // throw new CmsException("No login context available");
59 // session = Subject.doAs(lc.getSubject(), new
60 // PrivilegedExceptionAction<Session>() {
62 // public Session run() throws Exception {
63 // return repository.login(workspace);
66 // } catch (Exception e) {
67 // throw new CmsException("Cannot log in to JCR", e);
72 public synchronized void releaseSession(Session session
) {
73 if (cmsSessions
.containsKey(session
)) {
74 CmsSessionImpl cmsSession
= cmsSessions
.get(session
);
75 cmsSession
.releaseDataSession(alias
, session
);
77 log
.warn("JCR session " + session
+ " not found in CMS session list. Logging it out...");
78 JcrUtils
.logoutQuietly(session
);