protected String getOrGeneratePrincipalName()

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;
    }