in src/main/java/org/apache/sling/jackrabbit/usermanager/impl/post/AbstractAuthorizablePostServlet.java [149:206]
protected String getOrGeneratePrincipalName(Session jcrSession, Map<String, ?> properties, AuthorizableType type) throws RepositoryException {
String principalName = null;
PrincipalNameGenerator defaultPrincipalNameGenerator = null;
PrincipalNameGenerator principalNameGenerator = null;
synchronized (principalNameGenerators) {
if (!principalNameGenerators.isEmpty()) {
defaultPrincipalNameGenerator = principalNameGenerators.getFirst().getGenerator();
principalNameGenerator = principalNameGenerators.getLast().getGenerator();
}
}
if (principalNameGenerator != null) {
NameInfo nameInfo = principalNameGenerator.getPrincipalName(properties, type,
principalNameFilter, defaultPrincipalNameGenerator);
if (nameInfo == null && defaultPrincipalNameGenerator != null) {
// fallback to the default impl
nameInfo = defaultPrincipalNameGenerator.getPrincipalName(properties, type,
principalNameFilter, defaultPrincipalNameGenerator);
}
if (nameInfo != null) {
principalName = nameInfo.getPrincipalName();
if (principalName != null && nameInfo.isMakeUnique()) {
// make sure the name is not already used
UserManager um = AccessControlUtil.getUserManager(jcrSession);
// if resulting authorizable exists, add a random suffix until it's not the case
// anymore
final int MAX_TRIES = 1000;
if (um.getAuthorizable(principalName) != null ) {
for (int i=0; i < MAX_TRIES; i++) {
final int uniqueIndex = randomCollisionIndex.nextInt(9999);
String newPrincipalName = principalName + "_" + uniqueIndex;
if (um.getAuthorizable(newPrincipalName) == null) {
// found unused value, so use it
principalName = newPrincipalName;
break;
}
}
// Give up after MAX_TRIES
if (um.getAuthorizable(principalName) != null ) {
throw new RepositoryException(
"Collision in generated principal names, generated name " + principalName + " already exists");
}
}
}
}
} else {
// fallback to the old behavior
Object obj = properties.get(SlingPostConstants.RP_NODE_NAME);
if (obj instanceof String[] && Array.getLength(obj) == 1) {
principalName = ((String[])obj)[0];
} else if (obj instanceof String) {
principalName= ((String)obj);
}
}
return principalName;
}