X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=server%2Fruntime%2Forg.argeo.server.jcr%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fjcr%2FJcrUtils.java;h=77309feea0ad8e88c507b81f279184ac3b750373;hb=019e0f2af17286be08ab17c1c9e1d8ba871ec9b2;hp=72b94fbcd0590baef6c4b30049282dd61cdc0ae0;hpb=03db65bd74ce09b696a4c5af15a58df988e5368d;p=lgpl%2Fargeo-commons.git diff --git a/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/JcrUtils.java b/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/JcrUtils.java index 72b94fbcd..77309feea 100644 --- a/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/JcrUtils.java +++ b/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/JcrUtils.java @@ -650,6 +650,12 @@ public class JcrUtils implements ArgeoJcrConstants { return getUserHome(session, userID); } + /** Get the profile of the user attached to this session. */ + public static Node getUserProfile(Session session) { + String userID = session.getUserID(); + return getUserProfile(session, userID); + } + /** * Returns the home node of the session user or null if none was found. * @@ -681,4 +687,58 @@ public class JcrUtils implements ArgeoJcrConstants { throw new ArgeoException("Cannot find home for user " + userID, e); } } + + public static Node getUserProfile(Session session, String userID) { + try { + QueryObjectModelFactory qomf = session.getWorkspace() + .getQueryManager().getQOMFactory(); + Selector sel = qomf.selector(ArgeoTypes.ARGEO_USER_PROFILE, + "userProfile"); + DynamicOperand userIdDop = qomf.propertyValue("userProfile", + ArgeoNames.ARGEO_USER_ID); + StaticOperand userIdSop = qomf.literal(session.getValueFactory() + .createValue(userID)); + Constraint constraint = qomf.comparison(userIdDop, + QueryObjectModelFactory.JCR_OPERATOR_EQUAL_TO, userIdSop); + Query query = qomf.createQuery(sel, constraint, null, null); + Node userHome = JcrUtils.querySingleNode(query); + return userHome; + } catch (RepositoryException e) { + throw new ArgeoException("Cannot find profile for user " + userID, + e); + } + } + + public static Node createUserHome(Session session, String homeBasePath, + String username) { + try { + if (session.hasPendingChanges()) + throw new ArgeoException( + "Session has pending changes, save them first"); + String homePath = homeBasePath + '/' + + firstCharsToPath(username, 2) + '/' + username; + Node userHome = JcrUtils.mkdirs(session, homePath); + + Node userProfile = userHome.addNode(ArgeoNames.ARGEO_PROFILE); + userProfile.addMixin(ArgeoTypes.ARGEO_USER_PROFILE); + userProfile.setProperty(ArgeoNames.ARGEO_USER_ID, username); + session.save(); + // we need to save the profile before adding the user home type + PropertyIterator pit = userHome.getProperties(); + while (pit.hasNext()) { + Property p = pit.nextProperty(); + log.debug(p.getName() + "=" + p.getValue().getString()); + } + userHome.addMixin(ArgeoTypes.ARGEO_USER_HOME); + // see + // http://jackrabbit.510166.n4.nabble.com/Jackrabbit-2-0-beta-6-Problem-adding-a-Mixin-type-with-mandatory-properties-after-setting-propertiesn-td1290332.html + userHome.setProperty(ArgeoNames.ARGEO_USER_ID, username); + session.save(); + return userHome; + } catch (RepositoryException e) { + discardQuietly(session); + throw new ArgeoException("Cannot create home node for user " + + username, e); + } + } }