You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by an...@apache.org on 2012/08/14 17:49:55 UTC

svn commit: r1372942 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/identifier/ oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/ oak-core/sr...

Author: angela
Date: Tue Aug 14 15:49:55 2012
New Revision: 1372942

URL: http://svn.apache.org/viewvc?rev=1372942&view=rev
Log:
OAK-50 : Implement User Management (WIP)

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/NamePathMapper.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/identifier/IdentifierManager.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserProviderImpl.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/user/UserProvider.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/util/NodeUtil.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionDelegate.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/AuthorizableIterator.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/MembershipManager.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/UserManagerImpl.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/NamePathMapper.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/NamePathMapper.java?rev=1372942&r1=1372941&r2=1372942&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/NamePathMapper.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/NamePathMapper.java Tue Aug 14 15:49:55 2012
@@ -24,6 +24,8 @@ import javax.annotation.Nonnull;
  */
 public interface NamePathMapper extends NameMapper, PathMapper {
 
+    public NamePathMapper DEFAULT = new Default();
+
     /**
      * Default implementation that doesn't perform any conversions for cases
      * where a mapper object only deals with oak internal names and paths.

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/identifier/IdentifierManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/identifier/IdentifierManager.java?rev=1372942&r1=1372941&r2=1372942&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/identifier/IdentifierManager.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/identifier/IdentifierManager.java Tue Aug 14 15:49:55 2012
@@ -16,6 +16,7 @@
  */
 package org.apache.jackrabbit.oak.plugins.identifier;
 
+import java.io.UnsupportedEncodingException;
 import java.text.ParseException;
 import java.util.Collections;
 import java.util.Map;
@@ -23,6 +24,7 @@ import java.util.Set;
 import java.util.UUID;
 import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
+import javax.jcr.RepositoryException;
 import javax.jcr.query.Query;
 
 import org.apache.jackrabbit.JcrConstants;
@@ -57,6 +59,16 @@ public class IdentifierManager {
         return UUID.randomUUID().toString();
     }
 
+    @Nonnull
+    public static String generateUUID(String hint) throws RepositoryException {
+        try {
+            UUID uuid = UUID.nameUUIDFromBytes(hint.getBytes("UTF-8"));
+            return uuid.toString();
+        } catch (UnsupportedEncodingException e) {
+            throw new RepositoryException("Unexpected error while creating authorizable node", e);
+        }
+    }
+
     public static boolean isValidUUID(String uuid) {
         try {
             UUID.fromString(uuid);
@@ -87,6 +99,13 @@ public class IdentifierManager {
         }
     }
 
+    /**
+     * The tree identified by the specified {@code identifier} or {@code null}.
+     *
+     * @param identifier The identifier of the Node such as exposed by {@link javax.jcr.Node#getIdentifier()}
+     * @return The tree with the given {@code identifier} or {@code null} if no
+     * such tree exists or isn't accessible to the content session.
+     */
     @CheckForNull
     public Tree getTree(String identifier) {
         if (isValidUUID(identifier)) {
@@ -99,8 +118,20 @@ public class IdentifierManager {
         }
     }
 
+    /**
+     * Searches all reference properties to the specified {@code tree} that match
+     * the given name and node type constraints.
+     *
+     * @param tree The tree for which references should be searched.
+     * @param propertyName A name constraint for the reference properties;
+     * {@code null} if no constraint should be enforced.
+     * @param nodeTypeNames Node type constraints to be enforced when using
+     * for reference properties.
+     * @return A set of oak paths of those reference properties referring to the
+     * specified {@code tree} and matching the constraints.
+     */
     @Nonnull
-    public Set<String> getReferences(Tree tree, String name) {
+    public Set<String> getReferences(Tree tree, String propertyName, String... nodeTypeNames) {
         if (!isReferenceable(tree)) {
             return Collections.emptySet();
         } else {
@@ -110,8 +141,20 @@ public class IdentifierManager {
         }
     }
 
+    /**
+     * Searches all weak reference properties to the specified {@code tree} that
+     * match the given name and node type constraints.
+     *
+     * @param tree The tree for which weak references should be searched.
+     * @param propertyName A name constraint for the weak reference properties;
+     * {@code null} if no constraint should be enforced.
+     * @param nodeTypeNames Node type constraints to be enforced when using
+     * for reference properties or {@code null} to avoid node type constraints.
+     * @return A set of oak paths of those weak reference properties referring to the
+     * specified {@code tree} and matching the constraints.
+     */
     @Nonnull
-    public Set<String> getWeakReferences(Tree tree, String name) {
+    public Set<String> getWeakReferences(Tree tree, String propertyName, String... nodeTypeNames) {
         if (!isReferenceable(tree)) {
             return Collections.emptySet();
         } else {
@@ -132,7 +175,7 @@ public class IdentifierManager {
             Map<String, CoreValue> bindings = Collections.singletonMap("id", contentSession.getCoreValueFactory().createValue(id));
 
             Result result = contentSession.getQueryEngine().executeQuery("SELECT * FROM [nt:base] WHERE [jcr:uuid] = $id", Query.JCR_SQL2,
-                    contentSession, Long.MAX_VALUE, 0, bindings, new NamePathMapper.Default());
+                    contentSession, Long.MAX_VALUE, 0, bindings, NamePathMapper.DEFAULT);
 
             String path = null;
             for (ResultRow rr : result.getRows()) {

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserProviderImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserProviderImpl.java?rev=1372942&r1=1372941&r2=1372942&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserProviderImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserProviderImpl.java Tue Aug 14 15:49:55 2012
@@ -16,15 +16,15 @@
  */
 package org.apache.jackrabbit.oak.security.user;
 
-import java.io.UnsupportedEncodingException;
-import java.util.UUID;
 import javax.jcr.RepositoryException;
 import javax.jcr.nodetype.ConstraintViolationException;
 
 import org.apache.jackrabbit.JcrConstants;
+import org.apache.jackrabbit.api.security.user.UserManager;
 import org.apache.jackrabbit.oak.api.ContentSession;
 import org.apache.jackrabbit.oak.api.Root;
 import org.apache.jackrabbit.oak.api.Tree;
+import org.apache.jackrabbit.oak.plugins.identifier.IdentifierManager;
 import org.apache.jackrabbit.oak.spi.security.user.UserConstants;
 import org.apache.jackrabbit.oak.spi.security.user.UserManagerConfig;
 import org.apache.jackrabbit.oak.spi.security.user.UserProvider;
@@ -121,6 +121,7 @@ public class UserProviderImpl implements
 
     private final ContentSession contentSession;
     private final Root root;
+    private final IdentifierManager identifierManager;
 
     private final int defaultDepth;
 
@@ -130,6 +131,7 @@ public class UserProviderImpl implements
     public UserProviderImpl(ContentSession contentSession, Root root, UserManagerConfig config) {
         this.contentSession = contentSession;
         this.root = root;
+        this.identifierManager = new IdentifierManager(contentSession, root);
 
         defaultDepth = config.getConfigValue(UserManagerConfig.PARAM_DEFAULT_DEPTH, DEFAULT_DEPTH);
 
@@ -148,21 +150,45 @@ public class UserProviderImpl implements
     }
 
     @Override
-    public Tree getAuthorizable(String authorizableId) {
-        // TODO: add implementation (requires identifier utility in oak-core)
-        return null;
+    public Tree getAuthorizable(String authorizableId) throws RepositoryException {
+        Tree tree = identifierManager.getTree(getContentID(authorizableId));
+        if (isAuthorizableTree(tree, UserManager.SEARCH_TYPE_AUTHORIZABLE)) {
+            return tree;
+        } else {
+            return null;
+        }
     }
 
     @Override
-    public String getContentID(String authorizableId) throws RepositoryException {
-        try {
-            UUID uuid = UUID.nameUUIDFromBytes(authorizableId.toLowerCase().getBytes("UTF-8"));
-            return uuid.toString();
-        } catch (UnsupportedEncodingException e) {
-            throw new RepositoryException("Unexpected error while creating authorizable node", e);
+    public Tree getAuthorizable(String authorizableId, int authorizableType) throws RepositoryException {
+        Tree tree = identifierManager.getTree(getContentID(authorizableId));
+        if (isAuthorizableTree(tree, authorizableType)) {
+            return tree;
+        } else {
+            return null;
         }
     }
 
+    @Override()
+    public Tree getAuthorizableByPath(String authorizableOakPath) {
+        Tree tree = root.getTree(authorizableOakPath);
+        if (isAuthorizableTree(tree, UserManager.SEARCH_TYPE_AUTHORIZABLE)) {
+            return tree;
+        } else {
+            return null;
+        }
+    }
+
+    //------------------------------------------------------------< private >---
+    private String getContentID(String authorizableId) throws RepositoryException {
+        return IdentifierManager.generateUUID(authorizableId.toLowerCase());
+    }
+
+    private boolean isAuthorizableTree(Tree tree, int type) {
+        // TODO: check for node type according to the specified type constraint
+        return true;
+    }
+
     private Tree createAuthorizableNode(String authorizableId, boolean isGroup, String intermediatePath) throws RepositoryException {
         String nodeName = Text.escapeIllegalJcrChars(authorizableId);
         NodeUtil folder = createFolderNodes(authorizableId, nodeName, isGroup, intermediatePath);

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/user/UserProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/user/UserProvider.java?rev=1372942&r1=1372941&r2=1372942&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/user/UserProvider.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/user/UserProvider.java Tue Aug 14 15:49:55 2012
@@ -35,8 +35,11 @@ public interface UserProvider {
     Tree createGroup(String groupId, String intermediateJcrPath) throws RepositoryException;
 
     @CheckForNull
-    Tree getAuthorizable(String authorizableId);
+    Tree getAuthorizable(String authorizableId) throws RepositoryException;
 
-    @Nonnull
-    String getContentID(String authorizableId) throws RepositoryException;
+    @CheckForNull
+    Tree getAuthorizable(String authorizableId, int authorizableType) throws RepositoryException;
+
+    @CheckForNull
+    Tree getAuthorizableByPath(String authorizableOakPath);
 }
\ No newline at end of file

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/util/NodeUtil.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/util/NodeUtil.java?rev=1372942&r1=1372941&r2=1372942&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/util/NodeUtil.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/util/NodeUtil.java Tue Aug 14 15:49:55 2012
@@ -60,7 +60,7 @@ public class NodeUtil {
     public NodeUtil(Tree tree, ContentSession contentSession) {
         this.tree = tree;
         this.factory = contentSession.getCoreValueFactory();
-        this.mapper = new NamePathMapper.Default();
+        this.mapper = NamePathMapper.DEFAULT;
     }
 
     @Nonnull

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionDelegate.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionDelegate.java?rev=1372942&r1=1372941&r2=1372942&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionDelegate.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionDelegate.java Tue Aug 14 15:49:55 2012
@@ -423,6 +423,10 @@ public class SessionDelegate {
         return observationManager;
     }
 
+    public IdentifierManager getIdManager() {
+        return idManager;
+    }
+
     @Nonnull
     public ContentSession getContentSession() {
         return contentSession;
@@ -439,10 +443,6 @@ public class SessionDelegate {
         return TODO.unimplemented().returnValue(new UserManagerImpl(this, root, null));
     }
 
-    IdentifierManager getIdManager() {
-        return idManager;
-    }
-
     //--------------------------------------------------< SessionNameMapper >---
 
     private class SessionNameMapper extends AbstractNameMapper {

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/AuthorizableIterator.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/AuthorizableIterator.java?rev=1372942&r1=1372941&r2=1372942&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/AuthorizableIterator.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/AuthorizableIterator.java Tue Aug 14 15:49:55 2012
@@ -16,22 +16,21 @@
  */
 package org.apache.jackrabbit.oak.jcr.security.user;
 
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+import javax.jcr.Property;
+import javax.jcr.RepositoryException;
+import javax.jcr.Value;
+
 import org.apache.jackrabbit.api.security.user.Authorizable;
 import org.apache.jackrabbit.commons.flat.PropertySequence;
 import org.apache.jackrabbit.oak.api.CoreValue;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.jcr.Node;
-import javax.jcr.Property;
-import javax.jcr.PropertyIterator;
-import javax.jcr.RepositoryException;
-import javax.jcr.Value;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-
 /**
  * AuthorizableIterator...
  */
@@ -39,7 +38,7 @@ class AuthorizableIterator implements It
 
     private static final Logger log = LoggerFactory.getLogger(AuthorizableIterator.class);
 
-    private final Iterator<?> nodeIds;
+    private final Iterator<?> authorizableIds;
     private final AuthorizableTypePredicate predicate;
     private final UserManagerImpl userManager;
     private final long size;
@@ -54,13 +53,13 @@ class AuthorizableIterator implements It
         this(authorizableNodeIds.iterator(), authorizableType, userManager, -1);  // TODO calculate size here
     }
 
-    AuthorizableIterator(PropertyIterator authorizableNodeIds, int authorizableType, UserManagerImpl userManager) {
-        this(authorizableNodeIds, authorizableType, userManager, authorizableNodeIds.getSize());
+    AuthorizableIterator(Collection<String> authorizablePaths, int authorizableType, UserManagerImpl userManager) {
+        this(authorizablePaths.iterator(), authorizableType, userManager, authorizablePaths.size());
     }
 
-    private AuthorizableIterator(Iterator<?> nodeIds, int authorizableType,
+    private AuthorizableIterator(Iterator<?> authorizableIds, int authorizableType,
                                  UserManagerImpl userManager, long size) {
-        this.nodeIds = nodeIds;
+        this.authorizableIds = authorizableIds;
         this.predicate = new AuthorizableTypePredicate(authorizableType);
         this.userManager = userManager;
         this.size = size;
@@ -96,11 +95,16 @@ class AuthorizableIterator implements It
     }
 
     private Authorizable fetchNext() {
-        while (nodeIds.hasNext()) {
+        while (authorizableIds.hasNext()) {
+            Object next = authorizableIds.next();
             try {
-                String nid = getNodeId(nodeIds.next());
-                Node n = userManager.getSession().getNodeByIdentifier(nid);
-                Authorizable a = userManager.getAuthorizable(n);
+                Authorizable a;
+                if (next instanceof String) {
+                    a = userManager.getAuthorizableByPath(next.toString());
+                } else {
+                    String nid = getNodeId(next);
+                    a = userManager.getAuthorizableByNodeID(nid);
+                }
                 if (a != null && predicate.evaluate(a)) {
                     return a;
                 }
@@ -108,7 +112,6 @@ class AuthorizableIterator implements It
                 log.debug(e.getMessage());
             }
         }
-
         return null;
     }
 
@@ -118,7 +121,7 @@ class AuthorizableIterator implements It
         } else if (o instanceof Value) {
             return ((Value) o).getString();
         } else if (o instanceof Property) {
-            return ((Property) o).getString();
+            return ((Property) o).getParent().getUUID();
         } else {
             return o.toString();
         }

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/MembershipManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/MembershipManager.java?rev=1372942&r1=1372941&r2=1372942&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/MembershipManager.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/MembershipManager.java Tue Aug 14 15:49:55 2012
@@ -18,10 +18,11 @@ package org.apache.jackrabbit.oak.jcr.se
 
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Set;
 import javax.jcr.Node;
-import javax.jcr.PropertyIterator;
 import javax.jcr.PropertyType;
 import javax.jcr.RepositoryException;
 
@@ -40,6 +41,8 @@ import org.apache.jackrabbit.oak.api.Cor
 import org.apache.jackrabbit.oak.api.CoreValueFactory;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Tree;
+import org.apache.jackrabbit.oak.namepath.NamePathMapper;
+import org.apache.jackrabbit.oak.plugins.identifier.IdentifierManager;
 import org.apache.jackrabbit.oak.spi.security.user.UserConstants;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -60,17 +63,24 @@ class MembershipManager implements UserC
     }
 
     Iterator<Group> getMembership(AuthorizableImpl authorizable, boolean includeInherited) throws RepositoryException {
-        PropertyIterator refs = null;
-        try {
-            String nodeID = authorizable.getContentID();
-            refs = authorizable.getNode().getWeakReferences(null);
-        } catch (RepositoryException e) {
-            log.error("Failed to retrieve membership references of " + authorizable.getID(), e);
-            // TODO retrieve by traversing
+        Set<String> groupPaths = new HashSet<String>();
+
+        String nodeID = authorizable.getContentID();
+        IdentifierManager idManager = userManager.getSessionDelegate().getIdManager();
+        NamePathMapper mapper = userManager.getSessionDelegate().getNamePathMapper();
+
+        Set<String> refPaths = idManager.getWeakReferences(authorizable.getTree(), null, NT_REP_GROUP, NT_REP_MEMBERS);
+        for (String propPath : refPaths) {
+            int index = propPath.indexOf('/'+REP_MEMBERS);
+            if (index > 0) {
+                groupPaths.add(mapper.getJcrPath(propPath.substring(0,index)));
+            } else {
+                log.debug("Not a membership reference property " + propPath);
+            }
         }
 
-        if (refs != null) {
-            AuthorizableIterator iterator = new AuthorizableIterator(refs, UserManager.SEARCH_TYPE_GROUP, userManager);
+        if (!groupPaths.isEmpty()) {
+            AuthorizableIterator iterator = new AuthorizableIterator(groupPaths, UserManager.SEARCH_TYPE_GROUP, userManager);
             if (includeInherited) {
                 return getAllMembership(iterator);
             } else {

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/UserManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/UserManagerImpl.java?rev=1372942&r1=1372941&r2=1372942&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/UserManagerImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/UserManagerImpl.java Tue Aug 14 15:49:55 2012
@@ -21,7 +21,7 @@ import java.security.NoSuchAlgorithmExce
 import java.security.Principal;
 import java.util.Iterator;
 import java.util.List;
-import javax.jcr.ItemNotFoundException;
+import javax.annotation.CheckForNull;
 import javax.jcr.Node;
 import javax.jcr.PathNotFoundException;
 import javax.jcr.PropertyType;
@@ -82,16 +82,9 @@ public class UserManagerImpl implements 
     @Override
     public Authorizable getAuthorizable(String id) throws RepositoryException {
         Authorizable authorizable = null;
-        // TODO: replace
-//        Tree tree = userProvider.getAuthorizable(id);
-//        if (tree != null) {
-//            authorizable = getAuthorizable(tree);
-//        }
-        try {
-            Node node = getSession().getNodeByIdentifier(userProvider.getContentID(id));
-            authorizable = getAuthorizable(node);
-        } catch (ItemNotFoundException e) {
-            log.debug("No authorizable with ID " + id);
+        Tree tree = userProvider.getAuthorizable(id);
+        if (tree != null) {
+            authorizable = getAuthorizable(tree);
         }
         return authorizable;
     }
@@ -104,13 +97,13 @@ public class UserManagerImpl implements 
         Session session = getSession();
         Authorizable authorizable = null;
         if (principal instanceof ItemBasedPrincipal) {
-            String authPath = ((ItemBasedPrincipal) principal).getPath();
-            if (session.nodeExists(authPath)) {
-                Node n = session.getNode(authPath);
-                authorizable = getAuthorizable(n);
-            }
+            String authJcrPath = ((ItemBasedPrincipal) principal).getPath();
+            String oakPath = sessionDelegate.getNamePathMapper().getOakPath(authJcrPath);
+            authorizable = getAuthorizable(userProvider.getAuthorizableByPath(oakPath));
         } else {
             // another Principal implementation.
+            // first try shortcut for cases where principalName equals the ID.
+            // second use a query to find the authorizable by principalName.
             String name = principal.getName();
             Authorizable a = getAuthorizable(name);
             if (a != null && name.equals(a.getPrincipal().getName())) {
@@ -132,18 +125,13 @@ public class UserManagerImpl implements 
      */
     @Override
     public Authorizable getAuthorizableByPath(String path) throws RepositoryException {
-        Session session = getSession();
-        if (session.nodeExists(path)) {
-            return getAuthorizable(session.getNode(path));
-        } else {
-            return null;
-        }
+        String oakPath = sessionDelegate.getOakPathOrThrow(path);
+        return getAuthorizable(userProvider.getAuthorizableByPath(oakPath));
     }
 
     @Override
     public Iterator<Authorizable> findAuthorizables(String relPath, String value) throws RepositoryException {
-        // TODO : create and execute a query
-        throw new UnsupportedOperationException("Not Implemented");
+        return findAuthorizables(relPath, value, SEARCH_TYPE_AUTHORIZABLE);
     }
 
     @Override
@@ -394,16 +382,26 @@ public class UserManagerImpl implements 
         return membershipManager;
     }
 
-    Authorizable getAuthorizable(Node node) throws RepositoryException {
+    @CheckForNull
+    Authorizable getAuthorizable(Tree tree) throws RepositoryException {
+        if (tree == null) {
+            return null;
+        }
+        Node node = util.getNode(tree);
         if (node.isNodeType(getJcrName(UserConstants.NT_REP_USER))) {
-            return new UserImpl(node, util.getTree(node), this);
+            return new UserImpl(node, tree, this);
         } else if (node.isNodeType(getJcrName(UserConstants.NT_REP_GROUP))) {
-            return new GroupImpl(node, util.getTree(node), this);
+            return new GroupImpl(node, tree, this);
         } else {
             throw new RepositoryException("Unexpected node type " + node.getPrimaryNodeType().getName() + ". Expected rep:User or rep:Group.");
         }
     }
 
+    @CheckForNull
+    Authorizable getAuthorizableByNodeID(String identifier) throws RepositoryException {
+        return getAuthorizable(sessionDelegate.getIdManager().getTree(identifier));
+    }
+
     String getJcrName(String oakName) {
         return sessionDelegate.getNamePathMapper().getJcrName(oakName);
     }