package org.molgenis.data;
import org.molgenis.data.meta.model.EntityTypeMetadata;
import org.molgenis.data.transaction.UnknownRepositoryCollectionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
import static java.util.Comparator.naturalOrder;
import static java.util.stream.Collectors.toList;
/**
* Discovers and registers {@link RepositoryCollection} beans with the {@link RepositoryCollectionRegistry}
*/
@Component
public class RepositoryCollectionBootstrapper
{
private final RepositoryCollectionRegistry repoCollectionRegistry;
private EntityTypeMetadata entityTypeMetadata;
@Autowired
public RepositoryCollectionBootstrapper(RepositoryCollectionRegistry repoCollectionRegistry, EntityTypeMetadata entityTypeMetadata)
{
this.repoCollectionRegistry = repoCollectionRegistry;
this.entityTypeMetadata = entityTypeMetadata;
}
public void bootstrap(ContextRefreshedEvent event, String defaultRepoCollectionName)
{
// register repository collections
ApplicationContext ctx = event.getApplicationContext();
Map<String, RepositoryCollection> repoCollectionMap = ctx.getBeansOfType(RepositoryCollection.class);
repoCollectionMap.values().forEach(this::register);
// set EntityTypeMetadata backend enum options
List<String> repoNames = repoCollectionMap.values().stream().map(RepositoryCollection::getName).collect(toList());
repoNames.sort(naturalOrder());
entityTypeMetadata.setBackendEnumOptions(repoNames);
// set default repository collection
RepositoryCollection defaultRepoCollection = repoCollectionMap.values().stream()
.filter(repoCollection -> repoCollection.getName().equals(defaultRepoCollectionName)).findFirst()
.orElse(null);
if (defaultRepoCollection == null)
{
throw new UnknownRepositoryCollectionException(defaultRepoCollectionName);
}
repoCollectionRegistry.setDefaultRepoCollection(defaultRepoCollection);
entityTypeMetadata.setDefaultBackend(defaultRepoCollection.getName());
}
private void register(RepositoryCollection repositoryCollection)
{
repoCollectionRegistry.addRepositoryCollection(repositoryCollection);
}
}