Author: angela
Date: Tue Dec  8 10:46:54 2015
New Revision: 1718553

URL: http://svn.apache.org/viewvc?rev=1718553&view=rev
Log:
OAK-3721 : Reduce code duplication in MembershipProvider

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/MembershipProvider.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/MembershipProvider.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/MembershipProvider.java?rev=1718553&r1=1718552&r2=1718553&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/MembershipProvider.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/MembershipProvider.java
 Tue Dec  8 10:46:54 2015
@@ -158,50 +158,31 @@ class MembershipProvider extends Authori
                 true, authorizableTree, REP_MEMBERS, NT_REP_MEMBER_REFERENCES
         );
 
-        return new AbstractLazyIterator<String>() {
-
-            private final Iterator<String> references = refPaths.iterator();
-
-            private Iterator<String> parent;
-
+        return new AbstractMemberIterator(refPaths.iterator()) {
             @Override
-            protected String getNext() {
+            protected String internalGetNext() {
                 String next = null;
-                while (next == null) {
-                    if (parent != null) {
-                        // if we have a parent iterator, process it first
-                        if (parent.hasNext()) {
-                            next = parent.next();
-                        } else {
-                            parent = null;
-                        }
-                    } else if (!references.hasNext()) {
-                        // if not, check if we have more references to process 
and abort if not
-                        break;
-                    } else {
-                        // get the next rep:members property path
-                        String propPath = references.next();
-                        int index = propPath.indexOf('/' + REP_MEMBERS_LIST);
-                        if (index < 0) {
-                            index = propPath.indexOf('/' + REP_MEMBERS);
-                        }
-                        if (index > 0) {
-                            String groupPath = propPath.substring(0, index);
-                            if (processedPaths.add(groupPath)) {
-                                // we didn't see this path before, so continue
-                                next = groupPath;
-                                if (includeInherited) {
-                                    // inject a parent iterator of the 
inherited memberships is needed
-                                    Tree group = getByPath(groupPath);
-                                    if (UserUtil.isType(group, 
AuthorizableType.GROUP)) {
-                                        parent = getMembership(group, true, 
processedPaths);
-                                    }
-                                }
+                // get the next rep:members property path
+                String propPath = references.next();
+                int index = propPath.indexOf('/' + REP_MEMBERS_LIST);
+                if (index < 0) {
+                    index = propPath.indexOf('/' + REP_MEMBERS);
+                }
+                if (index > 0) {
+                    String groupPath = propPath.substring(0, index);
+                    if (processedPaths.add(groupPath)) {
+                        // we didn't see this path before, so continue
+                        next = groupPath;
+                        if (includeInherited) {
+                            // inject a parent iterator of the inherited 
memberships is needed
+                            Tree group = getByPath(groupPath);
+                            if (UserUtil.isType(group, 
AuthorizableType.GROUP)) {
+                                parent = getMembership(group, true, 
processedPaths);
                             }
-                        } else {
-                            log.debug("Not a membership reference property " + 
propPath);
                         }
                     }
+                } else {
+                    log.debug("Not a membership reference property " + 
propPath);
                 }
                 return next;
             }
@@ -234,42 +215,22 @@ class MembershipProvider extends Authori
     private Iterator<String> getMembers(@Nonnull final Tree groupTree, 
@Nonnull final AuthorizableType authorizableType,
                                         final boolean includeInherited, 
@Nonnull final Set<String> processedRefs) {
 
-        return new AbstractLazyIterator<String>() {
-
-            private MemberReferenceIterator references = new 
MemberReferenceIterator(groupTree, processedRefs);
-
-            private Iterator<String> parent;
-
+        return new AbstractMemberIterator(new 
MemberReferenceIterator(groupTree, processedRefs)) {
             @Override
-            protected String getNext() {
-                String next = null;
-                while (next == null) {
-                    // process parent iterators first
-                    if (parent != null) {
-                        if (parent.hasNext()) {
-                            next = parent.next();
-                        } else {
-                            parent = null;
-                        }
-                    } else if (!references.hasNext()) {
-                        // if there are no more values left, reset the iterator
-                        break;
-                    } else {
-                        String value = references.next();
-                        next = 
identifierManager.getPath(PropertyValues.newWeakReference(value));
-
-                        // filter by authorizable type, and/or get inherited 
members
-                        if (next != null && (includeInherited || 
authorizableType != AuthorizableType.AUTHORIZABLE)) {
-                            Tree auth = getByPath(next);
-                            AuthorizableType type = (auth == null) ? null : 
UserUtil.getType(auth);
+            protected String internalGetNext() {
+                String value = references.next();
+                String next = 
identifierManager.getPath(PropertyValues.newWeakReference(value));
+
+                // filter by authorizable type, and/or get inherited members
+                if (next != null && (includeInherited || authorizableType != 
AuthorizableType.AUTHORIZABLE)) {
+                    Tree auth = getByPath(next);
+                    AuthorizableType type = (auth == null) ? null : 
UserUtil.getType(auth);
 
-                            if (includeInherited && type == 
AuthorizableType.GROUP) {
-                                parent = getMembers(auth, authorizableType, 
true, processedRefs);
-                            }
-                            if (authorizableType != 
AuthorizableType.AUTHORIZABLE && type != authorizableType) {
-                                next = null;
-                            }
-                        }
+                    if (includeInherited && type == AuthorizableType.GROUP) {
+                        parent = getMembers(auth, authorizableType, true, 
processedRefs);
+                    }
+                    if (authorizableType != AuthorizableType.AUTHORIZABLE && 
type != authorizableType) {
+                        next = null;
                     }
                 }
                 return next;
@@ -415,4 +376,37 @@ class MembershipProvider extends Authori
             return next;
         }
     }
+
+    private abstract class AbstractMemberIterator extends 
AbstractLazyIterator<String> {
+
+        protected Iterator<String> references;
+        protected Iterator<String> parent;
+
+        AbstractMemberIterator(@Nonnull Iterator<String> references) {
+            this.references = references;
+        }
+
+        @Override
+        protected String getNext() {
+            String next = null;
+            while (next == null) {
+                // process parent iterators first
+                if (parent != null) {
+                    if (parent.hasNext()) {
+                        next = parent.next();
+                    } else {
+                        parent = null;
+                    }
+                } else if (!references.hasNext()) {
+                    // if there are no more values left, reset the iterator
+                    break;
+                } else {
+                    next = internalGetNext();
+                }
+            }
+            return next;
+        }
+
+        protected abstract String internalGetNext();
+    }
 }
\ No newline at end of file


Reply via email to