@Override
  public Repository createRepository(
      final String scheme,
      final String alias,
      final RepositoryEnvironmentConfigurations repositoryEnvironmentConfigurations) {

    if (configuredRepositories.containsAlias(alias)) {
      throw new RepositoryAlreadyExistsException(alias);
    }

    Repository repo = null;
    try {
      configurationService.startBatch();
      final ConfigGroup repositoryConfig =
          configurationFactory.newConfigGroup(REPOSITORY, alias, "");
      repositoryConfig.addConfigItem(
          configurationFactory.newConfigItem("security:groups", new ArrayList<String>()));

      if (!repositoryEnvironmentConfigurations.containsConfiguration(SCHEME)) {
        repositoryConfig.addConfigItem(configurationFactory.newConfigItem(SCHEME, scheme));
      }

      for (final RepositoryEnvironmentConfiguration configuration :
          repositoryEnvironmentConfigurations.getConfigurationList()) {
        repositoryConfig.addConfigItem(getRepositoryConfigItem(configuration));
      }

      repo = createRepository(repositoryConfig);
      return repo;
    } catch (final Exception e) {
      logger.error("Error during create repository", e);
      throw new RuntimeException(e);
    } finally {
      configurationService.endBatch();
      if (repo != null) {
        event.fire(new NewRepositoryEvent(repo));
      }
    }
  }
  @Override
  public Repository updateRepositoryConfiguration(
      final Repository repository,
      final RepositoryEnvironmentConfigurations repositoryEnvironmentConfigurations) {
    final ConfigGroup thisRepositoryConfig = findRepositoryConfig(repository.getAlias());

    if (thisRepositoryConfig != null && repositoryEnvironmentConfigurations != null) {

      try {
        configurationService.startBatch();

        for (final Map.Entry<String, Object> entry :
            repositoryEnvironmentConfigurations.getConfigurationMap().entrySet()) {

          ConfigItem configItem = thisRepositoryConfig.getConfigItem(entry.getKey());
          if (configItem == null) {
            thisRepositoryConfig.addConfigItem(
                configurationFactory.newConfigItem(entry.getKey(), entry.getValue()));
          } else {
            configItem.setValue(entry.getValue());
          }
        }

        configurationService.updateConfiguration(thisRepositoryConfig);

        final Repository updatedRepo = repositoryFactory.newRepository(thisRepositoryConfig);
        configuredRepositories.update(updatedRepo);

        return updatedRepo;
      } catch (final Exception e) {
        logger.error("Error during remove repository", e);
        throw new RuntimeException(e);
      } finally {
        configurationService.endBatch();
      }

    } else {
      throw new IllegalArgumentException("Repository " + repository.getAlias() + " not found");
    }
  }