You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by md...@apache.org on 2010/12/03 11:31:56 UTC

svn commit: r1041765 - in /jackrabbit/branches/2.2: ./ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/security/user/XPathQueryEvaluator.java jackrabbit-core/src/test/java/org/apache/jackrabbit/api/security/user/UserManagerSearchTest.java

Author: mduerig
Date: Fri Dec  3 10:31:56 2010
New Revision: 1041765

URL: http://svn.apache.org/viewvc?rev=1041765&view=rev
Log:
2.2: Merged revision 1041761 (JCR-2829)

Modified:
    jackrabbit/branches/2.2/   (props changed)
    jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/security/user/XPathQueryEvaluator.java
    jackrabbit/branches/2.2/jackrabbit-core/src/test/java/org/apache/jackrabbit/api/security/user/UserManagerSearchTest.java

Propchange: jackrabbit/branches/2.2/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Fri Dec  3 10:31:56 2010
@@ -1 +1 @@
-/jackrabbit/trunk:1040661,1040958
+/jackrabbit/trunk:1040661,1040958,1041761

Modified: jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/security/user/XPathQueryEvaluator.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/security/user/XPathQueryEvaluator.java?rev=1041765&r1=1041764&r2=1041765&view=diff
==============================================================================
--- jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/security/user/XPathQueryEvaluator.java (original)
+++ jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/security/user/XPathQueryEvaluator.java Fri Dec  3 10:31:56 2010
@@ -110,11 +110,21 @@ public class XPathQueryEvaluator impleme
             query.setLimit(maxCount);
         }
 
-        if (offset > 0) {
-            query.setOffset(offset);
+        // If we are scoped to a group and have an offset, we need to skip to that offset
+        // here (inefficient!) otherwise we can apply the offset in the query
+        if (builder.getGroupName() == null) {
+            if (offset > 0) {
+                query.setOffset(offset);
+            }
+            return toAuthorizables(execute(query));
+        }
+        else {
+            Iterator<Authorizable> result = filter(toAuthorizables(execute(query)), builder.getGroupName(), builder.isDeclaredMembersOnly());
+            for (int c = 0; c < offset && result.hasNext(); c++) {
+                result.next();
+            }
+            return result;
         }
-
-        return filter(toAuthorizables(execute(query)), builder.getGroupName(), builder.isDeclaredMembersOnly());
     }
 
     //------------------------------------------< ConditionVisitor >---
@@ -300,43 +310,38 @@ public class XPathQueryEvaluator impleme
                                           boolean declaredMembersOnly) throws RepositoryException {
 
         Predicate<Authorizable> predicate;
-        if (groupName == null) {
-            predicate = Predicates.TRUE();
+        Authorizable groupAuth = userManager.getAuthorizable(groupName);
+        if (groupAuth == null || !groupAuth.isGroup()) {
+            predicate = Predicates.FALSE();
         }
         else {
-            Authorizable groupAuth = userManager.getAuthorizable(groupName);
-            if (groupAuth == null || !groupAuth.isGroup()) {
-                predicate = Predicates.FALSE();
-            }
-            else {
-                final Group group = (Group) groupAuth;
-                if (declaredMembersOnly) {
-                    predicate = new Predicate<Authorizable>() {
-                        public boolean evaluate(Authorizable authorizable) {
-                            try {
-                                return authorizable != null && group.isDeclaredMember(authorizable);
-                            } catch (RepositoryException e) {
-                                log.warn("Cannot determine whether {} is member of group {}", authorizable, group);
-                                log.debug(e.getMessage(), e);
-                                return false;
-                            }
+            final Group group = (Group) groupAuth;
+            if (declaredMembersOnly) {
+                predicate = new Predicate<Authorizable>() {
+                    public boolean evaluate(Authorizable authorizable) {
+                        try {
+                            return authorizable != null && group.isDeclaredMember(authorizable);
+                        } catch (RepositoryException e) {
+                            log.warn("Cannot determine whether {} is member of group {}", authorizable, group);
+                            log.debug(e.getMessage(), e);
+                            return false;
                         }
-                    };
+                    }
+                };
 
-                }
-                else {
-                    predicate = new Predicate<Authorizable>() {
-                        public boolean evaluate(Authorizable authorizable) {
-                            try {
-                                return authorizable != null && group.isMember(authorizable);
-                            } catch (RepositoryException e) {
-                                log.warn("Cannot determine whether {} is member of group {}", authorizable, group);
-                                log.debug(e.getMessage(), e);
-                                return false;
-                            }
+            }
+            else {
+                predicate = new Predicate<Authorizable>() {
+                    public boolean evaluate(Authorizable authorizable) {
+                        try {
+                            return authorizable != null && group.isMember(authorizable);
+                        } catch (RepositoryException e) {
+                            log.warn("Cannot determine whether {} is member of group {}", authorizable, group);
+                            log.debug(e.getMessage(), e);
+                            return false;
                         }
-                    };
-                }
+                    }
+                };
             }
         }
 

Modified: jackrabbit/branches/2.2/jackrabbit-core/src/test/java/org/apache/jackrabbit/api/security/user/UserManagerSearchTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.2/jackrabbit-core/src/test/java/org/apache/jackrabbit/api/security/user/UserManagerSearchTest.java?rev=1041765&r1=1041764&r2=1041765&view=diff
==============================================================================
--- jackrabbit/branches/2.2/jackrabbit-core/src/test/java/org/apache/jackrabbit/api/security/user/UserManagerSearchTest.java (original)
+++ jackrabbit/branches/2.2/jackrabbit-core/src/test/java/org/apache/jackrabbit/api/security/user/UserManagerSearchTest.java Fri Dec  3 10:31:56 2010
@@ -702,6 +702,30 @@ public class UserManagerSearchTest exten
         }
     }
 
+    public void testScopeWithOffset() throws RepositoryException {
+        final int offset = 5;
+        final int count = 10000;
+
+        Iterator<Authorizable> result = userMgr.findAuthorizables(new Query() {
+            public <T> void build(QueryBuilder<T> builder) {
+                builder.setScope("vertebrates", false);
+                builder.setSortOrder("profile/@weight", Direction.ASCENDING);
+                builder.setLimit(offset, count);
+            }
+        });
+
+        Iterator<Authorizable> expected = userMgr.findAuthorizables(new Query() {
+            public <T> void build(QueryBuilder<T> builder) {
+                builder.setScope("vertebrates", false);
+                builder.setSortOrder("profile/@weight", Direction.ASCENDING);
+            }
+        });
+
+        skip(expected, offset);
+        assertSame(expected, result, count);
+        assertFalse(result.hasNext());
+    }
+
     //------------------------------------------< private >---
 
     private static void addMembers(Group group, Authorizable... authorizables) throws RepositoryException {