mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

vharseko
22.08.2017 a2d67f674f7e80dcd9ca901ea63df41ef47f4214
opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/Rest2LdapJsonConfigurator.java
@@ -12,7 +12,7 @@
 * information: "Portions copyright [year] [name of copyright owner]".
 *
 * Copyright 2016 ForgeRock AS.
 *
 * Portions Copyright 2017 Rosie Applications, Inc.
 */
package org.forgerock.opendj.rest2ldap;
@@ -306,43 +306,84 @@
    private enum NamingStrategyType { CLIENTDNNAMING, CLIENTNAMING, SERVERNAMING }
    private enum SubResourceType { COLLECTION, SINGLETON }
    private static SubResource configureSubResource(final String urlTemplate, final JsonValue config) {
    private static SubResource configureSubResource(final String urlTemplate,
                                                    final JsonValue config) {
        final String dnTemplate = config.get("dnTemplate").defaultTo("").asString();
        final Boolean isReadOnly = config.get("isReadOnly").defaultTo(false).asBoolean();
        final String resourceId = config.get("resource").required().asString();
        if (config.get("type").required().as(enumConstant(SubResourceType.class)) == SubResourceType.COLLECTION) {
            final String[] glueObjectClasses = config.get("glueObjectClasses")
                                                     .defaultTo(emptyList())
                                                     .asList(String.class)
                                                     .toArray(new String[0]);
        final SubResourceType subResourceType =
          config.get("type").required().as(enumConstant(SubResourceType.class));
            final SubResourceCollection collection = collectionOf(resourceId).urlTemplate(urlTemplate)
                                                                             .dnTemplate(dnTemplate)
                                                                             .isReadOnly(isReadOnly)
                                                                             .glueObjectClasses(glueObjectClasses);
            final JsonValue namingStrategy = config.get("namingStrategy").required();
            switch (namingStrategy.get("type").required().as(enumConstant(NamingStrategyType.class))) {
            case CLIENTDNNAMING:
                collection.useClientDnNaming(namingStrategy.get("dnAttribute").required().asString());
                break;
            case CLIENTNAMING:
                collection.useClientNaming(namingStrategy.get("dnAttribute").required().asString(),
                                           namingStrategy.get("idAttribute").required().asString());
                break;
            case SERVERNAMING:
                collection.useServerNaming(namingStrategy.get("dnAttribute").required().asString(),
                                           namingStrategy.get("idAttribute").required().asString());
                break;
            }
            return collection;
        if (subResourceType == SubResourceType.COLLECTION) {
            return configureCollectionSubResource(
                config, resourceId, urlTemplate, dnTemplate, isReadOnly);
        } else {
            return singletonOf(resourceId).urlTemplate(urlTemplate).dnTemplate(dnTemplate).isReadOnly(isReadOnly);
            return configureSingletonSubResource(
                config, resourceId, urlTemplate, dnTemplate, isReadOnly);
        }
    }
    private static SubResource configureCollectionSubResource(final JsonValue config,
                                                              final String resourceId,
                                                              final String urlTemplate,
                                                              final String dnTemplate,
                                                              final Boolean isReadOnly) {
        final String[] glueObjectClasses =
            config.get("glueObjectClasses")
                .defaultTo(emptyList())
                .asList(String.class)
                .toArray(new String[0]);
        final Boolean flattenSubtree = config.get("flattenSubtree").defaultTo(false).asBoolean();
        final String searchFilter = config.get("baseSearchFilter").asString();
        final SubResourceCollection collection =
            collectionOf(resourceId)
                .urlTemplate(urlTemplate)
                .dnTemplate(dnTemplate)
                .isReadOnly(isReadOnly)
                .glueObjectClasses(glueObjectClasses)
                .flattenSubtree(flattenSubtree)
                .baseSearchFilter(searchFilter);
        configureCollectionNamingStrategy(config, collection);
        return collection;
    }
    private static void configureCollectionNamingStrategy(final JsonValue config,
                                                          final SubResourceCollection collection) {
        final JsonValue namingStrategy = config.get("namingStrategy").required();
        final NamingStrategyType namingStrategyType =
            namingStrategy.get("type").required().as(enumConstant(NamingStrategyType.class));
        switch (namingStrategyType) {
        case CLIENTDNNAMING:
            collection.useClientDnNaming(namingStrategy.get("dnAttribute").required().asString());
            break;
        case CLIENTNAMING:
            collection.useClientNaming(namingStrategy.get("dnAttribute").required().asString(),
                                       namingStrategy.get("idAttribute").required().asString());
            break;
        case SERVERNAMING:
            collection.useServerNaming(namingStrategy.get("dnAttribute").required().asString(),
                                       namingStrategy.get("idAttribute").required().asString());
            break;
        }
    }
    private static SubResource configureSingletonSubResource(final JsonValue config,
                                                             final String resourceId,
                                                             final String urlTemplate,
                                                             final String dnTemplate,
                                                             final Boolean isReadOnly) {
        return singletonOf(resourceId)
                    .urlTemplate(urlTemplate)
                    .dnTemplate(dnTemplate)
                    .isReadOnly(isReadOnly);
    }
    private static PropertyMapper configurePropertyMapper(final JsonValue mapper, final String defaultLdapAttribute) {
        switch (mapper.get("type").required().asString()) {
        case "resourceType":