1 package org
.argeo
.jackrabbit
.remote
;
3 import java
.io
.Serializable
;
4 import java
.util
.ArrayList
;
5 import java
.util
.Collections
;
6 import java
.util
.HashMap
;
7 import java
.util
.Iterator
;
11 import javax
.jcr
.LoginException
;
12 import javax
.jcr
.Node
;
13 import javax
.jcr
.Repository
;
14 import javax
.jcr
.RepositoryException
;
15 import javax
.jcr
.Session
;
16 import javax
.jcr
.Value
;
17 import javax
.servlet
.ServletException
;
18 import javax
.servlet
.http
.HttpServletRequest
;
20 import org
.apache
.commons
.logging
.Log
;
21 import org
.apache
.commons
.logging
.LogFactory
;
22 import org
.apache
.jackrabbit
.api
.JackrabbitSession
;
23 import org
.apache
.jackrabbit
.api
.security
.user
.Group
;
24 import org
.apache
.jackrabbit
.api
.security
.user
.User
;
25 import org
.apache
.jackrabbit
.api
.security
.user
.UserManager
;
26 import org
.apache
.jackrabbit
.server
.SessionProvider
;
27 import org
.argeo
.ArgeoException
;
28 import org
.argeo
.jcr
.ArgeoNames
;
29 import org
.argeo
.jcr
.JcrUtils
;
32 * Implements an open session in view patter: a new JCR session is created for
35 public class SimpleSessionProvider
implements SessionProvider
, Serializable
{
36 private static final long serialVersionUID
= 2270957712453841368L;
38 private final static Log log
= LogFactory
39 .getLog(SimpleSessionProvider
.class);
41 private transient Map
<String
, Session
> sessions
;
43 private Boolean openSessionInView
= true;
45 private String securityWorkspace
= "security";
47 public Session
getSession(HttpServletRequest request
, Repository rep
,
48 String workspace
) throws LoginException
, ServletException
,
51 if (openSessionInView
) {
52 JackrabbitSession session
= (JackrabbitSession
) rep
54 if (!workspace
.equals(securityWorkspace
))
55 writeRemoteRoles(session
);
58 // since sessions is transient it can't be restored from the session
60 sessions
= Collections
61 .synchronizedMap(new HashMap
<String
, Session
>());
63 if (!sessions
.containsKey(workspace
)) {
65 JackrabbitSession session
= (JackrabbitSession
) rep
.login(
67 if (!workspace
.equals(securityWorkspace
))
68 writeRemoteRoles(session
);
69 if (log
.isTraceEnabled())
70 log
.trace("User " + session
.getUserID()
71 + " logged into " + request
.getServletPath());
72 sessions
.put(workspace
, session
);
74 } catch (Exception e
) {
75 throw new ArgeoException("Cannot open session", e
);
78 Session session
= sessions
.get(workspace
);
79 if (!session
.isLive()) {
80 sessions
.remove(workspace
);
81 session
= rep
.login(null, workspace
);
82 sessions
.put(workspace
, session
);
89 protected void writeRemoteRoles(JackrabbitSession session
)
90 throws RepositoryException
{
92 String userId
= session
.getUserID();
93 UserManager userManager
= session
.getUserManager();
94 User user
= (User
) userManager
.getAuthorizable(userId
);
99 List
<String
> userGroupIds
= new ArrayList
<String
>();
101 for (Iterator
<Group
> it
= user
.memberOf(); it
.hasNext();)
102 userGroupIds
.add(it
.next().getID());
104 // write roles if needed
105 Node userProfile
= JcrUtils
.getUserHome(session
).getNode(
106 ArgeoNames
.ARGEO_PROFILE
);
107 boolean writeRoles
= false;
108 if (userProfile
.hasProperty(ArgeoNames
.ARGEO_REMOTE_ROLES
)) {
109 Value
[] roles
= userProfile
.getProperty(
110 ArgeoNames
.ARGEO_REMOTE_ROLES
).getValues();
111 if (roles
.length
!= userGroupIds
.size())
114 for (int i
= 0; i
< roles
.length
; i
++)
115 if (!roles
[i
].getString().equals(userGroupIds
.get(i
)))
121 session
.getWorkspace().getVersionManager()
122 .checkout(userProfile
.getPath());
123 String
[] roleIds
= userGroupIds
.toArray(new String
[userGroupIds
125 userProfile
.setProperty(ArgeoNames
.ARGEO_REMOTE_ROLES
, roleIds
);
126 JcrUtils
.updateLastModified(userProfile
);
128 session
.getWorkspace().getVersionManager()
129 .checkin(userProfile
.getPath());
134 public void releaseSession(Session session
) {
135 if (log
.isTraceEnabled())
136 log
.trace("Releasing JCR session " + session
);
137 if (openSessionInView
) {
138 if (session
.isLive()) {
140 if (log
.isTraceEnabled())
141 log
.trace("Logged out remote JCR session " + session
);
149 public void destroy() {
150 if (sessions
!= null)
151 for (String workspace
: sessions
.keySet()) {
152 Session session
= sessions
.get(workspace
);
153 if (session
.isLive()) {
155 if (log
.isDebugEnabled())
156 log
.debug("Logged out remote JCR session " + session
);
162 * If set to true a new session will be created each time (the default),
163 * otherwise a single session is cached by workspace and the object should
164 * be of scope session (not supported)
166 public void setOpenSessionInView(Boolean openSessionInView
) {
167 this.openSessionInView
= openSessionInView
;
170 public void setSecurityWorkspace(String securityWorkspace
) {
171 this.securityWorkspace
= securityWorkspace
;