Authorizable a = userManager.getAuthorizable(groupId);
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(); ) {
Authorizable dm = declMembers.next();
toRemove.put(dm.getID(), dm);
}
List<Authorizable> toAdd = new ArrayList<Authorizable>();
List<Membership.Member> nonExisting = new ArrayList<Membership.Member>();
for (Membership.Member memberEntry : members) {
String remapped = referenceTracker.get(memberEntry.contentId);
String memberContentId = (remapped == null) ? memberEntry.contentId : remapped;
Authorizable member = null;
try {
Tree n = getIdentifierManager().getTree(memberContentId);
member = userManager.getAuthorizable(n);
} catch (RepositoryException e) {
// no such node or failed to retrieve authorizable
// warning is logged below.
}
if (member != null) {
if (toRemove.remove(member.getID()) == null) {
toAdd.add(member);
} // else: no need to remove from rep:members
} else {
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);
}
}
}
// 2. adjust members of the group
for (Authorizable m : toRemove.values()) {
if (!gr.removeMember(m)) {
handleFailure("Failed remove existing member (" + m + ") from " + gr);
}
}
for (Authorizable m : toAdd) {
if (!gr.addMember(m)) {
handleFailure("Failed add member (" + m + ") to " + gr);
}
}
// handling non-existing members in case of best-effort
if (!nonExisting.isEmpty()) {
log.info("ImportBehavior.BESTEFFORT: Found " + nonExisting.size() + " entries of rep:members pointing to non-existing authorizables. Adding to rep:members.");
Tree groupTree = root.getTree(gr.getPath());
MembershipProvider membershipProvider = userManager.getMembershipProvider();
for (Membership.Member member : nonExisting) {
membershipProvider.addMember(groupTree, member.name, member.contentId);
}