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 tr...@apache.org on 2013/11/23 07:20:22 UTC

svn commit: r1544743 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/ oak-core/src/main/java/org/apache/jackrabbit/oak/spi/xml/ oak-jcr/ oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/user/ oak-j...

Author: tripod
Date: Sat Nov 23 06:20:21 2013
New Revision: 1544743

URL: http://svn.apache.org/r1544743
Log:
OAK-482 Group members stored in a rep:members tree

- improve user importer to handle new oak member node structure
- add tests to check the import of the new oak member node structure

Added:
    jackrabbit/oak/trunk/oak-jcr/src/test/resources/org/apache/jackrabbit/oak/jcr/security/
    jackrabbit/oak/trunk/oak-jcr/src/test/resources/org/apache/jackrabbit/oak/jcr/security/user/
    jackrabbit/oak/trunk/oak-jcr/src/test/resources/org/apache/jackrabbit/oak/jcr/security/user/GroupImportTest-testImportGroupMembersFromNodes.xml
    jackrabbit/oak/trunk/oak-jcr/src/test/resources/org/apache/jackrabbit/oak/jcr/security/user/GroupImportTest-testImportGroupMembersFromOakNodes.xml
Removed:
    jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/user/MemberNodeImportTest.java
Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserImporter.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/xml/PropInfo.java
    jackrabbit/oak/trunk/oak-jcr/pom.xml
    jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/user/AbstractImportTest.java
    jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/user/GroupImportTest.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserImporter.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserImporter.java?rev=1544743&r1=1544742&r2=1544743&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserImporter.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserImporter.java Sat Nov 23 06:20:21 2013
@@ -21,10 +21,11 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.TreeSet;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.jcr.ImportUUIDBehavior;
@@ -139,6 +140,13 @@ class UserImporter implements ProtectedP
     private Membership currentMembership;
 
     /**
+     * map holding the processed memberships. this is needed as both, the property and the node importer, can provide
+     * memberships during processing. if both would be handled only via the reference tracker {@link Membership#process()}
+     * would remove the members from the property importer.
+     */
+    private Map<String, Membership> memberships = new HashMap<String, Membership>();
+
+    /**
      * Temporary store for the pw an imported new user to be able to call
      * the creation actions irrespective of the order of protected properties
      */
@@ -204,6 +212,7 @@ class UserImporter implements ProtectedP
         userManager = new UserManagerImpl(root, namePathMapper, securityProvider);
         return true;
     }
+
     // -----------------------------------------< ProtectedPropertyImporter >---
     @Override
     public boolean handlePropInfo(Tree parent, PropInfo propInfo, PropertyDefinition def) throws RepositoryException {
@@ -320,9 +329,7 @@ class UserImporter implements ProtectedP
             // since group-members are references to user/groups that potentially
             // are to be imported later on -> postpone processing to the end.
             // see -> process References
-            Membership membership = new Membership(a.getID());
-            membership.addMembers(propInfo.getTextValues());
-            referenceTracker.processedReference(membership);
+            getMembership(a.getID()).addMembers(propInfo.getTextValues());
             return true;
 
         } // else: cannot handle -> return false
@@ -334,6 +341,12 @@ class UserImporter implements ProtectedP
     public void processReferences() throws RepositoryException {
         checkInitialized();
 
+        // add all collected memberships to the reference tracker.
+        for (Membership m: memberships.values()) {
+            referenceTracker.processedReference(m);
+        }
+        memberships.clear();
+
         List<Object> processed = new ArrayList<Object>();
         for (Iterator<Object> it = referenceTracker.getProcessedReferences(); it.hasNext(); ) {
             Object reference = it.next();
@@ -363,10 +376,19 @@ class UserImporter implements ProtectedP
                 log.debug("Cannot handle protected node " + protectedParent + ". It nor one of its parents represent a valid Authorizable.");
                 return false;
             } else {
-                currentMembership = new Membership(auth.getID());
+                currentMembership = getMembership(auth.getID());
+                return true;
+            }
+        } else if (isMemberReferencesListNode(protectedParent)) {
+            Authorizable auth = userManager.getAuthorizable(protectedParent.getParent());
+            if (auth == null) {
+                log.debug("Cannot handle protected node " + protectedParent + ". It nor one of its parents represent a valid Authorizable.");
+                return false;
+            } else {
+                currentMembership = getMembership(auth.getID());
                 return true;
             }
-        } // else: parent node is not of type rep:Members
+        } // else: parent node is not of type rep:Members or rep:MemberReferencesList
 
         return false;
     }
@@ -375,15 +397,23 @@ class UserImporter implements ProtectedP
     public void startChildInfo(NodeInfo childInfo, List<PropInfo> propInfos) throws RepositoryException {
         checkNotNull(currentMembership);
 
-        if (NT_REP_MEMBERS.equals(childInfo.getPrimaryTypeName())) {
+        String ntName = childInfo.getPrimaryTypeName();
+        //noinspection deprecation
+        if (NT_REP_MEMBERS.equals(ntName)) {
             for (PropInfo prop : propInfos) {
                 for (TextValue tv : prop.getTextValues()) {
-                    String name = namePathMapper.getJcrName(prop.getName());
-                    currentMembership.addMember(name, tv.getString());
+                    currentMembership.addMember(tv.getString());
+                }
+            }
+        } else if (NT_REP_MEMBER_REFERENCES.equals(ntName)) {
+            for (PropInfo prop : propInfos) {
+                if (REP_MEMBERS.equals(prop.getName())) {
+                    currentMembership.addMembers(prop.getTextValues());
                 }
             }
         } else {
-            log.warn("{} is not of type {}", childInfo.getName(), NT_REP_MEMBERS);
+            //noinspection deprecation
+            log.warn("{} is not of type " + NT_REP_MEMBERS + " or " + NT_REP_MEMBER_REFERENCES, childInfo.getName());
         }
     }
 
@@ -394,7 +424,6 @@ class UserImporter implements ProtectedP
 
     @Override
     public void end(Tree protectedParent) throws RepositoryException {
-        referenceTracker.processedReference(currentMembership);
         currentMembership = null;
     }
 
@@ -412,6 +441,16 @@ class UserImporter implements ProtectedP
         return userManager.getPrincipalManager();
     }
 
+    @Nonnull
+    private Membership getMembership(@Nonnull String authId) {
+        Membership membership = memberships.get(authId);
+        if (membership == null) {
+            membership = new Membership(authId);
+            memberships.put(authId, membership);
+        }
+        return membership;
+    }
+
     private void checkInitialized() {
         if (!initialized) {
             throw new IllegalStateException("Not initialized");
@@ -424,11 +463,12 @@ class UserImporter implements ProtectedP
     }
 
     private static boolean isMemberNode(@Nullable Tree tree) {
-        if (tree == null) {
-            return false;
-        } else {
-            return NT_REP_MEMBERS.equals(TreeUtil.getPrimaryTypeName(tree));
-        }
+        //noinspection deprecation
+        return tree != null && NT_REP_MEMBERS.equals(TreeUtil.getPrimaryTypeName(tree));
+    }
+
+    private static boolean isMemberReferencesListNode(@Nullable Tree tree) {
+        return tree != null && NT_REP_MEMBER_REFERENCES_LIST.equals(TreeUtil.getPrimaryTypeName(tree));
     }
 
     /**
@@ -466,19 +506,19 @@ class UserImporter implements ProtectedP
     private final class Membership {
 
         private final String groupId;
-        private final List<Member> members = new LinkedList<Member>();
+        private final Set<String> members = new TreeSet<String>();
 
         Membership(String groupId) {
             this.groupId = groupId;
         }
 
-        void addMember(String name, String id) {
-            members.add(new Member(name, id));
+        void addMember(String id) {
+            members.add(id);
         }
 
         void addMembers(List<? extends TextValue> tvs) {
             for (TextValue tv : tvs) {
-                addMember(null, tv.getString());
+                addMember(tv.getString());
             }
         }
 
@@ -487,8 +527,8 @@ class UserImporter implements ProtectedP
             if (a == null || !a.isGroup()) {
                 throw new RepositoryException(groupId + " does not represent a valid group.");
             }
-
             Group gr = (Group) a;
+
             // 1. collect members to add and to remove.
             Map<String, Authorizable> toRemove = new HashMap<String, Authorizable>();
             for (Iterator<Authorizable> declMembers = gr.getDeclaredMembers(); declMembers.hasNext(); ) {
@@ -497,11 +537,11 @@ class UserImporter implements ProtectedP
             }
 
             List<Authorizable> toAdd = new ArrayList<Authorizable>();
-            List<Membership.Member> nonExisting = new ArrayList<Membership.Member>();
+            Set<String> nonExisting = new HashSet<String>();
 
-            for (Membership.Member memberEntry : members) {
-                String remapped = referenceTracker.get(memberEntry.contentId);
-                String memberContentId = (remapped == null) ? memberEntry.contentId : remapped;
+            for (String contentId : members) {
+                String remapped = referenceTracker.get(contentId);
+                String memberContentId = (remapped == null) ? contentId : remapped;
 
                 Authorizable member = null;
                 try {
@@ -519,7 +559,7 @@ class UserImporter implements ProtectedP
                     handleFailure("New member of " + gr + ": No such authorizable (NodeID = " + memberContentId + ')');
                     if (importBehavior == ImportBehavior.BESTEFFORT) {
                         log.info("ImportBehavior.BESTEFFORT: Remember non-existing member for processing.");
-                        nonExisting.add(memberEntry);
+                        nonExisting.add(contentId);
                     }
                 }
             }
@@ -542,23 +582,12 @@ class UserImporter implements ProtectedP
                 Tree groupTree = root.getTree(gr.getPath());
 
                 MembershipProvider membershipProvider = userManager.getMembershipProvider();
-                for (Membership.Member member : nonExisting) {
+                for (String member : nonExisting) {
                     // TODO: check. was: membershipProvider.addMember(groupTree, member.name, member.contentId);
-                    membershipProvider.addMember(groupTree, member.contentId);
+                    membershipProvider.addMember(groupTree, member);
                 }
             }
         }
-
-        private class Member {
-            private final String name;
-            private final String contentId;
-
-            public Member(String name, String contentId) {
-                super();
-                this.name = name;
-                this.contentId = contentId;
-            }
-        }
     }
 
     /**
@@ -591,8 +620,8 @@ class UserImporter implements ProtectedP
             // 1. collect principals to add and to remove.
             Map<String, Principal> toRemove = new HashMap<String, Principal>();
             for (PrincipalIterator pit = imp.getImpersonators(); pit.hasNext(); ) {
-                Principal princ = pit.nextPrincipal();
-                toRemove.put(princ.getName(), princ);
+                Principal p = pit.nextPrincipal();
+                toRemove.put(p.getName(), p);
             }
 
             List<String> toAdd = new ArrayList<String>();
@@ -604,9 +633,9 @@ class UserImporter implements ProtectedP
             }
 
             // 2. adjust set of impersonators
-            for (Principal princicpal : toRemove.values()) {
-                if (!imp.revokeImpersonation(princicpal)) {
-                    String principalName = princicpal.getName();
+            for (Principal p : toRemove.values()) {
+                if (!imp.revokeImpersonation(p)) {
+                    String principalName = p.getName();
                     handleFailure("Failed to revoke impersonation for " + principalName + " on " + a);
                 }
             }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/xml/PropInfo.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/xml/PropInfo.java?rev=1544743&r1=1544742&r2=1544743&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/xml/PropInfo.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/xml/PropInfo.java Sat Nov 23 06:20:21 2013
@@ -18,6 +18,8 @@ package org.apache.jackrabbit.oak.spi.xm
 
 import java.util.Collections;
 import java.util.List;
+
+import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.jcr.PropertyType;
@@ -121,6 +123,7 @@ public class PropInfo {
         }
     }
 
+    @CheckForNull
     public String getName() {
         return name;
     }
@@ -129,6 +132,7 @@ public class PropInfo {
         return type;
     }
 
+    @Nonnull
     public TextValue getTextValue() throws RepositoryException {
         if (multipleStatus == MultipleStatus.MULTIPLE) {
             throw new RepositoryException("TODO");
@@ -136,10 +140,12 @@ public class PropInfo {
         return values.get(0);
     }
 
+    @Nonnull
     public List<? extends TextValue> getTextValues() {
         return values;
     }
 
+    @Nonnull
     public Value getValue(int targetType) throws RepositoryException {
         if (multipleStatus == MultipleStatus.MULTIPLE) {
             throw new RepositoryException("TODO");
@@ -147,6 +153,7 @@ public class PropInfo {
         return values.get(0).getValue(targetType);
     }
 
+    @Nonnull
     public List<Value> getValues(int targetType) throws RepositoryException {
         if (values.isEmpty()) {
             return Collections.emptyList();

Modified: jackrabbit/oak/trunk/oak-jcr/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/pom.xml?rev=1544743&r1=1544742&r2=1544743&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/pom.xml (original)
+++ jackrabbit/oak/trunk/oak-jcr/pom.xml Sat Nov 23 06:20:21 2013
@@ -114,7 +114,6 @@
       org.apache.jackrabbit.oak.jcr.security.authorization.CopyTest#testCopyInvisibleAcContent       <!-- OAK-920 -->
 
       <!-- User Management -->
-      org.apache.jackrabbit.oak.jcr.security.user.MemberNodeImportTest                               <!-- OAK-414, OAK-482 -->
       org.apache.jackrabbit.oak.jcr.security.user.RefreshTest#testAuthorizableGetProperty            <!-- OAK-1124 -->
 
       <!-- Query -->

Modified: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/user/AbstractImportTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/user/AbstractImportTest.java?rev=1544743&r1=1544742&r2=1544743&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/user/AbstractImportTest.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/user/AbstractImportTest.java Sat Nov 23 06:20:21 2013
@@ -17,7 +17,9 @@
 package org.apache.jackrabbit.oak.jcr.security.user;
 
 import java.io.ByteArrayInputStream;
+import java.io.FileOutputStream;
 import java.io.InputStream;
+import java.lang.reflect.Method;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
@@ -46,6 +48,7 @@ import org.apache.jackrabbit.oak.spi.xml
 import org.apache.jackrabbit.test.NotExecutableException;
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Test;
 
 import static org.junit.Assert.assertFalse;
 
@@ -141,8 +144,21 @@ public abstract class AbstractImportTest
     }
 
     protected void doImport(String parentPath, String xml, int importUUIDBehavior) throws Exception {
-        InputStream in = new ByteArrayInputStream(xml.getBytes("UTF-8"));
-        adminSession.importXML(parentPath, in, importUUIDBehavior);
+        InputStream in;
+        if (xml.charAt(0) == '<') {
+            in = new ByteArrayInputStream(xml.getBytes());
+            // uncomment to dump include XMLs
+            // FileOutputStream out = new FileOutputStream(getTestXml());
+            // out.write(xml.getBytes());
+            // out.close();
+        } else {
+            in = getClass().getResourceAsStream(xml);
+        }
+        try {
+            adminSession.importXML(parentPath, in, importUUIDBehavior);
+        } finally {
+            in.close();
+        }
     }
 
     protected static void assertNotDeclaredMember(Group gr, String potentialID, Session session) throws RepositoryException {
@@ -153,4 +169,24 @@ public abstract class AbstractImportTest
             assertFalse(potentialID.equals(session.getNode(member.getPath()).getIdentifier()));
         }
     }
+
+    private String getTestXml() {
+        StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
+        for (StackTraceElement element : stackTraceElements) {
+            try {
+                Class<?> clazz = Class.forName(element.getClassName());
+                for (Method method : clazz.getMethods()){
+                    if(method.getName().equals(element.getMethodName())){
+                        if (method.getAnnotation(Test.class) != null) {
+                            return clazz.getSimpleName() + "-" + method.getName() + ".xml";
+                        }
+                    }
+
+                }
+            } catch (Exception e) {
+                //  oops do something here
+            }
+        }
+        throw new IllegalArgumentException("no import xml given.");
+    }
 }

Modified: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/user/GroupImportTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/user/GroupImportTest.java?rev=1544743&r1=1544742&r2=1544743&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/user/GroupImportTest.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/user/GroupImportTest.java Sat Nov 23 06:20:21 2013
@@ -16,17 +16,27 @@
  */
 package org.apache.jackrabbit.oak.jcr.security.user;
 
+import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Set;
+import java.util.UUID;
+
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
+import javax.jcr.PropertyType;
 import javax.jcr.RepositoryException;
+import javax.jcr.Value;
 import javax.jcr.nodetype.ConstraintViolationException;
 
+import org.apache.jackrabbit.JcrConstants;
 import org.apache.jackrabbit.api.security.user.Authorizable;
 import org.apache.jackrabbit.api.security.user.Group;
 import org.apache.jackrabbit.oak.spi.security.user.UserConstants;
+import org.apache.jackrabbit.oak.spi.xml.ImportBehavior;
+import org.apache.jackrabbit.test.NotExecutableException;
 import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;
@@ -278,63 +288,6 @@ public class GroupImportTest extends Abs
 
     @Test
     public void testImportGroupMembersFromNodes() throws Exception {
-        String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
-                "<sv:node sv:name=\"s\" xmlns:mix=\"http://www.jcp.org/jcr/mix/1.0\" xmlns:sling=\"http://sling.apache.org/jcr/sling/1.0\" xmlns:nt=\"http://www.jcp.org/jcr/nt/1.0\" xmlns:fn_old=\"http://www.w3.org/2004/10/xpath-functions\" xmlns:fn=\"http://www.w3.org/2005/xpath-functions\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns:jcr=\"http://www.jcp.org/jcr/1.0\" xmlns:sv=\"http://www.jcp.org/jcr/sv/1.0\" xmlns:rep=\"internal\">" +
-                "  <sv:property sv:name=\"jcr:primaryType\" sv:type=\"Name\"><sv:value>rep:AuthorizableFolder</sv:value></sv:property>" +
-                "  <sv:property sv:name=\"jcr:created\" sv:type=\"Date\"><sv:value>2010-08-17T18:22:20.086+02:00</sv:value></sv:property>" +
-                "  <sv:property sv:name=\"jcr:createdBy\" sv:type=\"String\"><sv:value>admin</sv:value></sv:property>" +
-                "  <sv:node sv:name=\"sh\">" +
-                "     <sv:property sv:name=\"jcr:primaryType\" sv:type=\"Name\"><sv:value>rep:AuthorizableFolder</sv:value></sv:property>" +
-                "     <sv:property sv:name=\"jcr:created\" sv:type=\"Date\"><sv:value>2010-08-17T18:22:20.086+02:00</sv:value></sv:property>" +
-                "     <sv:property sv:name=\"jcr:createdBy\" sv:type=\"String\"><sv:value>admin</sv:value></sv:property>" +
-                "     <sv:node sv:name=\"shrimps\">" +
-                "        <sv:property sv:name=\"jcr:primaryType\" sv:type=\"Name\"><sv:value>rep:Group</sv:value></sv:property>" +
-                "        <sv:property sv:name=\"jcr:uuid\" sv:type=\"String\"><sv:value>08429aec-6f09-30db-8c83-1a2a57fc760c</sv:value></sv:property>" +
-                "        <sv:property sv:name=\"jcr:created\" sv:type=\"Date\"><sv:value>2010-08-17T18:22:20.086+02:00</sv:value></sv:property>" +
-                "        <sv:property sv:name=\"jcr:createdBy\" sv:type=\"String\"><sv:value>admin</sv:value></sv:property>" +
-                "        <sv:property sv:name=\"rep:principalName\" sv:type=\"String\"><sv:value>shrimps</sv:value></sv:property>" +
-                "        <sv:node sv:name=\"rep:members\">" +
-                "           <sv:property sv:name=\"jcr:primaryType\" sv:type=\"Name\"><sv:value>rep:Members</sv:value></sv:property>" +
-                "           <sv:node sv:name=\"adi\">" +
-                "              <sv:property sv:name=\"jcr:primaryType\" sv:type=\"Name\"><sv:value>rep:Members</sv:value></sv:property>" +
-                "              <sv:node sv:name=\"adi\">" +
-                "                 <sv:property sv:name=\"jcr:primaryType\" sv:type=\"Name\"><sv:value>rep:Members</sv:value></sv:property>" +
-                "                 <sv:property sv:name=\"adi\" sv:type=\"WeakReference\"><sv:value>c46335eb-267e-3e1c-9e5b-017acb4cd799</sv:value></sv:property>" +
-                "                 <sv:property sv:name=\"admin\" sv:type=\"WeakReference\"><sv:value>21232f29-7a57-35a7-8389-4a0e4a801fc3</sv:value></sv:property>" +
-                "              </sv:node>" +
-                "              <sv:node sv:name=\"angi\">" +
-                "                 <sv:property sv:name=\"jcr:primaryType\" sv:type=\"Name\"><sv:value>rep:Members</sv:value></sv:property>" +
-                "                 <sv:property sv:name=\"angi\" sv:type=\"WeakReference\"><sv:value>a468b64f-b1df-377c-b325-20d97aaa1ad9</sv:value></sv:property>" +
-                "                 <sv:property sv:name=\"anonymous\" sv:type=\"WeakReference\"><sv:value>294de355-7d9d-30b3-92d8-a1e6aab028cf</sv:value></sv:property>" +
-                "                 <sv:property sv:name=\"cati\" sv:type=\"WeakReference\"><sv:value>f08910b6-41c8-3cb9-a648-1dddd14b132d</sv:value></sv:property>" +
-                "              </sv:node>" +
-                "           </sv:node>" +
-                "           <sv:node sv:name=\"debbi\">" +
-                "              <sv:property sv:name=\"jcr:primaryType\" sv:type=\"Name\"><sv:value>rep:Members</sv:value></sv:property>" +
-                "              <sv:node sv:name=\"debbi\">" +
-                "                  <sv:property sv:name=\"jcr:primaryType\" sv:type=\"Name\"><sv:value>rep:Members</sv:value></sv:property>" +
-                "                  <sv:property sv:name=\"debbi\" sv:type=\"WeakReference\"><sv:value>d53bedf9-ebb8-3117-a8b8-162d32b4bee2</sv:value></sv:property>" +
-                "                  <sv:property sv:name=\"eddi\" sv:type=\"WeakReference\"><sv:value>1795fa1a-3d20-3a64-996e-eaaeb520a01e</sv:value></sv:property>" +
-                "                  <sv:property sv:name=\"gabi\" sv:type=\"WeakReference\"><sv:value>a0d499c7-5105-3663-8611-a32779a57104</sv:value></sv:property>" +
-                "                  <sv:property sv:name=\"hansi\" sv:type=\"WeakReference\"><sv:value>9ea4d671-8ed1-399a-8401-59487a14d00a</sv:value></sv:property>" +
-                "              </sv:node>" +
-                "              <sv:node sv:name=\"hari\">" +
-                "                  <sv:property sv:name=\"jcr:primaryType\" sv:type=\"Name\"><sv:value>rep:Members</sv:value></sv:property>" +
-                "                  <sv:property sv:name=\"hari\" sv:type=\"WeakReference\"><sv:value>a9bcf1e4-d7b9-3a22-a297-5c812d938889</sv:value></sv:property>" +
-                "                  <sv:property sv:name=\"lisi\" sv:type=\"WeakReference\"><sv:value>dc3a8f16-70d6-3bea-a9b7-b65048a0ac40</sv:value></sv:property>" +
-                "              </sv:node>" +
-                "              <sv:node sv:name=\"luzi\">" +
-                "                  <sv:property sv:name=\"jcr:primaryType\" sv:type=\"Name\"><sv:value>rep:Members</sv:value></sv:property>" +
-                "                  <sv:property sv:name=\"luzi\" sv:type=\"WeakReference\"><sv:value>9ec299fd-3461-3f1a-9749-92a76f2516eb</sv:value></sv:property>" +
-                "                  <sv:property sv:name=\"pipi\" sv:type=\"WeakReference\"><sv:value>16d5d24f-5b09-3199-9bd4-e5f57bf11237</sv:value></sv:property>" +
-                "                  <sv:property sv:name=\"susi\" sv:type=\"WeakReference\"><sv:value>536931d8-0dec-318c-b3db-9612bdd004d4</sv:value></sv:property>" +
-                "              </sv:node>" +
-                "           </sv:node>" +
-                "        </sv:node>" +
-                "     </sv:node>" +
-                "  </sv:node>" +
-                "</sv:node>";
-
         List<String> createdUsers = new LinkedList<String>();
         Node target = getTargetNode();
         try {
@@ -351,14 +304,14 @@ public class GroupImportTest extends Abs
                 adminSession.save();
             }
 
-            doImport(getTargetPath(), xml);
+            doImport(getTargetPath(), getClass().getSimpleName() + "-testImportGroupMembersFromNodes.xml");
             if (!userMgr.isAutoSave()) {
                 adminSession.save();
             }
 
             Authorizable aShrimps = userMgr.getAuthorizable("shrimps");
-            assertNotNull(aShrimps);
-            assertTrue(aShrimps.isGroup());
+            assertNotNull("Shrimps authorizable must exist", aShrimps);
+            assertTrue("Shrimps authorizable must be a group", aShrimps.isGroup());
 
             Group gShrimps = (Group) aShrimps;
             for (String user : users) {
@@ -382,6 +335,64 @@ public class GroupImportTest extends Abs
     }
 
     /**
+     * @since OAK 1.0 : Importing new rep:MembershipReferences structure
+     */
+    @Test
+    public void testImportGroupMembersFromOakNodes() throws Exception {
+        List<String> createdUsers = new LinkedList<String>();
+        Node target = getTargetNode();
+        try {
+            for (int i=0; i<32; i++) {
+                String user = "testUser" + i;
+                if (userMgr.getAuthorizable(user) == null) {
+                    userMgr.createUser(user, user);
+                    createdUsers.add(user);
+                }
+            }
+            if (!userMgr.isAutoSave()) {
+                adminSession.save();
+            }
+
+            doImport(getTargetPath(), getClass().getSimpleName() + "-testImportGroupMembersFromOakNodes.xml");
+            if (!userMgr.isAutoSave()) {
+                adminSession.save();
+            }
+
+            Authorizable authorizable = userMgr.getAuthorizable("testGroup");
+            assertNotNull("testGroup authorizable must exist", authorizable);
+            assertTrue("testGroup authorizable must be a group", authorizable.isGroup());
+            Group testGroup = (Group) authorizable;
+            for (int i=0; i<32; i++) {
+                String user = "testUser" + i;
+                assertTrue(user + " should be member of " + testGroup, testGroup.isMember(userMgr.getAuthorizable(user)));
+            }
+
+            authorizable = userMgr.getAuthorizable("shrimps");
+            assertNotNull("shrimps authorizable must exist", authorizable);
+            assertTrue("shrimps authorizable must be a group", authorizable.isGroup());
+            testGroup = (Group) authorizable;
+            for (int i=0; i<32; i++) {
+                String user = "testUser" + i;
+                assertTrue(user + " should be member of " + testGroup, testGroup.isMember(userMgr.getAuthorizable(user)));
+            }
+
+
+        } finally {
+            adminSession.refresh(false);
+            for (String user : createdUsers) {
+                Authorizable a = userMgr.getAuthorizable(user);
+                if (a != null && !a.isGroup()) {
+                    a.remove();
+                }
+            }
+            for (NodeIterator it = target.getNodes(); it.hasNext(); ) {
+                it.nextNode().remove();
+            }
+            adminSession.save();
+        }
+    }
+
+    /**
      * @since OAK 1.0 : Importing rep:authorizableId
      */
     @Test

Added: jackrabbit/oak/trunk/oak-jcr/src/test/resources/org/apache/jackrabbit/oak/jcr/security/user/GroupImportTest-testImportGroupMembersFromNodes.xml
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/resources/org/apache/jackrabbit/oak/jcr/security/user/GroupImportTest-testImportGroupMembersFromNodes.xml?rev=1544743&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/test/resources/org/apache/jackrabbit/oak/jcr/security/user/GroupImportTest-testImportGroupMembersFromNodes.xml (added)
+++ jackrabbit/oak/trunk/oak-jcr/src/test/resources/org/apache/jackrabbit/oak/jcr/security/user/GroupImportTest-testImportGroupMembersFromNodes.xml Sat Nov 23 06:20:21 2013
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    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.
+ -->
+<sv:node sv:name="s" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:rep="internal">
+    <sv:property sv:name="jcr:primaryType" sv:type="Name">
+        <sv:value>rep:AuthorizableFolder</sv:value>
+    </sv:property>
+    <sv:property sv:name="jcr:created" sv:type="Date">
+        <sv:value>2010-08-17T18:22:20.086+02:00</sv:value>
+    </sv:property>
+    <sv:property sv:name="jcr:createdBy" sv:type="String">
+        <sv:value>admin</sv:value>
+    </sv:property>
+    <sv:node sv:name="sh">
+        <sv:property sv:name="jcr:primaryType" sv:type="Name">
+            <sv:value>rep:AuthorizableFolder</sv:value>
+        </sv:property>
+        <sv:property sv:name="jcr:created" sv:type="Date">
+            <sv:value>2010-08-17T18:22:20.086+02:00</sv:value>
+        </sv:property>
+        <sv:property sv:name="jcr:createdBy" sv:type="String">
+            <sv:value>admin</sv:value>
+        </sv:property>
+        <sv:node sv:name="shrimps">
+            <sv:property sv:name="jcr:primaryType" sv:type="Name">
+                <sv:value>rep:Group</sv:value>
+            </sv:property>
+            <sv:property sv:name="jcr:uuid" sv:type="String">
+                <sv:value>08429aec-6f09-30db-8c83-1a2a57fc760c</sv:value>
+            </sv:property>
+            <sv:property sv:name="jcr:created" sv:type="Date">
+                <sv:value>2010-08-17T18:22:20.086+02:00</sv:value>
+            </sv:property>
+            <sv:property sv:name="jcr:createdBy" sv:type="String">
+                <sv:value>admin</sv:value>
+            </sv:property>
+            <sv:property sv:name="rep:principalName" sv:type="String">
+                <sv:value>shrimps</sv:value>
+            </sv:property>
+            <sv:node sv:name="rep:members">
+                <sv:property sv:name="jcr:primaryType" sv:type="Name">
+                    <sv:value>rep:Members</sv:value>
+                </sv:property>
+                <sv:node sv:name="adi">
+                    <sv:property sv:name="jcr:primaryType" sv:type="Name">
+                        <sv:value>rep:Members</sv:value>
+                    </sv:property>
+                    <sv:node sv:name="adi">
+                        <sv:property sv:name="jcr:primaryType" sv:type="Name">
+                            <sv:value>rep:Members</sv:value>
+                        </sv:property>
+                        <sv:property sv:name="adi" sv:type="WeakReference">
+                            <sv:value>c46335eb-267e-3e1c-9e5b-017acb4cd799</sv:value>
+                        </sv:property>
+                        <sv:property sv:name="admin" sv:type="WeakReference">
+                            <sv:value>21232f29-7a57-35a7-8389-4a0e4a801fc3</sv:value>
+                        </sv:property>
+                    </sv:node>
+                    <sv:node sv:name="angi">
+                        <sv:property sv:name="jcr:primaryType" sv:type="Name">
+                            <sv:value>rep:Members</sv:value>
+                        </sv:property>
+                        <sv:property sv:name="angi" sv:type="WeakReference">
+                            <sv:value>a468b64f-b1df-377c-b325-20d97aaa1ad9</sv:value>
+                        </sv:property>
+                        <sv:property sv:name="anonymous" sv:type="WeakReference">
+                            <sv:value>294de355-7d9d-30b3-92d8-a1e6aab028cf</sv:value>
+                        </sv:property>
+                        <sv:property sv:name="cati" sv:type="WeakReference">
+                            <sv:value>f08910b6-41c8-3cb9-a648-1dddd14b132d</sv:value>
+                        </sv:property>
+                    </sv:node>
+                </sv:node>
+                <sv:node sv:name="debbi">
+                    <sv:property sv:name="jcr:primaryType" sv:type="Name">
+                        <sv:value>rep:Members</sv:value>
+                    </sv:property>
+                    <sv:node sv:name="debbi">
+                        <sv:property sv:name="jcr:primaryType" sv:type="Name">
+                            <sv:value>rep:Members</sv:value>
+                        </sv:property>
+                        <sv:property sv:name="debbi" sv:type="WeakReference">
+                            <sv:value>d53bedf9-ebb8-3117-a8b8-162d32b4bee2</sv:value>
+                        </sv:property>
+                        <sv:property sv:name="eddi" sv:type="WeakReference">
+                            <sv:value>1795fa1a-3d20-3a64-996e-eaaeb520a01e</sv:value>
+                        </sv:property>
+                        <sv:property sv:name="gabi" sv:type="WeakReference">
+                            <sv:value>a0d499c7-5105-3663-8611-a32779a57104</sv:value>
+                        </sv:property>
+                        <sv:property sv:name="hansi" sv:type="WeakReference">
+                            <sv:value>9ea4d671-8ed1-399a-8401-59487a14d00a</sv:value>
+                        </sv:property>
+                    </sv:node>
+                    <sv:node sv:name="hari">
+                        <sv:property sv:name="jcr:primaryType" sv:type="Name">
+                            <sv:value>rep:Members</sv:value>
+                        </sv:property>
+                        <sv:property sv:name="hari" sv:type="WeakReference">
+                            <sv:value>a9bcf1e4-d7b9-3a22-a297-5c812d938889</sv:value>
+                        </sv:property>
+                        <sv:property sv:name="lisi" sv:type="WeakReference">
+                            <sv:value>dc3a8f16-70d6-3bea-a9b7-b65048a0ac40</sv:value>
+                        </sv:property>
+                    </sv:node>
+                    <sv:node sv:name="luzi">
+                        <sv:property sv:name="jcr:primaryType" sv:type="Name">
+                            <sv:value>rep:Members</sv:value>
+                        </sv:property>
+                        <sv:property sv:name="luzi" sv:type="WeakReference">
+                            <sv:value>9ec299fd-3461-3f1a-9749-92a76f2516eb</sv:value>
+                        </sv:property>
+                        <sv:property sv:name="pipi" sv:type="WeakReference">
+                            <sv:value>16d5d24f-5b09-3199-9bd4-e5f57bf11237</sv:value>
+                        </sv:property>
+                        <sv:property sv:name="susi" sv:type="WeakReference">
+                            <sv:value>536931d8-0dec-318c-b3db-9612bdd004d4</sv:value>
+                        </sv:property>
+                    </sv:node>
+                </sv:node>
+            </sv:node>
+        </sv:node>
+    </sv:node>
+</sv:node>
\ No newline at end of file

Added: jackrabbit/oak/trunk/oak-jcr/src/test/resources/org/apache/jackrabbit/oak/jcr/security/user/GroupImportTest-testImportGroupMembersFromOakNodes.xml
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/resources/org/apache/jackrabbit/oak/jcr/security/user/GroupImportTest-testImportGroupMembersFromOakNodes.xml?rev=1544743&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/test/resources/org/apache/jackrabbit/oak/jcr/security/user/GroupImportTest-testImportGroupMembersFromOakNodes.xml (added)
+++ jackrabbit/oak/trunk/oak-jcr/src/test/resources/org/apache/jackrabbit/oak/jcr/security/user/GroupImportTest-testImportGroupMembersFromOakNodes.xml Sat Nov 23 06:20:21 2013
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    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.
+ -->
+<sv:node sv:name="te" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:rep="internal">
+    <sv:property sv:name="jcr:primaryType" sv:type="Name">
+        <sv:value>rep:AuthorizableFolder</sv:value>
+    </sv:property>
+    <sv:property sv:name="jcr:created" sv:type="Date">
+        <sv:value>2010-08-17T18:22:20.086+02:00</sv:value>
+    </sv:property>
+    <sv:property sv:name="jcr:createdBy" sv:type="String">
+        <sv:value>admin</sv:value>
+    </sv:property>
+    <sv:node sv:name="testGroup">
+        <sv:property sv:name="jcr:primaryType" sv:type="Name">
+            <sv:value>rep:Group</sv:value>
+        </sv:property>
+        <sv:property sv:name="jcr:uuid" sv:type="String">
+            <sv:value>9628ffae-cf05-3138-8185-2cb572d50d45</sv:value>
+        </sv:property>
+        <sv:property sv:name="rep:authorizableId" sv:type="String">
+            <sv:value>testGroup</sv:value>
+        </sv:property>
+        <sv:property sv:name="rep:members" sv:type="WeakReference" sv:multiple="true">
+            <sv:value>c500b58d-122a-3651-9c69-8b889a8a4771</sv:value>
+            <sv:value>41da76f0-fc3e-362a-a939-e634bfb6a342</sv:value>
+            <sv:value>58dd024d-49e1-31b8-ba5d-307f09f32734</sv:value>
+            <sv:value>1e4332f6-5a7a-3210-b5fb-fb92c7c60cce</sv:value>
+            <sv:value>8147e2c0-496d-3139-bd3c-270a5c38ed61</sv:value>
+            <sv:value>16de10fc-1a6e-37be-904b-98149c59be61</sv:value>
+            <sv:value>9eb9c70d-8cc7-3fd7-a4ea-cf72baccbda9</sv:value>
+            <sv:value>9a936f54-ceff-3813-9eba-fd21984efcf4</sv:value>
+            <sv:value>c0e0dc6f-d819-3002-8d63-457be98d49a9</sv:value>
+            <sv:value>0201fef7-9e1e-3591-99ec-8e59316f0ebe</sv:value>
+        </sv:property>
+        <sv:property sv:name="rep:principalName" sv:type="String">
+            <sv:value>testGroup</sv:value>
+        </sv:property>
+        <sv:node sv:name="rep:membersList">
+            <sv:property sv:name="jcr:primaryType" sv:type="Name">
+                <sv:value>rep:MemberReferencesList</sv:value>
+            </sv:property>
+            <sv:node sv:name="2">
+                <sv:property sv:name="jcr:primaryType" sv:type="Name">
+                    <sv:value>rep:MemberReferences</sv:value>
+                </sv:property>
+                <sv:property sv:name="rep:members" sv:type="WeakReference" sv:multiple="true">
+                    <sv:value>eb77c895-1f85-3773-8319-107db7724f11</sv:value>
+                    <sv:value>8849464c-b258-35fa-be8b-7a359b9cf8e3</sv:value>
+                </sv:property>
+            </sv:node>
+            <sv:node sv:name="1">
+                <sv:property sv:name="jcr:primaryType" sv:type="Name">
+                    <sv:value>rep:MemberReferences</sv:value>
+                </sv:property>
+                <sv:property sv:name="rep:members" sv:type="WeakReference" sv:multiple="true">
+                    <sv:value>3af48592-d994-3bf2-95f9-88fb28dbf8d5</sv:value>
+                    <sv:value>ad343536-960c-3174-a3d2-3cc158c73744</sv:value>
+                    <sv:value>0fe78623-affa-37c3-a3f9-590a3d7768a5</sv:value>
+                    <sv:value>e894c8df-ff21-3a11-868c-ba0ffc5d9319</sv:value>
+                    <sv:value>ad27e5aa-a85e-3029-9f67-708d4bcf98d5</sv:value>
+                    <sv:value>68998346-b32c-3a44-be30-d06900bd3960</sv:value>
+                    <sv:value>bfe23c2a-4192-3a58-a069-f7704cd175cd</sv:value>
+                    <sv:value>c35f1878-b031-3a24-afc5-9e40d9ae8bea</sv:value>
+                    <sv:value>23b1169e-f21b-3ddb-af16-7b8a9c263440</sv:value>
+                    <sv:value>c901d17b-3bac-3eed-9bbf-202248498374</sv:value>
+                </sv:property>
+            </sv:node>
+            <sv:node sv:name="0">
+                <sv:property sv:name="jcr:primaryType" sv:type="Name">
+                    <sv:value>rep:MemberReferences</sv:value>
+                </sv:property>
+                <sv:property sv:name="rep:members" sv:type="WeakReference" sv:multiple="true">
+                    <sv:value>6ec4eb9b-0c42-3a29-85e0-539358298001</sv:value>
+                    <sv:value>3c3571ab-d4c0-348e-ad03-7b97ea918c83</sv:value>
+                    <sv:value>b8bf28e6-9d56-36a0-85bb-3fbb66833d70</sv:value>
+                    <sv:value>df5c506a-e67e-3aff-b656-a8f86e546988</sv:value>
+                    <sv:value>b95d03cb-8bb4-33a9-a478-824283694f86</sv:value>
+                    <sv:value>9d4527e5-08ab-3202-96e4-e9a0e19c9668</sv:value>
+                    <sv:value>5b4845ea-74b9-34f2-b8cd-e56ff2711ec9</sv:value>
+                    <sv:value>2ddec13b-8a3f-3032-a260-dbe7a9573186</sv:value>
+                    <sv:value>37e3159c-9c7b-3469-af83-2d50c4231ccf</sv:value>
+                    <sv:value>e44b91bd-0b22-3803-ae2c-4917880d27a5</sv:value>
+                </sv:property>
+            </sv:node>
+        </sv:node>
+    </sv:node>
+
+    <sv:node sv:name="shrimps">
+        <sv:property sv:name="jcr:primaryType" sv:type="Name">
+            <sv:value>rep:Group</sv:value>
+        </sv:property>
+        <sv:property sv:name="jcr:uuid" sv:type="String">
+            <sv:value>08429aec-6f09-30db-8c83-1a2a57fc760c</sv:value>
+        </sv:property>
+        <sv:property sv:name="rep:authorizableId" sv:type="String">
+            <sv:value>shrimps</sv:value>
+        </sv:property>
+        <sv:property sv:name="rep:members" sv:type="WeakReference" sv:multiple="true">
+            <sv:value>c500b58d-122a-3651-9c69-8b889a8a4771</sv:value>
+            <sv:value>41da76f0-fc3e-362a-a939-e634bfb6a342</sv:value>
+            <sv:value>58dd024d-49e1-31b8-ba5d-307f09f32734</sv:value>
+            <sv:value>1e4332f6-5a7a-3210-b5fb-fb92c7c60cce</sv:value>
+            <sv:value>8147e2c0-496d-3139-bd3c-270a5c38ed61</sv:value>
+            <sv:value>16de10fc-1a6e-37be-904b-98149c59be61</sv:value>
+            <sv:value>9eb9c70d-8cc7-3fd7-a4ea-cf72baccbda9</sv:value>
+            <sv:value>9a936f54-ceff-3813-9eba-fd21984efcf4</sv:value>
+            <sv:value>c0e0dc6f-d819-3002-8d63-457be98d49a9</sv:value>
+            <sv:value>0201fef7-9e1e-3591-99ec-8e59316f0ebe</sv:value>
+        </sv:property>
+        <sv:property sv:name="rep:principalName" sv:type="String">
+            <sv:value>shrimps</sv:value>
+        </sv:property>
+        <sv:node sv:name="rep:membersList">
+            <sv:property sv:name="jcr:primaryType" sv:type="Name">
+                <sv:value>rep:MemberReferencesList</sv:value>
+            </sv:property>
+            <sv:node sv:name="2">
+                <sv:property sv:name="jcr:primaryType" sv:type="Name">
+                    <sv:value>rep:MemberReferences</sv:value>
+                </sv:property>
+                <sv:property sv:name="rep:members" sv:type="WeakReference" sv:multiple="true">
+                    <sv:value>eb77c895-1f85-3773-8319-107db7724f11</sv:value>
+                    <sv:value>8849464c-b258-35fa-be8b-7a359b9cf8e3</sv:value>
+                </sv:property>
+            </sv:node>
+            <sv:node sv:name="1">
+                <sv:property sv:name="jcr:primaryType" sv:type="Name">
+                    <sv:value>rep:MemberReferences</sv:value>
+                </sv:property>
+                <sv:property sv:name="rep:members" sv:type="WeakReference" sv:multiple="true">
+                    <sv:value>3af48592-d994-3bf2-95f9-88fb28dbf8d5</sv:value>
+                    <sv:value>ad343536-960c-3174-a3d2-3cc158c73744</sv:value>
+                    <sv:value>0fe78623-affa-37c3-a3f9-590a3d7768a5</sv:value>
+                    <sv:value>e894c8df-ff21-3a11-868c-ba0ffc5d9319</sv:value>
+                    <sv:value>ad27e5aa-a85e-3029-9f67-708d4bcf98d5</sv:value>
+                    <sv:value>68998346-b32c-3a44-be30-d06900bd3960</sv:value>
+                    <sv:value>bfe23c2a-4192-3a58-a069-f7704cd175cd</sv:value>
+                    <sv:value>c35f1878-b031-3a24-afc5-9e40d9ae8bea</sv:value>
+                    <sv:value>23b1169e-f21b-3ddb-af16-7b8a9c263440</sv:value>
+                    <sv:value>c901d17b-3bac-3eed-9bbf-202248498374</sv:value>
+                </sv:property>
+            </sv:node>
+            <sv:node sv:name="0">
+                <sv:property sv:name="jcr:primaryType" sv:type="Name">
+                    <sv:value>rep:MemberReferences</sv:value>
+                </sv:property>
+                <sv:property sv:name="rep:members" sv:type="WeakReference" sv:multiple="true">
+                    <sv:value>6ec4eb9b-0c42-3a29-85e0-539358298001</sv:value>
+                    <sv:value>3c3571ab-d4c0-348e-ad03-7b97ea918c83</sv:value>
+                    <sv:value>b8bf28e6-9d56-36a0-85bb-3fbb66833d70</sv:value>
+                    <sv:value>df5c506a-e67e-3aff-b656-a8f86e546988</sv:value>
+                    <sv:value>b95d03cb-8bb4-33a9-a478-824283694f86</sv:value>
+                    <sv:value>9d4527e5-08ab-3202-96e4-e9a0e19c9668</sv:value>
+                    <sv:value>5b4845ea-74b9-34f2-b8cd-e56ff2711ec9</sv:value>
+                    <sv:value>2ddec13b-8a3f-3032-a260-dbe7a9573186</sv:value>
+                    <sv:value>37e3159c-9c7b-3469-af83-2d50c4231ccf</sv:value>
+                    <sv:value>e44b91bd-0b22-3803-ae2c-4917880d27a5</sv:value>
+                </sv:property>
+            </sv:node>
+        </sv:node>
+    </sv:node>
+</sv:node>
\ No newline at end of file