View Javadoc
1   package org.argeo.cms.internal.http;
2   
3   import java.io.Serializable;
4   import java.util.LinkedHashMap;
5   
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;
11  
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;
17  
18  /**
19   * Implements an open session in view patter: a new JCR session is created for
20   * each request
21   */
22  public class CmsSessionProvider implements SessionProvider, Serializable {
23  	private static final long serialVersionUID = -1358136599534938466L;
24  
25  	private final static Log log = LogFactory.getLog(CmsSessionProvider.class);
26  
27  	private final String alias;
28  
29  	private LinkedHashMap<Session, CmsSessionImpl> cmsSessions = new LinkedHashMap<>();
30  
31  	public CmsSessionProvider(String alias) {
32  		this.alias = alias;
33  	}
34  
35  	public Session getSession(HttpServletRequest request, Repository rep, String workspace)
36  			throws javax.jcr.LoginException, ServletException, RepositoryException {
37  
38  		// a client is scanning parent URLs.
39  //		if (workspace == null)
40  //			return null;
41  
42  		CmsSessionImpl cmsSession = WebCmsSessionImpl.getCmsSession(request);
43  		if (log.isTraceEnabled()) {
44  			log.trace("Get JCR session from " + cmsSession);
45  		}
46  		if (cmsSession == null)
47  			throw new IllegalStateException("Cannot find a session for request " + request.getRequestURI());
48  		Session session = cmsSession.getDataSession(alias, workspace, rep);
49  		cmsSessions.put(session, cmsSession);
50  		return session;
51  	}
52  
53  	public void releaseSession(Session session) {
54  //		JcrUtils.logoutQuietly(session);
55  		if (cmsSessions.containsKey(session)) {
56  			CmsSessionImpl cmsSession = cmsSessions.get(session);
57  			cmsSession.releaseDataSession(alias, session);
58  		} else {
59  			log.warn("JCR session " + session + " not found in CMS session list. Logging it out...");
60  			JcrUtils.logoutQuietly(session);
61  		}
62  	}
63  }