package org.molgenis.data; import org.molgenis.data.meta.model.Attribute; import org.molgenis.data.meta.model.EntityType; import java.util.Iterator; import java.util.Set; import java.util.stream.StreamSupport; import static java.util.Objects.requireNonNull; import static java.util.Spliterator.ORDERED; import static java.util.Spliterators.spliteratorUnknownSize; /** * Applies {@link Repository} decorators to all {@link RepositoryCollection} repositories. */ class RepositoryCollectionDecorator implements RepositoryCollection { private final RepositoryCollection decoratedRepositoryCollection; private final RepositoryDecoratorFactory repositoryDecoratorFactory; RepositoryCollectionDecorator(RepositoryCollection decoratedRepositoryCollection, RepositoryDecoratorFactory repositoryDecoratorFactory) { this.decoratedRepositoryCollection = requireNonNull(decoratedRepositoryCollection); this.repositoryDecoratorFactory = requireNonNull(repositoryDecoratorFactory); } @Override public Iterator<Repository<Entity>> iterator() { return StreamSupport.stream(spliteratorUnknownSize(decoratedRepositoryCollection.iterator(), ORDERED), false) .map(repositoryDecoratorFactory::createDecoratedRepository).iterator(); } @Override public String getName() { return decoratedRepositoryCollection.getName(); } @Override public Set<RepositoryCollectionCapability> getCapabilities() { return decoratedRepositoryCollection.getCapabilities(); } @Override public Repository<Entity> createRepository(EntityType entityType) { return repositoryDecoratorFactory .createDecoratedRepository(decoratedRepositoryCollection.createRepository(entityType)); } @Override public Iterable<String> getEntityNames() { return decoratedRepositoryCollection.getEntityNames(); } @Override public Repository<Entity> getRepository(String name) { Repository<Entity> repository = decoratedRepositoryCollection.getRepository(name); return repository != null ? repositoryDecoratorFactory.createDecoratedRepository(repository) : null; } @Override public Repository<Entity> getRepository(EntityType entityType) { Repository<Entity> repository = decoratedRepositoryCollection.getRepository(entityType); return repository != null ? repositoryDecoratorFactory.createDecoratedRepository(repository) : null; } @Override public boolean hasRepository(String name) { return decoratedRepositoryCollection.hasRepository(name); } @Override public boolean hasRepository(EntityType entityType) { return decoratedRepositoryCollection.hasRepository(entityType); } @Override public void deleteRepository(EntityType entityType) { decoratedRepositoryCollection.deleteRepository(entityType); } @Override public void addAttribute(EntityType entityType, Attribute attribute) { decoratedRepositoryCollection.addAttribute(entityType, attribute); } @Override public void updateAttribute(EntityType entityType, Attribute attr, Attribute updatedAttr) { decoratedRepositoryCollection.updateAttribute(entityType, attr, updatedAttr); } @Override public void deleteAttribute(EntityType entityType, Attribute attr) { decoratedRepositoryCollection.deleteAttribute(entityType, attr); } }