From 145a297c35c90759cf0651f262f3f1e2da07482a Mon Sep 17 00:00:00 2001 From: David Randolph Phillips Date: Mon, 28 Oct 2024 12:39:55 -0400 Subject: [PATCH 1/3] [BI-2328] Added new TraitValidator --- .../services/validators/TraitFileValidatorError.java | 5 +++++ .../services/validators/TraitValidatorError.java | 5 +++++ .../services/validators/TraitValidatorErrorInterface.java | 1 + 3 files changed, 11 insertions(+) diff --git a/src/main/java/org/breedinginsight/services/validators/TraitFileValidatorError.java b/src/main/java/org/breedinginsight/services/validators/TraitFileValidatorError.java index 4ba0f99d7..40807cf03 100644 --- a/src/main/java/org/breedinginsight/services/validators/TraitFileValidatorError.java +++ b/src/main/java/org/breedinginsight/services/validators/TraitFileValidatorError.java @@ -65,6 +65,11 @@ public ValidationError getMissingScaleDataTypeMsg() { return new ValidationError("Scale Class", "Missing scale class", HttpStatus.UNPROCESSABLE_ENTITY); } + @Override + public ValidationError getPeriodObsVarNameMsg() { + return new ValidationError("Name", "Period is invalid", HttpStatus.UNPROCESSABLE_ENTITY); + } + @Override public ValidationError getMissingObsVarNameMsg() { return new ValidationError("Name", "Missing name", HttpStatus.UNPROCESSABLE_ENTITY); diff --git a/src/main/java/org/breedinginsight/services/validators/TraitValidatorError.java b/src/main/java/org/breedinginsight/services/validators/TraitValidatorError.java index b2db156f6..107419539 100644 --- a/src/main/java/org/breedinginsight/services/validators/TraitValidatorError.java +++ b/src/main/java/org/breedinginsight/services/validators/TraitValidatorError.java @@ -64,6 +64,11 @@ public ValidationError getMissingScaleUnitMsg() { public ValidationError getMissingScaleDataTypeMsg() { return new ValidationError("scale.dataType", "Missing scale class", HttpStatus.BAD_REQUEST); } + + @Override + public ValidationError getPeriodObsVarNameMsg() { + return new ValidationError("observationVariableName", "Period in name is invalid", HttpStatus.BAD_REQUEST); + } @Override public ValidationError getMissingObsVarNameMsg() { diff --git a/src/main/java/org/breedinginsight/services/validators/TraitValidatorErrorInterface.java b/src/main/java/org/breedinginsight/services/validators/TraitValidatorErrorInterface.java index 49ef88da5..27400e2c5 100644 --- a/src/main/java/org/breedinginsight/services/validators/TraitValidatorErrorInterface.java +++ b/src/main/java/org/breedinginsight/services/validators/TraitValidatorErrorInterface.java @@ -31,6 +31,7 @@ public interface TraitValidatorErrorInterface { ValidationError getMissingScaleUnitMsg(); ValidationError getMissingScaleDataTypeMsg(); ValidationError getMissingObsVarNameMsg(); + ValidationError getPeriodObsVarNameMsg(); ValidationError getMissingTraitEntityMsg(); ValidationError getMissingTraitAttributeMsg(); ValidationError getMissingTraitDescriptionMsg(); From 4a3f253ae91e88e896879f37de35b9c45a07b49c Mon Sep 17 00:00:00 2001 From: David Randolph Phillips Date: Mon, 28 Oct 2024 12:49:47 -0400 Subject: [PATCH 2/3] [BI-2328] call new Trait Validator from Trait Valiator Service --- .../validators/TraitValidatorService.java | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/breedinginsight/services/validators/TraitValidatorService.java b/src/main/java/org/breedinginsight/services/validators/TraitValidatorService.java index e778898bd..e6f73ffcd 100644 --- a/src/main/java/org/breedinginsight/services/validators/TraitValidatorService.java +++ b/src/main/java/org/breedinginsight/services/validators/TraitValidatorService.java @@ -26,6 +26,8 @@ import javax.inject.Inject; import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Collectors; import static org.apache.commons.lang3.StringUtils.isBlank; @@ -206,7 +208,26 @@ public ValidationErrors checkTraitFieldsLength(List traits, TraitValidato } return errors; } + public ValidationErrors checkTraitFieldsFormat(List traits, TraitValidatorErrorInterface traitValidatorErrors) { + ValidationErrors errors = new ValidationErrors(); + + for (int i = 0; i < traits.size(); i++) { + + Trait trait = traits.get(i); + String name = trait.getObservationVariableName(); + + Pattern pattern = Pattern.compile("\\."); + Matcher matcher = pattern.matcher(name); + boolean containsInvalidCharacter = matcher.find(); + + if (name != null && containsInvalidCharacter){ + ValidationError error = traitValidatorErrors.getPeriodObsVarNameMsg(); + errors.addError(traitValidatorErrors.getRowNumber(i), error); + } + } + return errors; + } public List checkDuplicateTraitsExistingByName(UUID programId, List traits){ List duplicates = new ArrayList<>(); @@ -273,7 +294,8 @@ public Optional checkAllTraitValidations(List traits, T ValidationErrors dataConsistencyErrors = checkTraitDataConsistency(traits, traitValidatorError); ValidationErrors duplicateTraitsInFile = checkDuplicateTraitsInFile(traits, traitValidatorError); ValidationErrors fieldLengthError = checkTraitFieldsLength(traits, traitValidatorError); - validationErrors.mergeAll(requiredFieldErrors, dataConsistencyErrors, duplicateTraitsInFile, fieldLengthError); + ValidationErrors fieldFormatErrors = checkTraitFieldsFormat(traits, traitValidatorError); + validationErrors.mergeAll(requiredFieldErrors, dataConsistencyErrors, duplicateTraitsInFile, fieldLengthError, fieldFormatErrors); if (validationErrors.hasErrors()){ return Optional.of(validationErrors); From 9f936dfe085511e7fd3d66cffbde4e085120e9cd Mon Sep 17 00:00:00 2001 From: David Randolph Phillips Date: Mon, 28 Oct 2024 12:52:40 -0400 Subject: [PATCH 3/3] [BI-2328] added Unit test --- .../validators/TraitValidatorUnitTest.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/test/java/org/breedinginsight/services/validators/TraitValidatorUnitTest.java b/src/test/java/org/breedinginsight/services/validators/TraitValidatorUnitTest.java index 184e7308e..9eb1b727f 100644 --- a/src/test/java/org/breedinginsight/services/validators/TraitValidatorUnitTest.java +++ b/src/test/java/org/breedinginsight/services/validators/TraitValidatorUnitTest.java @@ -348,5 +348,26 @@ public void charLimitExceeded() { } } + @Test + @SneakyThrows + public void periodInName() { + + Trait trait = new Trait(); + trait.setObservationVariableName("Period.1"); + + ValidationErrors validationErrors = traitValidatorService.checkTraitFieldsFormat(List.of(trait), new TraitValidatorError()); + + assertEquals(1, validationErrors.getRowErrors().size(), "Wrong number of row errors returned"); + RowValidationErrors rowValidationErrors = validationErrors.getRowErrors().get(0); + assertEquals(1, rowValidationErrors.getErrors().size(), "Wrong number of errors for row"); + assertEquals(400, rowValidationErrors.getErrors().get(0).getHttpStatusCode(), "Wrong error code"); + assertEquals("observationVariableName", rowValidationErrors.getErrors().get(0).getField(), "Wrong error column"); + + //There should be no errors + Trait noPeriodTrait = new Trait(); + noPeriodTrait.setObservationVariableName("NoPeriod"); + validationErrors = traitValidatorService.checkTraitFieldsFormat(List.of(noPeriodTrait), new TraitValidatorError()); + assertEquals(0, validationErrors.getRowErrors().size(), "Wrong number of row errors returned"); + } }