private void configureSupportedTypes(
      OperationContext context,
      ModelNode identityStore,
      IdentityStoreConfigurationBuilder storeConfig)
      throws OperationFailedException {
    boolean hasSupportedType = identityStore.hasDefined(SUPPORTED_TYPES.getName());

    if (hasSupportedType) {
      ModelNode featuresSetNode =
          identityStore.get(SUPPORTED_TYPES.getName()).asProperty().getValue();
      ModelNode supportsAllNode =
          SupportedTypesResourceDefinition.SUPPORTS_ALL.resolveModelAttribute(
              context, featuresSetNode);

      if (supportsAllNode.asBoolean()) {
        storeConfig.supportAllFeatures();
      }

      hasSupportedType = supportsAllNode.asBoolean();

      if (featuresSetNode.hasDefined(SUPPORTED_TYPE.getName())) {
        for (Property supportedTypeNode :
            featuresSetNode.get(SUPPORTED_TYPE.getName()).asPropertyList()) {
          ModelNode supportedType = supportedTypeNode.getValue();
          ModelNode classNameNode =
              SupportedTypeResourceDefinition.CLASS_NAME.resolveModelAttribute(
                  context, supportedType);
          ModelNode codeNode =
              SupportedTypeResourceDefinition.CODE.resolveModelAttribute(context, supportedType);
          String typeName;

          if (classNameNode.isDefined()) {
            typeName = classNameNode.asString();
          } else if (codeNode.isDefined()) {
            typeName = AttributedTypeEnum.forType(codeNode.asString());
          } else {
            throw ROOT_LOGGER.typeNotProvided(SUPPORTED_TYPE.getName());
          }

          ModelNode moduleNode =
              SupportedTypeResourceDefinition.MODULE.resolveModelAttribute(context, supportedType);
          Class<? extends AttributedType> attributedTypeClass = loadClass(moduleNode, typeName);

          if (Relationship.class.isAssignableFrom(attributedTypeClass)) {
            storeConfig.supportGlobalRelationship(
                (Class<? extends Relationship>) attributedTypeClass);
          } else {
            storeConfig.supportType(attributedTypeClass);
          }

          hasSupportedType = true;
        }
      }
    }

    if (!hasSupportedType) {
      throw ROOT_LOGGER.idmNoSupportedTypesDefined();
    }
  }
  private LDAPStoreConfigurationBuilder configureLDAPIdentityStore(
      OperationContext context,
      ModelNode ldapIdentityStore,
      NamedIdentityConfigurationBuilder builder)
      throws OperationFailedException {
    LDAPStoreConfigurationBuilder storeConfig = builder.stores().ldap();
    ModelNode url =
        LDAPStoreResourceDefinition.URL.resolveModelAttribute(context, ldapIdentityStore);
    ModelNode bindDn =
        LDAPStoreResourceDefinition.BIND_DN.resolveModelAttribute(context, ldapIdentityStore);
    ModelNode bindCredential =
        LDAPStoreResourceDefinition.BIND_CREDENTIAL.resolveModelAttribute(
            context, ldapIdentityStore);
    ModelNode baseDn =
        LDAPStoreResourceDefinition.BASE_DN_SUFFIX.resolveModelAttribute(
            context, ldapIdentityStore);

    if (url.isDefined()) {
      storeConfig.url(url.asString());
    }

    if (bindDn.isDefined()) {
      storeConfig.bindDN(bindDn.asString());
    }

    if (bindCredential.isDefined()) {
      storeConfig.bindCredential(bindCredential.asString());
    }

    if (baseDn.isDefined()) {
      storeConfig.baseDN(baseDn.asString());
    }

    if (ldapIdentityStore.hasDefined(LDAP_STORE_MAPPING.getName())) {
      for (Property mappingNode :
          ldapIdentityStore.get(LDAP_STORE_MAPPING.getName()).asPropertyList()) {
        ModelNode ldapMapping = mappingNode.getValue();
        ModelNode classNameNode =
            LDAPStoreMappingResourceDefinition.CLASS_NAME.resolveModelAttribute(
                context, ldapMapping);
        ModelNode codeNode =
            LDAPStoreMappingResourceDefinition.CODE.resolveModelAttribute(context, ldapMapping);
        ModelNode moduleNode =
            LDAPStoreMappingResourceDefinition.MODULE.resolveModelAttribute(context, ldapMapping);

        String typeName;

        if (classNameNode.isDefined()) {
          typeName = classNameNode.asString();
        } else if (codeNode.isDefined()) {
          typeName = AttributedTypeEnum.forType(codeNode.asString());
        } else {
          throw ROOT_LOGGER.typeNotProvided(LDAP_STORE_MAPPING.getName());
        }

        LDAPMappingConfigurationBuilder storeMapping =
            storeConfig.mapping(this.<AttributedType>loadClass(moduleNode, typeName));
        ModelNode relatesToNode =
            LDAPStoreMappingResourceDefinition.RELATES_TO.resolveModelAttribute(
                context, ldapMapping);

        if (relatesToNode.isDefined()) {
          String relatesTo = AttributedTypeEnum.forType(relatesToNode.asString());

          if (relatesTo == null) {
            relatesTo = relatesToNode.asString();
          }

          storeMapping.forMapping(this.<AttributedType>loadClass(moduleNode, relatesTo));
        } else {
          String baseDN =
              LDAPStoreMappingResourceDefinition.BASE_DN
                  .resolveModelAttribute(context, ldapMapping)
                  .asString();

          storeMapping.baseDN(baseDN);

          String objectClasses =
              LDAPStoreMappingResourceDefinition.OBJECT_CLASSES
                  .resolveModelAttribute(context, ldapMapping)
                  .asString();

          for (String objClass : objectClasses.split(",")) {
            if (!objClass.trim().isEmpty()) {
              storeMapping.objectClasses(objClass);
            }
          }

          ModelNode parentAttributeName =
              LDAPStoreMappingResourceDefinition.PARENT_ATTRIBUTE.resolveModelAttribute(
                  context, ldapMapping);

          if (parentAttributeName.isDefined()) {
            storeMapping.parentMembershipAttributeName(parentAttributeName.asString());
          }
        }

        if (ldapMapping.hasDefined(LDAP_STORE_ATTRIBUTE.getName())) {
          for (Property attributeNode :
              ldapMapping.get(LDAP_STORE_ATTRIBUTE.getName()).asPropertyList()) {
            ModelNode attribute = attributeNode.getValue();
            String name =
                LDAPStoreAttributeResourceDefinition.NAME
                    .resolveModelAttribute(context, attribute)
                    .asString();
            String ldapName =
                LDAPStoreAttributeResourceDefinition.LDAP_NAME
                    .resolveModelAttribute(context, attribute)
                    .asString();
            boolean readOnly =
                LDAPStoreAttributeResourceDefinition.READ_ONLY
                    .resolveModelAttribute(context, attribute)
                    .asBoolean();

            if (readOnly) {
              storeMapping.readOnlyAttribute(name, ldapName);
            } else {
              boolean isIdentifier =
                  LDAPStoreAttributeResourceDefinition.IS_IDENTIFIER
                      .resolveModelAttribute(context, attribute)
                      .asBoolean();
              storeMapping.attribute(name, ldapName, isIdentifier);
            }
          }
        }
      }
    } else {
      throw ROOT_LOGGER.idmLdapNoMappingDefined();
    }

    return storeConfig;
  }