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 * To be injected, typically of scope="session". Implements an open session in
33 * view patter: a new JCR session is created for each request
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 public Session
getSession(HttpServletRequest request
, Repository rep
,
46 String workspace
) throws LoginException
, ServletException
,
49 if (openSessionInView
) {
50 JackrabbitSession session
= (JackrabbitSession
) rep
52 writeRemoteRoles(session
);
55 // since sessions is transient it can't be restored from the session
57 sessions
= Collections
58 .synchronizedMap(new HashMap
<String
, Session
>());
60 if (!sessions
.containsKey(workspace
)) {
62 JackrabbitSession session
= (JackrabbitSession
) rep
.login(
64 writeRemoteRoles(session
);
65 if (log
.isTraceEnabled())
66 log
.trace("User " + session
.getUserID()
67 + " logged into " + request
.getServletPath());
68 sessions
.put(workspace
, session
);
70 } catch (Exception e
) {
71 throw new ArgeoException("Cannot open session", e
);
74 Session session
= sessions
.get(workspace
);
75 if (!session
.isLive()) {
76 sessions
.remove(workspace
);
77 session
= rep
.login(null, workspace
);
78 sessions
.put(workspace
, session
);
85 protected void writeRemoteRoles(JackrabbitSession session
)
86 throws RepositoryException
{
88 String userId
= session
.getUserID();
89 UserManager userManager
= session
.getUserManager();
90 User user
= (User
) userManager
.getAuthorizable(userId
);
95 List
<String
> userGroupIds
= new ArrayList
<String
>();
97 for (Iterator
<Group
> it
= user
.memberOf(); it
.hasNext();)
98 userGroupIds
.add(it
.next().getID());
100 // write roles if needed
101 Node userProfile
= JcrUtils
.getUserProfile(session
);
102 boolean writeRoles
= false;
103 if (userProfile
.hasProperty(ArgeoNames
.ARGEO_REMOTE_ROLES
)) {
104 Value
[] roles
= userProfile
.getProperty(
105 ArgeoNames
.ARGEO_REMOTE_ROLES
).getValues();
106 if (roles
.length
!= userGroupIds
.size())
109 for (int i
= 0; i
< roles
.length
; i
++)
110 if (!roles
[i
].getString().equals(userGroupIds
.get(i
)))
116 session
.getWorkspace().getVersionManager()
117 .checkout(userProfile
.getPath());
118 String
[] roleIds
= userGroupIds
.toArray(new String
[userGroupIds
120 userProfile
.setProperty(ArgeoNames
.ARGEO_REMOTE_ROLES
, roleIds
);
121 JcrUtils
.updateLastModified(userProfile
);
123 session
.getWorkspace().getVersionManager()
124 .checkin(userProfile
.getPath());
129 public void releaseSession(Session session
) {
130 if (log
.isTraceEnabled())
131 log
.trace("Releasing JCR session " + session
);
132 if (openSessionInView
) {
133 if (session
.isLive()) {
135 if (log
.isTraceEnabled())
136 log
.trace("Logged out remote JCR session " + session
);
144 public void dispose() {
145 if (sessions
!= null)
146 for (String workspace
: sessions
.keySet()) {
147 Session session
= sessions
.get(workspace
);
148 if (session
.isLive()) {
150 if (log
.isDebugEnabled())
151 log
.debug("Logged out remote JCR session " + session
);