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