@Override
  public void removeRepository(final String alias) {
    final ConfigGroup thisRepositoryConfig = findRepositoryConfig(alias);

    try {
      configurationService.startBatch();
      if (thisRepositoryConfig != null) {
        configurationService.removeConfiguration(thisRepositoryConfig);
      }

      final Repository repo = configuredRepositories.remove(alias);
      if (repo != null) {
        repositoryRemovedEvent.fire(new RepositoryRemovedEvent(repo));
        ioService.delete(convert(repo.getRoot()).getFileSystem().getPath(null));
      }

      // Remove reference to Repository from Organizational Units
      final Collection<OrganizationalUnit> organizationalUnits =
          organizationalUnitService.getOrganizationalUnits();
      for (OrganizationalUnit ou : organizationalUnits) {
        for (Repository repository : ou.getRepositories()) {
          if (repository.getAlias().equals(alias)) {
            organizationalUnitService.removeRepository(ou, repository);
          }
        }
      }
    } catch (final Exception e) {
      logger.error("Error during remove repository", e);
      throw new RuntimeException(e);
    } finally {
      configurationService.endBatch();
    }
  }
  @SuppressWarnings({"unchecked", "rawtypes"})
  @Override
  public void removeGroup(Repository repository, String group) {
    final ConfigGroup thisRepositoryConfig = findRepositoryConfig(repository.getAlias());

    if (thisRepositoryConfig != null) {
      final ConfigItem<List> groups =
          backward.compat(thisRepositoryConfig).getConfigItem("security:groups");
      groups.getValue().remove(group);

      configurationService.updateConfiguration(thisRepositoryConfig);

      configuredRepositories.update(repositoryFactory.newRepository(thisRepositoryConfig));
    } else {
      throw new IllegalArgumentException("Repository " + repository.getAlias() + " not found");
    }
  }
  @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");
    }
  }
  @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));
      }
    }
  }
 private Repository createRepository(final ConfigGroup repositoryConfig) {
   final Repository repository = repositoryFactory.newRepository(repositoryConfig);
   configurationService.addConfiguration(repositoryConfig);
   configuredRepositories.add(repository);
   return repository;
 }
 @Override
 public Collection<Repository> getRepositories() {
   return configuredRepositories.getAllConfiguredRepositories();
 }
 @Override
 public Repository getRepository(final Path root) {
   return configuredRepositories.getRepositoryByRootPath(root);
 }
 @Override
 public Repository getRepository(final String alias) {
   return configuredRepositories.getRepositoryByRepositoryAlias(alias);
 }