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 md...@apache.org on 2013/12/16 14:31:59 UTC

svn commit: r1551208 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/ oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/

Author: mduerig
Date: Mon Dec 16 13:31:58 2013
New Revision: 1551208

URL: http://svn.apache.org/r1551208
Log:
OAK-938 incomplete: session refresh must also be reflected on derived interfaces
Wrap Authorizable, User, Group and Impersonation into respective delegator instances

Added:
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/AuthorizableDelegator.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/GroupDelegator.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/ImpersonationDelegator.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/UserDelegator.java
Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/AuthorizableImpl.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/UserManagerDelegator.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/AuthorizableImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/AuthorizableImpl.java?rev=1551208&r1=1551207&r2=1551208&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/AuthorizableImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/AuthorizableImpl.java Mon Dec 16 13:31:58 2013
@@ -16,8 +16,11 @@
  */
 package org.apache.jackrabbit.oak.security.user;
 
+import static org.apache.jackrabbit.oak.api.Type.STRING;
+
 import java.util.Collections;
 import java.util.Iterator;
+
 import javax.annotation.Nonnull;
 import javax.jcr.RepositoryException;
 import javax.jcr.Value;
@@ -36,8 +39,6 @@ import org.apache.jackrabbit.oak.spi.sec
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import static org.apache.jackrabbit.oak.api.Type.STRING;
-
 /**
  * Base class for {@code User} and {@code Group} implementations.
  */
@@ -161,6 +162,8 @@ abstract class AuthorizableImpl implemen
         if (obj instanceof AuthorizableImpl) {
             AuthorizableImpl otherAuth = (AuthorizableImpl) obj;
             return isGroup() == otherAuth.isGroup() && id.equals(otherAuth.id) && userManager.equals(otherAuth.userManager);
+        } else if (obj instanceof Authorizable) {
+            return obj.equals(this);
         }
         return false;
     }

Added: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/AuthorizableDelegator.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/AuthorizableDelegator.java?rev=1551208&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/AuthorizableDelegator.java (added)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/AuthorizableDelegator.java Mon Dec 16 13:31:58 2013
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.jackrabbit.oak.jcr.delegate;
+
+import org.apache.jackrabbit.api.security.user.Authorizable;
+import org.apache.jackrabbit.api.security.user.Group;
+import org.apache.jackrabbit.api.security.user.User;
+
+/**
+ * Utility class for creating the correct delegator instance (either
+ * {@link GroupDelegator} or {@link UserDelegator} for a given
+ * {@link Authorizable}.
+ */
+public final class AuthorizableDelegator {
+    private AuthorizableDelegator() {}
+
+    public static Authorizable wrap(SessionDelegate sessionDelegate, Authorizable authorizable) {
+        if (authorizable.isGroup()) {
+            return new GroupDelegator(sessionDelegate, (Group) authorizable);
+        } else {
+            return new UserDelegator(sessionDelegate, (User) authorizable);
+        }
+    }
+
+}

Added: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/GroupDelegator.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/GroupDelegator.java?rev=1551208&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/GroupDelegator.java (added)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/GroupDelegator.java Mon Dec 16 13:31:58 2013
@@ -0,0 +1,289 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.jackrabbit.oak.jcr.delegate;
+
+import static com.google.common.base.Preconditions.checkState;
+
+import java.security.Principal;
+import java.util.Iterator;
+
+import javax.annotation.Nullable;
+import javax.jcr.RepositoryException;
+import javax.jcr.UnsupportedRepositoryOperationException;
+import javax.jcr.Value;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Iterators;
+import org.apache.jackrabbit.api.security.user.Authorizable;
+import org.apache.jackrabbit.api.security.user.Group;
+import org.apache.jackrabbit.oak.jcr.session.operation.SessionOperation;
+
+/**
+ * This implementation of {@code Group} delegates back to a
+ * delegatee wrapping each call into a {@link SessionOperation} closure.
+ *
+ * @see SessionDelegate#perform(SessionOperation)
+ */
+public final class GroupDelegator implements Group {
+    private final SessionDelegate sessionDelegate;
+    private final Group groupDelegate;
+
+    public GroupDelegator(SessionDelegate sessionDelegate, Group groupDelegate) {
+        checkState(!(groupDelegate instanceof GroupDelegator));
+        this.sessionDelegate = sessionDelegate;
+        this.groupDelegate = groupDelegate;
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        return other.equals(this.groupDelegate);
+    }
+
+    @Override
+    public Iterator<Authorizable> getDeclaredMembers() throws RepositoryException {
+        return sessionDelegate.perform(new SessionOperation<Iterator<Authorizable>>() {
+            @Override
+            public Iterator<Authorizable> perform() throws RepositoryException {
+                Iterator<Authorizable> authorizables = groupDelegate.getDeclaredMembers();
+                return Iterators.transform(authorizables, new Function<Authorizable, Authorizable>() {
+                    @Nullable
+                    @Override
+                    public Authorizable apply(@Nullable Authorizable authorizable) {
+                        return AuthorizableDelegator.wrap(sessionDelegate, authorizable);
+                    }
+                });
+            }
+        });
+    }
+
+    @Override
+    public Iterator<Authorizable> getMembers() throws RepositoryException {
+        return sessionDelegate.perform(new SessionOperation<Iterator<Authorizable>>() {
+            @Override
+            public Iterator<Authorizable> perform() throws RepositoryException {
+                Iterator<Authorizable> authorizables = groupDelegate.getMembers();
+                return Iterators.transform(authorizables, new Function<Authorizable, Authorizable>() {
+                    @Nullable
+                    @Override
+                    public Authorizable apply(@Nullable Authorizable authorizable) {
+                        return AuthorizableDelegator.wrap(sessionDelegate, authorizable);
+                    }
+                });
+            }
+        });
+    }
+
+    @Override
+    public boolean isDeclaredMember(final Authorizable authorizable) throws RepositoryException {
+        return sessionDelegate.perform(new SessionOperation<Boolean>() {
+            @Override
+            public Boolean perform() throws RepositoryException {
+                return groupDelegate.isDeclaredMember(authorizable);
+            }
+        });
+    }
+
+    @Override
+    public boolean isMember(final Authorizable authorizable) throws RepositoryException {
+        return sessionDelegate.perform(new SessionOperation<Boolean>() {
+            @Override
+            public Boolean perform() throws RepositoryException {
+                return groupDelegate.isMember(authorizable);
+            }
+        });
+    }
+
+    @Override
+    public boolean addMember(final Authorizable authorizable) throws RepositoryException {
+        return sessionDelegate.perform(new SessionOperation<Boolean>() {
+            @Override
+            public Boolean perform() throws RepositoryException {
+                return groupDelegate.addMember(authorizable);
+            }
+        });
+    }
+
+    @Override
+    public boolean removeMember(final Authorizable authorizable) throws RepositoryException {
+        return sessionDelegate.perform(new SessionOperation<Boolean>() {
+            @Override
+            public Boolean perform() throws RepositoryException {
+                return groupDelegate.removeMember(authorizable);
+            }
+        });
+    }
+
+    @Override
+    public String getID() throws RepositoryException {
+        return sessionDelegate.perform(new SessionOperation<String>() {
+            @Override
+            public String perform() throws RepositoryException {
+                return groupDelegate.getID();
+            }
+        });
+    }
+
+    @Override
+    public boolean isGroup() {
+        return sessionDelegate.safePerform(new SessionOperation<Boolean>() {
+            @Override
+            public Boolean perform() {
+                return groupDelegate.isGroup();
+            }
+        });
+    }
+
+    @Override
+    public Principal getPrincipal() throws RepositoryException {
+        return sessionDelegate.perform(new SessionOperation<Principal>() {
+            @Override
+            public Principal perform() throws RepositoryException {
+                return groupDelegate.getPrincipal();
+            }
+        });
+    }
+
+    @Override
+    public Iterator<Group> declaredMemberOf() throws RepositoryException {
+        return sessionDelegate.perform(new SessionOperation<Iterator<Group>>() {
+            @Override
+            public Iterator<Group> perform() throws RepositoryException {
+                Iterator<Group> groups = groupDelegate.declaredMemberOf();
+                return Iterators.transform(groups, new Function<Group, Group>() {
+                    @Nullable
+                    @Override
+                    public Group apply(@Nullable Group group) {
+                        return new GroupDelegator(sessionDelegate, group);
+                    }
+                });
+            }
+        });
+    }
+
+    @Override
+    public Iterator<Group> memberOf() throws RepositoryException {
+        return sessionDelegate.perform(new SessionOperation<Iterator<Group>>() {
+            @Override
+            public Iterator<Group> perform() throws RepositoryException {
+                Iterator<Group> groups = groupDelegate.memberOf();
+                return Iterators.transform(groups, new Function<Group, Group>() {
+                    @Nullable
+                    @Override
+                    public Group apply(@Nullable Group group) {
+                        return new GroupDelegator(sessionDelegate, group);
+                    }
+                });
+            }
+        });
+    }
+
+    @Override
+    public void remove() throws RepositoryException {
+        sessionDelegate.perform(new SessionOperation<Void>() {
+            @Override
+            public Void perform() throws RepositoryException {
+                groupDelegate.remove();
+                return null;
+            }
+        });
+    }
+
+    @Override
+    public Iterator<String> getPropertyNames() throws RepositoryException {
+        return sessionDelegate.perform(new SessionOperation<Iterator<String>>() {
+            @Override
+            public Iterator<String> perform() throws RepositoryException {
+                return groupDelegate.getPropertyNames();
+            }
+        });
+    }
+
+    @Override
+    public Iterator<String> getPropertyNames(final String relPath) throws RepositoryException {
+        return sessionDelegate.perform(new SessionOperation<Iterator<String>>() {
+            @Override
+            public Iterator<String> perform() throws RepositoryException {
+                return groupDelegate.getPropertyNames(relPath);
+            }
+        });
+    }
+
+    @Override
+    public boolean hasProperty(final String relPath) throws RepositoryException {
+        return sessionDelegate.perform(new SessionOperation<Boolean>() {
+            @Override
+            public Boolean perform() throws RepositoryException {
+                return groupDelegate.hasProperty(relPath);
+            }
+        });
+    }
+
+    @Override
+    public void setProperty(final String relPath, final Value value) throws RepositoryException {
+        sessionDelegate.perform(new SessionOperation<Void>() {
+            @Override
+            public Void perform() throws RepositoryException {
+                groupDelegate.setProperty(relPath, value);
+                return null;
+            }
+        });
+    }
+
+    @Override
+    public void setProperty(final String relPath, final Value[] value) throws RepositoryException {
+        sessionDelegate.perform(new SessionOperation<Void>() {
+            @Override
+            public Void perform() throws RepositoryException {
+                groupDelegate.setProperty(relPath, value);
+                return null;
+            }
+        });
+    }
+
+    @Override
+    public Value[] getProperty(final String relPath) throws RepositoryException {
+        return sessionDelegate.perform(new SessionOperation<Value[]>() {
+            @Override
+            public Value[] perform() throws RepositoryException {
+                return groupDelegate.getProperty(relPath);
+            }
+        });
+    }
+
+    @Override
+    public boolean removeProperty(final String relPath) throws RepositoryException {
+        return sessionDelegate.perform(new SessionOperation<Boolean>() {
+            @Override
+            public Boolean perform() throws RepositoryException {
+                return groupDelegate.removeProperty(relPath);
+            }
+        });
+    }
+
+    @Override
+    public String getPath() throws UnsupportedRepositoryOperationException, RepositoryException {
+        return sessionDelegate.perform(new SessionOperation<String>() {
+            @Override
+            public String perform() throws RepositoryException {
+                return groupDelegate.getPath();
+            }
+        });
+    }
+}

Added: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/ImpersonationDelegator.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/ImpersonationDelegator.java?rev=1551208&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/ImpersonationDelegator.java (added)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/ImpersonationDelegator.java Mon Dec 16 13:31:58 2013
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.jackrabbit.oak.jcr.delegate;
+
+import static com.google.common.base.Preconditions.checkState;
+
+import java.security.Principal;
+
+import javax.jcr.RepositoryException;
+import javax.security.auth.Subject;
+
+import org.apache.jackrabbit.api.security.principal.PrincipalIterator;
+import org.apache.jackrabbit.api.security.user.Impersonation;
+import org.apache.jackrabbit.oak.jcr.session.operation.SessionOperation;
+
+/**
+ * This implementation of {@code Impersonation} delegates back to a
+ * delegatee wrapping each call into a {@link SessionOperation} closure.
+ *
+ * @see SessionDelegate#perform(SessionOperation)
+ */
+public class ImpersonationDelegator implements Impersonation {
+    private final SessionDelegate sessionDelegate;
+    private final Impersonation impersonationDelegate;
+
+    public ImpersonationDelegator(SessionDelegate sessionDelegate, Impersonation impersonationDelegate) {
+        checkState(!(impersonationDelegate instanceof ImpersonationDelegator));
+        this.sessionDelegate = sessionDelegate;
+        this.impersonationDelegate = impersonationDelegate;
+    }
+
+    @Override
+    public PrincipalIterator getImpersonators() throws RepositoryException {
+        return sessionDelegate.perform(new SessionOperation<PrincipalIterator>() {
+            @Override
+            public PrincipalIterator perform() throws RepositoryException {
+                return impersonationDelegate.getImpersonators();
+            }
+        });
+    }
+
+    @Override
+    public boolean grantImpersonation(final Principal principal) throws RepositoryException {
+        return sessionDelegate.perform(new SessionOperation<Boolean>() {
+            @Override
+            public Boolean perform() throws RepositoryException {
+                return impersonationDelegate.grantImpersonation(principal);
+            }
+        });
+    }
+
+    @Override
+    public boolean revokeImpersonation(final Principal principal) throws RepositoryException {
+        return sessionDelegate.perform(new SessionOperation<Boolean>() {
+            @Override
+            public Boolean perform() throws RepositoryException {
+                return impersonationDelegate.revokeImpersonation(principal);
+            }
+        });
+    }
+
+    @Override
+    public boolean allows(final Subject subject) throws RepositoryException {
+        return sessionDelegate.perform(new SessionOperation<Boolean>() {
+            @Override
+            public Boolean perform() throws RepositoryException {
+                return impersonationDelegate.allows(subject);
+            }
+        });
+    }
+}

Added: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/UserDelegator.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/UserDelegator.java?rev=1551208&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/UserDelegator.java (added)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/UserDelegator.java Mon Dec 16 13:31:58 2013
@@ -0,0 +1,301 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.jackrabbit.oak.jcr.delegate;
+
+import static com.google.common.base.Preconditions.checkState;
+
+import java.security.Principal;
+import java.util.Iterator;
+
+import javax.annotation.Nullable;
+import javax.jcr.Credentials;
+import javax.jcr.RepositoryException;
+import javax.jcr.UnsupportedRepositoryOperationException;
+import javax.jcr.Value;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Iterators;
+import org.apache.jackrabbit.api.security.user.Group;
+import org.apache.jackrabbit.api.security.user.Impersonation;
+import org.apache.jackrabbit.api.security.user.User;
+import org.apache.jackrabbit.oak.jcr.session.operation.SessionOperation;
+
+/**
+ * This implementation of {@code User} delegates back to a
+ * delegatee wrapping each call into a {@link SessionOperation} closure.
+ *
+ * @see SessionDelegate#perform(SessionOperation)
+ */
+public final class UserDelegator implements User {
+    private final SessionDelegate sessionDelegate;
+    private final User userDelegate;
+
+    public UserDelegator(SessionDelegate sessionDelegate, User userDelegate) {
+        checkState(!(userDelegate instanceof UserDelegator));
+        this.sessionDelegate = sessionDelegate;
+        this.userDelegate = userDelegate;
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        return other.equals(this.userDelegate);
+    }
+
+    @Override
+    public boolean isAdmin() {
+        return sessionDelegate.safePerform(new SessionOperation<Boolean>() {
+            @Override
+            public Boolean perform() {
+                return userDelegate.isAdmin();
+            }
+        });
+    }
+
+    @Override
+    public Credentials getCredentials() throws RepositoryException {
+        return sessionDelegate.safePerform(new SessionOperation<Credentials>() {
+            @Override
+            public Credentials perform() throws RepositoryException {
+                return userDelegate.getCredentials();
+            }
+        });
+    }
+
+    @Override
+    public Impersonation getImpersonation() throws RepositoryException {
+        return sessionDelegate.safePerform(new SessionOperation<Impersonation>() {
+            @Override
+            public Impersonation perform() throws RepositoryException {
+                Impersonation impersonation = userDelegate.getImpersonation();
+                return new ImpersonationDelegator(sessionDelegate, impersonation);
+            }
+        });
+    }
+
+    @Override
+    public void changePassword(final String password) throws RepositoryException {
+        sessionDelegate.perform(new SessionOperation<Void>() {
+            @Override
+            public Void perform() throws RepositoryException {
+                userDelegate.changePassword(password);
+                return null;
+            }
+        });
+    }
+
+    @Override
+    public void changePassword(final String password, final String oldPassword) throws RepositoryException {
+        sessionDelegate.perform(new SessionOperation<Void>() {
+            @Override
+            public Void perform() throws RepositoryException {
+                userDelegate.changePassword(password, oldPassword);
+                return null;
+            }
+        });
+    }
+
+    @Override
+    public void disable(final String reason) throws RepositoryException {
+        sessionDelegate.perform(new SessionOperation<Void>() {
+            @Override
+            public Void perform() throws RepositoryException {
+                userDelegate.disable(reason);
+                return null;
+            }
+        });
+    }
+
+    @Override
+    public boolean isDisabled() throws RepositoryException {
+        return sessionDelegate.perform(new SessionOperation<Boolean>() {
+            @Override
+            public Boolean perform() throws RepositoryException {
+                return userDelegate.isDisabled();
+            }
+        });
+    }
+
+    @Override
+    public String getDisabledReason() throws RepositoryException {
+        return sessionDelegate.perform(new SessionOperation<String>() {
+            @Override
+            public String perform() throws RepositoryException {
+                return userDelegate.getDisabledReason();
+            }
+        });
+    }
+
+    @Override
+    public String getID() throws RepositoryException {
+        return sessionDelegate.perform(new SessionOperation<String>() {
+            @Override
+            public String perform() throws RepositoryException {
+                return userDelegate.getID();
+            }
+        });
+    }
+
+    @Override
+    public boolean isGroup() {
+        return sessionDelegate.safePerform(new SessionOperation<Boolean>() {
+            @Override
+            public Boolean perform() {
+                return userDelegate.isGroup();
+            }
+        });
+    }
+
+    @Override
+    public Principal getPrincipal() throws RepositoryException {
+        return sessionDelegate.perform(new SessionOperation<Principal>() {
+            @Override
+            public Principal perform() throws RepositoryException {
+                return userDelegate.getPrincipal();
+            }
+        });
+    }
+
+    @Override
+    public Iterator<Group> declaredMemberOf() throws RepositoryException {
+        return sessionDelegate.perform(new SessionOperation<Iterator<Group>>() {
+            @Override
+            public Iterator<Group> perform() throws RepositoryException {
+                Iterator<Group> groups = userDelegate.declaredMemberOf();
+                return Iterators.transform(groups, new Function<Group, Group>() {
+                    @Nullable
+                    @Override
+                    public Group apply(@Nullable Group group) {
+                        return new GroupDelegator(sessionDelegate, group);
+                    }
+                });
+            }
+        });
+    }
+
+    @Override
+    public Iterator<Group> memberOf() throws RepositoryException {
+        return sessionDelegate.perform(new SessionOperation<Iterator<Group>>() {
+            @Override
+            public Iterator<Group> perform() throws RepositoryException {
+                Iterator<Group> groups = userDelegate.memberOf();
+                return Iterators.transform(groups, new Function<Group, Group>() {
+                    @Nullable
+                    @Override
+                    public Group apply(@Nullable Group group) {
+                        return new GroupDelegator(sessionDelegate, group);
+                    }
+                });
+            }
+        });
+    }
+
+    @Override
+    public void remove() throws RepositoryException {
+        sessionDelegate.perform(new SessionOperation<Void>() {
+            @Override
+            public Void perform() throws RepositoryException {
+                userDelegate.remove();
+                return null;
+            }
+        });
+    }
+
+    @Override
+    public Iterator<String> getPropertyNames() throws RepositoryException {
+        return sessionDelegate.perform(new SessionOperation<Iterator<String>>() {
+            @Override
+            public Iterator<String> perform() throws RepositoryException {
+                return userDelegate.getPropertyNames();
+            }
+        });
+    }
+
+    @Override
+    public Iterator<String> getPropertyNames(final String relPath) throws RepositoryException {
+        return sessionDelegate.perform(new SessionOperation<Iterator<String>>() {
+            @Override
+            public Iterator<String> perform() throws RepositoryException {
+                return userDelegate.getPropertyNames(relPath);
+            }
+        });
+    }
+
+    @Override
+    public boolean hasProperty(final String relPath) throws RepositoryException {
+        return sessionDelegate.perform(new SessionOperation<Boolean>() {
+            @Override
+            public Boolean perform() throws RepositoryException {
+                return userDelegate.hasProperty(relPath);
+            }
+        });
+    }
+
+    @Override
+    public void setProperty(final String relPath, final Value value) throws RepositoryException {
+        sessionDelegate.perform(new SessionOperation<Void>() {
+            @Override
+            public Void perform() throws RepositoryException {
+                userDelegate.setProperty(relPath, value);
+                return null;
+            }
+        });
+    }
+
+    @Override
+    public void setProperty(final String relPath, final Value[] value) throws RepositoryException {
+        sessionDelegate.perform(new SessionOperation<Void>() {
+            @Override
+            public Void perform() throws RepositoryException {
+                userDelegate.setProperty(relPath, value);
+                return null;
+            }
+        });
+    }
+
+    @Override
+    public Value[] getProperty(final String relPath) throws RepositoryException {
+        return sessionDelegate.perform(new SessionOperation<Value[]>() {
+            @Override
+            public Value[] perform() throws RepositoryException {
+                return userDelegate.getProperty(relPath);
+            }
+        });
+    }
+
+    @Override
+    public boolean removeProperty(final String relPath) throws RepositoryException {
+        return sessionDelegate.perform(new SessionOperation<Boolean>() {
+            @Override
+            public Boolean perform() throws RepositoryException {
+                return userDelegate.removeProperty(relPath);
+            }
+        });
+    }
+
+    @Override
+    public String getPath() throws UnsupportedRepositoryOperationException, RepositoryException {
+        return sessionDelegate.perform(new SessionOperation<String>() {
+            @Override
+            public String perform() throws RepositoryException {
+                return userDelegate.getPath();
+            }
+        });
+    }
+}

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/UserManagerDelegator.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/UserManagerDelegator.java?rev=1551208&r1=1551207&r2=1551208&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/UserManagerDelegator.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/UserManagerDelegator.java Mon Dec 16 13:31:58 2013
@@ -19,12 +19,17 @@
 
 package org.apache.jackrabbit.oak.jcr.delegate;
 
+import static com.google.common.base.Preconditions.checkState;
+
 import java.security.Principal;
 import java.util.Iterator;
 
+import javax.annotation.Nullable;
 import javax.jcr.RepositoryException;
 import javax.jcr.UnsupportedRepositoryOperationException;
 
+import com.google.common.base.Function;
+import com.google.common.collect.Iterators;
 import org.apache.jackrabbit.api.security.user.Authorizable;
 import org.apache.jackrabbit.api.security.user.AuthorizableExistsException;
 import org.apache.jackrabbit.api.security.user.Group;
@@ -40,12 +45,13 @@ import org.apache.jackrabbit.oak.jcr.ses
  * @see SessionDelegate#perform(org.apache.jackrabbit.oak.jcr.session.operation.SessionOperation)
  */
 public class UserManagerDelegator implements UserManager {
-    private final UserManager userManagerDelegate;
     private final SessionDelegate sessionDelegate;
+    private final UserManager userManagerDelegate;
 
     public UserManagerDelegator(final SessionDelegate sessionDelegate, UserManager userManagerDelegate) {
-        this.userManagerDelegate = userManagerDelegate;
+        checkState(!(userManagerDelegate instanceof UserManagerDelegator));
         this.sessionDelegate = sessionDelegate;
+        this.userManagerDelegate = userManagerDelegate;
     }
 
     @Override
@@ -53,7 +59,8 @@ public class UserManagerDelegator implem
         return sessionDelegate.perform(new UserManagerOperation<Authorizable>(sessionDelegate) {
             @Override
             public Authorizable perform() throws RepositoryException {
-                return userManagerDelegate.getAuthorizable(id);
+                Authorizable authorizable = userManagerDelegate.getAuthorizable(id);
+                return AuthorizableDelegator.wrap(sessionDelegate, authorizable);
             }
         });
     }
@@ -63,7 +70,8 @@ public class UserManagerDelegator implem
         return sessionDelegate.perform(new UserManagerOperation<Authorizable>(sessionDelegate) {
             @Override
             public Authorizable perform() throws RepositoryException {
-                return userManagerDelegate.getAuthorizable(principal);
+                Authorizable authorizable = userManagerDelegate.getAuthorizable(principal);
+                return AuthorizableDelegator.wrap(sessionDelegate, authorizable);
             }
         });
     }
@@ -73,7 +81,8 @@ public class UserManagerDelegator implem
         return sessionDelegate.perform(new UserManagerOperation<Authorizable>(sessionDelegate) {
             @Override
             public Authorizable perform() throws RepositoryException {
-                return userManagerDelegate.getAuthorizableByPath(path);
+                Authorizable authorizable = userManagerDelegate.getAuthorizableByPath(path);
+                return AuthorizableDelegator.wrap(sessionDelegate, authorizable);
             }
         });
     }
@@ -83,7 +92,14 @@ public class UserManagerDelegator implem
         return sessionDelegate.perform(new UserManagerOperation<Iterator<Authorizable>>(sessionDelegate) {
             @Override
             public Iterator<Authorizable> perform() throws RepositoryException {
-                return userManagerDelegate.findAuthorizables(relPath, value);
+                Iterator<Authorizable> authorizables = userManagerDelegate.findAuthorizables(relPath, value);
+                return Iterators.transform(authorizables, new Function<Authorizable, Authorizable>() {
+                    @Nullable
+                    @Override
+                    public Authorizable apply(Authorizable authorizable) {
+                        return AuthorizableDelegator.wrap(sessionDelegate, authorizable);
+                    }
+                });
             }
         });
     }
@@ -93,7 +109,14 @@ public class UserManagerDelegator implem
         return sessionDelegate.perform(new UserManagerOperation<Iterator<Authorizable>>(sessionDelegate) {
             @Override
             public Iterator<Authorizable> perform() throws RepositoryException {
-                return userManagerDelegate.findAuthorizables(relPath, value, searchType);
+                Iterator<Authorizable> authorizables = userManagerDelegate.findAuthorizables(relPath, value, searchType);
+                return Iterators.transform(authorizables, new Function<Authorizable, Authorizable>() {
+                    @Nullable
+                    @Override
+                    public Authorizable apply(Authorizable authorizable) {
+                        return AuthorizableDelegator.wrap(sessionDelegate, authorizable);
+                    }
+                });
             }
         });
     }
@@ -103,7 +126,14 @@ public class UserManagerDelegator implem
         return sessionDelegate.perform(new UserManagerOperation<Iterator<Authorizable>>(sessionDelegate) {
             @Override
             public Iterator<Authorizable> perform() throws RepositoryException {
-                return userManagerDelegate.findAuthorizables(query);
+                Iterator<Authorizable> authorizables = userManagerDelegate.findAuthorizables(query);
+                return Iterators.transform(authorizables, new Function<Authorizable, Authorizable>() {
+                    @Nullable
+                    @Override
+                    public Authorizable apply(Authorizable authorizable) {
+                        return AuthorizableDelegator.wrap(sessionDelegate, authorizable);
+                    }
+                });
             }
         });
     }
@@ -113,7 +143,8 @@ public class UserManagerDelegator implem
         return sessionDelegate.perform(new UserManagerOperation<User>(sessionDelegate) {
             @Override
             public User perform() throws RepositoryException {
-                return userManagerDelegate.createUser(userID, password);
+                User user = userManagerDelegate.createUser(userID, password);
+                return new UserDelegator(sessionDelegate, user);
             }
         });
     }
@@ -123,7 +154,8 @@ public class UserManagerDelegator implem
         return sessionDelegate.perform(new UserManagerOperation<User>(sessionDelegate) {
             @Override
             public User perform() throws RepositoryException {
-                return userManagerDelegate.createUser(userID, password, principal, intermediatePath);
+                User user = userManagerDelegate.createUser(userID, password, principal, intermediatePath);
+                return new UserDelegator(sessionDelegate, user);
             }
         });
     }
@@ -133,7 +165,8 @@ public class UserManagerDelegator implem
         return sessionDelegate.perform(new UserManagerOperation<Group>(sessionDelegate) {
             @Override
             public Group perform() throws RepositoryException {
-                return userManagerDelegate.createGroup(groupID);
+                Group group = userManagerDelegate.createGroup(groupID);
+                return new GroupDelegator(sessionDelegate, group);
             }
         });
     }
@@ -143,7 +176,8 @@ public class UserManagerDelegator implem
         return sessionDelegate.perform(new UserManagerOperation<Group>(sessionDelegate) {
             @Override
             public Group perform() throws RepositoryException {
-                return userManagerDelegate.createGroup(principal);
+                Group group = userManagerDelegate.createGroup(principal);
+                return new GroupDelegator(sessionDelegate, group);
             }
         });
     }
@@ -153,7 +187,8 @@ public class UserManagerDelegator implem
         return sessionDelegate.perform(new UserManagerOperation<Group>(sessionDelegate) {
             @Override
             public Group perform() throws RepositoryException {
-                return userManagerDelegate.createGroup(principal, intermediatePath);
+                Group group = userManagerDelegate.createGroup(principal, intermediatePath);
+                return new GroupDelegator(sessionDelegate, group);
             }
         });
     }
@@ -163,7 +198,8 @@ public class UserManagerDelegator implem
         return sessionDelegate.perform(new UserManagerOperation<Group>(sessionDelegate) {
             @Override
             public Group perform() throws RepositoryException {
-                return userManagerDelegate.createGroup(groupID, principal, intermediatePath);
+                Group group = userManagerDelegate.createGroup(groupID, principal, intermediatePath);
+                return new GroupDelegator(sessionDelegate, group);
             }
         });
     }