private void validateChange(Library library, Library beforeChange) throws IOException {
List<ValidationError> errors = new ArrayList<>();
validateConcentrationUnits(library.getConcentration(), library.getConcentrationUnits(), errors);
validateVolumeUnits(library.getVolume(), library.getVolumeUnits(), errors);
validateBarcodeUniqueness(library, beforeChange, libraryDao::getByBarcode, errors, "library");
validateDistributionFields(library.isDistributed(), library.getDistributionDate(), library.getDistributionRecipient(), library.getBox(),
errors);
validateUnboxableFields(library.isDiscarded(), library.isDistributed(), library.getBox(), errors);
if (library.getSpikeIn() != null) {
if (library.getSpikeInDilutionFactor() == null) {
errors.add(new ValidationError("spikeInDilutionFactor", "Spike-in dilution factor must be specified"));
}
if (library.getSpikeInVolume() == null) {
errors.add(new ValidationError("spikeInVolume", "Spike-in volume must be specified"));
}
}
if (!errors.isEmpty()) {
throw new ValidationException(errors);
}
}