package com.constellio.app.modules.rm.model.validators; import com.constellio.app.modules.rm.wrappers.StorageSpace; import com.constellio.model.entities.schemas.MetadataSchemaTypes; import com.constellio.model.entities.schemas.validation.RecordValidator; import com.constellio.model.services.records.RecordProvider; import com.constellio.model.services.records.RecordValidatorParams; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class StorageSpaceValidator implements RecordValidator { public static final String CHILD_CAPACITY_MUST_BE_LESSER_OR_EQUAL_TO_PARENT_CAPACITY = "childCapacityMustBeLesserOrEqualToParentCapacity"; public static final String CONTAINER_TYPE_MUST_BE_INCLUDED_IN_PARENT_STORAGE_SPACE = "containerTypeMustBeIncludedInParentStorageSpace"; public static final String CAPACITY = "capacity"; public static final String PARENT_CAPACITY = "parentCapacity"; public static final String CONTAINER_TYPE = "containerType"; public static final String PARENT_CONTAINER_TYPE = "parentContainerType"; @Override public void validate(RecordValidatorParams params) { StorageSpace storageSpace = new StorageSpace(params.getValidatedRecord(), params.getTypes()); validate(storageSpace, params); } private void validate(StorageSpace storageSpace, RecordValidatorParams params) { if(storageSpace.getParentStorageSpace() == null) { return; } Long capacity = storageSpace.getCapacity(); StorageSpace parentStorageSpace = new StorageSpace(params.getRecordProvider().getRecord(storageSpace.getParentStorageSpace()), params.getTypes()); Long parentCapacity = parentStorageSpace.getCapacity(); if(capacity != null && parentCapacity != null && capacity > parentCapacity) { Map<String, Object> parameters = new HashMap<>(); parameters.put(CAPACITY, formatToParameter(capacity)); parameters.put(PARENT_CAPACITY, formatToParameter(parentCapacity)); params.getValidationErrors().add(StorageSpaceValidator.class, CHILD_CAPACITY_MUST_BE_LESSER_OR_EQUAL_TO_PARENT_CAPACITY, parameters); } List<String> containerRecordTypeList = storageSpace.getContainerType(); if(!canContain(parentStorageSpace, containerRecordTypeList, params.getRecordProvider(), params.getTypes())) { Map<String, Object> parameters = new HashMap<>(); parameters.put(CONTAINER_TYPE, formatToParameter(containerRecordTypeList)); parameters.put(PARENT_CONTAINER_TYPE, formatToParameter(parentStorageSpace.getContainerType())); params.getValidationErrors().add(StorageSpaceValidator.class, CONTAINER_TYPE_MUST_BE_INCLUDED_IN_PARENT_STORAGE_SPACE, parameters); } } private String formatToParameter(Long parameter) { if(parameter == null) { return ""; } return parameter.toString(); } private String formatToParameter(List<String> parameter) { if(parameter == null || parameter.isEmpty()) { return ""; } return parameter.toString(); } public boolean canContain(StorageSpace storageSpace, List<String> checkedContainerRecordType, RecordProvider recordProvider, MetadataSchemaTypes types) { if(checkedContainerRecordType == null || checkedContainerRecordType.isEmpty()) { return true; } List<String> containerRecordTypeList = new ArrayList<>(); StorageSpace currentStorage = storageSpace; while (currentStorage != null) { if(currentStorage.getContainerType() != null && !currentStorage.getContainerType().isEmpty()) { containerRecordTypeList = currentStorage.getContainerType(); break; } else if(currentStorage.getParentStorageSpace() == null) { break; } currentStorage = new StorageSpace(recordProvider.getRecord(currentStorage.getParentStorageSpace()), types); } return (containerRecordTypeList == null || containerRecordTypeList.isEmpty()) ? true : containerRecordTypeList.containsAll(checkedContainerRecordType); } }