package org.molgenis.data.i18n; import org.molgenis.data.AbstractRepositoryDecorator; import org.molgenis.data.MolgenisDataException; import org.molgenis.data.Repository; import org.molgenis.data.i18n.model.Language; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Stream; import static java.lang.String.format; import static java.util.Objects.requireNonNull; public class LanguageRepositoryDecorator extends AbstractRepositoryDecorator<Language> { private final Repository<Language> decorated; private final LanguageService languageService; public LanguageRepositoryDecorator(Repository<Language> decorated, LanguageService languageService) { this.decorated = requireNonNull(decorated); this.languageService = requireNonNull(languageService); } @Override protected Repository<Language> delegate() { return decorated; } @Override public void delete(Language language) { throw new MolgenisDataException(format("Deleting languages is not allowed")); } @Override public void delete(Stream<Language> entities) { entities.forEach(this::delete); } @Override public void deleteById(Object id) { Language entity = findOneById(id); if (entity != null) delete(entity); } @Override public void deleteAll(Stream<Object> ids) { ids.forEach(this::deleteById); } @Override public void deleteAll() { forEachBatched(entities -> delete(entities.stream()), 1000); } @Override public void add(Language language) { if (!languageService.hasLanguageCode(language.getCode())) { throw new MolgenisDataException(format("Adding languages is not allowed")); } else { // Add language decorated.add(language); } } @Override public Integer add(Stream<Language> entities) { AtomicInteger count = new AtomicInteger(); entities.forEach(entity -> { add(entity); // FIXME inefficient, apply filter to stream count.incrementAndGet(); }); return count.get(); } }