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 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 writeRemoteRoles(session
);
57 // since sessions is transient it can't be restored from the session
59 sessions
= Collections
60 .synchronizedMap(new HashMap
<String
, Session
>());
62 if (!sessions
.containsKey(workspace
)) {
64 JackrabbitSession session
= (JackrabbitSession
) rep
.login(
66 writeRemoteRoles(session
);
67 if (log
.isTraceEnabled())
68 log
.trace("User " + session
.getUserID()
69 + " logged into " + request
.getServletPath());
70 sessions
.put(workspace
, session
);
72 } catch (Exception e
) {
73 throw new ArgeoException("Cannot open session", e
);
76 Session session
= sessions
.get(workspace
);
77 if (!session
.isLive()) {
78 sessions
.remove(workspace
);
79 session
= rep
.login(null, workspace
);
80 sessions
.put(workspace
, session
);
87 protected void writeRemoteRoles(JackrabbitSession session
)
88 throws RepositoryException
{
89 if (!session
.getWorkspace().getName().equals(securityWorkspace
))
93 String userId
= session
.getUserID();
94 UserManager userManager
= session
.getUserManager();
95 User user
= (User
) userManager
.getAuthorizable(userId
);
100 List
<String
> userGroupIds
= new ArrayList
<String
>();
102 for (Iterator
<Group
> it
= user
.memberOf(); it
.hasNext();)
103 userGroupIds
.add(it
.next().getID());
105 // write roles if needed
106 Node userProfile
= JcrUtils
.getUserHome(session
).getNode(
107 ArgeoNames
.ARGEO_PROFILE
);
108 boolean writeRoles
= false;
109 if (userProfile
.hasProperty(ArgeoNames
.ARGEO_REMOTE_ROLES
)) {
110 Value
[] roles
= userProfile
.getProperty(
111 ArgeoNames
.ARGEO_REMOTE_ROLES
).getValues();
112 if (roles
.length
!= userGroupIds
.size())
115 for (int i
= 0; i
< roles
.length
; i
++)
116 if (!roles
[i
].getString().equals(userGroupIds
.get(i
)))
122 session
.getWorkspace().getVersionManager()
123 .checkout(userProfile
.getPath());
124 String
[] roleIds
= userGroupIds
.toArray(new String
[userGroupIds
126 userProfile
.setProperty(ArgeoNames
.ARGEO_REMOTE_ROLES
, roleIds
);
127 JcrUtils
.updateLastModified(userProfile
);
129 session
.getWorkspace().getVersionManager()
130 .checkin(userProfile
.getPath());
135 public void releaseSession(Session session
) {
136 if (log
.isTraceEnabled())
137 log
.trace("Releasing JCR session " + session
);
138 if (openSessionInView
) {
139 if (session
.isLive()) {
141 if (log
.isTraceEnabled())
142 log
.trace("Logged out remote JCR session " + session
);
150 public void dispose() {
151 if (sessions
!= null)
152 for (String workspace
: sessions
.keySet()) {
153 Session session
= sessions
.get(workspace
);
154 if (session
.isLive()) {
156 if (log
.isDebugEnabled())
157 log
.debug("Logged out remote JCR session " + session
);