/*
- * Copyright (C) 2007-2012 Mathieu Baudier
+ * Copyright (C) 2007-2012 Argeo GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
import org.argeo.ArgeoException;
import org.argeo.jcr.ArgeoNames;
import org.argeo.jcr.JcrUtils;
+import org.argeo.jcr.UserJcrUtils;
/**
* Implements an open session in view patter: a new JCR session is created for
* each request
+ *
+ * @deprecated use {@link ScopedSessionProvider} or
+ * {@link OpenInViewSessionProvider}
*/
+@Deprecated
public class SimpleSessionProvider implements SessionProvider, Serializable {
private static final long serialVersionUID = 2270957712453841368L;
private Boolean openSessionInView = true;
- private String securityWorkspace = "security";
+ private String defaultWorkspace = "default";
+
+ private String webSessionId = null;
public Session getSession(HttpServletRequest request, Repository rep,
String workspace) throws LoginException, ServletException,
RepositoryException {
if (openSessionInView) {
- JackrabbitSession session = (JackrabbitSession) rep
- .login(workspace);
- if (session.getWorkspace().getName().equals(securityWorkspace))
+ JackrabbitSession session = (JackrabbitSession) login(request, rep,
+ workspace);
+ if (session.getWorkspace().getName().equals(defaultWorkspace))
writeRemoteRoles(session);
return session;
} else {
+ if (webSessionId != null
+ && !webSessionId.equals(request.getSession().getId()))
+ throw new ArgeoException(
+ "Only session scope is supported in this mode");
+ webSessionId = request.getSession().getId();
+
// since sessions is transient it can't be restored from the session
if (sessions == null)
sessions = Collections
if (!sessions.containsKey(workspace)) {
try {
- JackrabbitSession session = (JackrabbitSession) rep.login(
- null, workspace);
+ // JackrabbitSession session = (JackrabbitSession)
+ // rep.login(
+ // null, workspace);
+ JackrabbitSession session = (JackrabbitSession) login(
+ request, rep, workspace);
if (session.getWorkspace().getName()
- .equals(securityWorkspace))
+ .equals(defaultWorkspace))
writeRemoteRoles(session);
if (log.isTraceEnabled())
log.trace("User " + session.getUserID()
Session session = sessions.get(workspace);
if (!session.isLive()) {
sessions.remove(workspace);
- session = rep.login(null, workspace);
+ session = login(request, rep, workspace);
sessions.put(workspace, session);
}
return session;
}
}
+ protected Session login(HttpServletRequest request, Repository repository,
+ String workspace) throws RepositoryException {
+ if (log.isDebugEnabled())
+ log.debug("Login to workspace "
+ + (workspace == null ? "<default>" : workspace)
+ + " in web session " + request.getSession().getId());
+ return repository.login(workspace);
+ }
+
protected void writeRemoteRoles(JackrabbitSession session)
throws RepositoryException {
+ // FIXME better deal w/ non node repo
+
// retrieve roles
String userId = session.getUserID();
UserManager userManager = session.getUserManager();
userGroupIds.add(it.next().getID());
// write roles if needed
- Node userProfile = JcrUtils.getUserHome(session).getNode(
- ArgeoNames.ARGEO_PROFILE);
+ Node userHome = UserJcrUtils.getUserHome(session);
boolean writeRoles = false;
- if (userProfile.hasProperty(ArgeoNames.ARGEO_REMOTE_ROLES)) {
- Value[] roles = userProfile.getProperty(
- ArgeoNames.ARGEO_REMOTE_ROLES).getValues();
+ if (userHome.hasProperty(ArgeoNames.ARGEO_REMOTE_ROLES)) {
+ Value[] roles = userHome.getProperty(ArgeoNames.ARGEO_REMOTE_ROLES)
+ .getValues();
if (roles.length != userGroupIds.size())
writeRoles = true;
else
if (writeRoles) {
session.getWorkspace().getVersionManager()
- .checkout(userProfile.getPath());
+ .checkout(userHome.getPath());
String[] roleIds = userGroupIds.toArray(new String[userGroupIds
.size()]);
- userProfile.setProperty(ArgeoNames.ARGEO_REMOTE_ROLES, roleIds);
- JcrUtils.updateLastModified(userProfile);
+ userHome.setProperty(ArgeoNames.ARGEO_REMOTE_ROLES, roleIds);
+ JcrUtils.updateLastModified(userHome);
session.save();
session.getWorkspace().getVersionManager()
- .checkin(userProfile.getPath());
+ .checkin(userHome.getPath());
}
}
if (log.isTraceEnabled())
log.trace("Releasing JCR session " + session);
if (openSessionInView) {
- if (session.isLive()) {
- session.logout();
- if (log.isTraceEnabled())
- log.trace("Logged out remote JCR session " + session);
- }
+ JcrUtils.logoutQuietly(session);
+ if (log.isDebugEnabled())
+ log.debug("Logged out remote JCR session " + session);
}
}
public void init() {
+ if (log.isDebugEnabled())
+ log.debug("Init session provider for web session " + webSessionId);
}
public void destroy() {
+ if (log.isDebugEnabled())
+ log.debug("Destroy session provider for web session "
+ + webSessionId);
+
if (sessions != null)
for (String workspace : sessions.keySet()) {
Session session = sessions.get(workspace);
- if (session.isLive()) {
- session.logout();
- if (log.isDebugEnabled())
- log.debug("Logged out remote JCR session " + session);
- }
+ JcrUtils.logoutQuietly(session);
}
}
}
public void setSecurityWorkspace(String securityWorkspace) {
- this.securityWorkspace = securityWorkspace;
+ this.defaultWorkspace = securityWorkspace;
}
}