@Override
  public <T extends CredentialStore<?>> T getStoreForCredentialOperation(
      IdentityContext context, Class<?> credentialClass) {
    T store = null;

    IdentityConfiguration identityConfiguration = null;

    if (this.partitionManagementConfig != null) {
      identityConfiguration = getConfigurationForPartition(context.getPartition());
    } else {
      for (IdentityConfiguration configuration : this.configurations) {
        for (IdentityStoreConfiguration storeConfig : configuration.getStoreConfiguration()) {
          if (storeConfig.supportsCredential()) {
            identityConfiguration = configuration;
          }
        }
      }
    }

    if (identityConfiguration != null && identityConfiguration.supportsCredential()) {
      for (IdentityStoreConfiguration storeConfig : identityConfiguration.getStoreConfiguration()) {
        if (storeConfig.supportsCredential()) {
          for (@SuppressWarnings("rawtypes")
          Class<? extends CredentialHandler> handlerClass : storeConfig.getCredentialHandlers()) {
            if (handlerClass.isAnnotationPresent(SupportsCredentials.class)) {
              for (Class<?> cls :
                  handlerClass.getAnnotation(SupportsCredentials.class).credentialClass()) {
                if (cls.isAssignableFrom(credentialClass)) {
                  IdentityStore<?> identityStore = null;
                  try {
                    store =
                        getIdentityStoreAndInitializeContext(
                            context, identityConfiguration, storeConfig);
                  } catch (ClassCastException cce) {
                    throw MESSAGES.storeUnexpectedType(
                        identityStore.getClass(), CredentialStore.class);
                  }

                  // if we found a specific handler for the credential, immediately return.
                  if (cls.equals(credentialClass)) {
                    return store;
                  }
                }
              }
            }
          }
        }
      }
    }

    if (store == null) {
      throw MESSAGES.credentialNoStoreForCredentials(credentialClass);
    }

    return store;
  }