package org.molgenis.data.validation.meta; import org.molgenis.data.AbstractRepositoryDecorator; import org.molgenis.data.Repository; import org.molgenis.data.UnknownEntityException; import org.molgenis.data.meta.model.Package; import java.util.stream.Stream; import static java.lang.String.format; import static java.util.Objects.requireNonNull; /** * Validates {@link Package packages} before adding or updating the delegated repository */ public class PackageRepositoryValidationDecorator extends AbstractRepositoryDecorator<Package> { private final Repository<Package> decoratedRepo; private final PackageValidator packageValidator; public PackageRepositoryValidationDecorator(Repository<Package> decoratedRepo, PackageValidator packageValidator) { this.decoratedRepo = requireNonNull(decoratedRepo); this.packageValidator = requireNonNull(packageValidator); } @Override public Repository<Package> delegate() { return decoratedRepo; } @Override public void add(Package package_) { packageValidator.validate(package_); decoratedRepo.add(package_); } @Override public Integer add(Stream<Package> packageStream) { return decoratedRepo.add(packageStream.filter(entityType -> { packageValidator.validate(entityType); return true; })); } @Override public void update(Package package_) { packageValidator.validate(package_); decoratedRepo.update(package_); } @Override public void update(Stream<Package> packageStream) { decoratedRepo.update(packageStream.filter(entityType -> { packageValidator.validate(entityType); return true; })); } @Override public void delete(Package package_) { packageValidator.validate(package_); super.delete(package_); } @Override public void delete(Stream<Package> packageStream) { decoratedRepo.delete(packageStream.filter(package_ -> { packageValidator.validate(package_); return true; })); } @Override public void deleteById(Object id) { Package package_ = findOneById(id); if (package_ == null) { throw new UnknownEntityException(format("Unknown package [%s]", id.toString())); } packageValidator.validate(package_); super.deleteById(id); } @Override public void deleteAll() { iterator().forEachRemaining(packageValidator::validate); super.deleteAll(); } @Override public void deleteAll(Stream<Object> ids) { super.deleteAll(ids.map(this::findOneById).filter(package_ -> { packageValidator.validate(package_); return true; }).map(Package::getName)); } }