Skip to content

Commit 98f448e

Browse files
authored
Merge pull request #11950 from IQSS/11900-improved-cvoc-value-validation
BugFix: controlled vocab values validation
2 parents 7edf3a0 + f234c28 commit 98f448e

3 files changed

Lines changed: 24 additions & 4 deletions

File tree

src/main/java/edu/harvard/iq/dataverse/DatasetFieldValidator.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,25 @@ public boolean isValid(DatasetField value, ConstraintValidatorContext context) {
5959
}
6060

6161
// if value is not primitive or not empty
62-
if (!dsfType.isPrimitive() || !StringUtils.isBlank(value.getValue())) {
62+
// For controlled vocabulary fields, check that actual CV values are selected,
63+
// not just that datasetFieldValues contains something (which might be an invalid N/A placeholder)
64+
// See https://github.com/IQSS/dataverse/issues/11900
65+
if (!dsfType.isPrimitive()) {
6366
return true;
6467
}
68+
69+
if (dsfType.isControlledVocabulary()) {
70+
// For CV fields, check if there are actual controlled vocabulary values selected
71+
if (value.getControlledVocabularyValues() != null && !value.getControlledVocabularyValues().isEmpty()) {
72+
return true;
73+
}
74+
// If no CV values, fall through to required field check below
75+
} else {
76+
// For non-CV primitive fields, check if value is not blank
77+
if (!StringUtils.isBlank(value.getValue())) {
78+
return true;
79+
}
80+
}
6581

6682
if (value.isRequired()) {
6783
String errorMessage = null;

src/main/java/edu/harvard/iq/dataverse/DatasetPage.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4039,8 +4039,8 @@ public String save() {
40394039
dataset.setOwner(ownerId != null ? dataverseService.find(ownerId) : null);
40404040
}
40414041
// Validate
4042-
Set<ConstraintViolation> constraintViolations = workingVersion.validate();
4043-
if (!constraintViolations.isEmpty()) {
4042+
workingVersion.validate(); // add validation messages to dataset fields
4043+
if (!workingVersion.isValid()) {
40444044
FacesContext.getCurrentInstance().validationFailed();
40454045
return "";
40464046
}

src/main/java/edu/harvard/iq/dataverse/engine/command/impl/AbstractDatasetCommand.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,10 +110,14 @@ protected void validateOrDie(DatasetVersion dsv, Boolean lenient) throws Command
110110
Set<ConstraintViolation> constraintViolations = dsv.validate();
111111
if (!constraintViolations.isEmpty()) {
112112
if (lenient) {
113-
// populate invalid fields with N/A
113+
// populate invalid primitive fields with N/A
114+
// Note: controlled vocabulary fields should NOT get N/A values in datasetfieldvalue,
115+
// as this creates an inconsistent state where the CV field appears valid but is empty.
116+
// See https://github.com/IQSS/dataverse/issues/11900
114117
constraintViolations.stream()
115118
.filter(cv -> cv.getRootBean() instanceof DatasetField)
116119
.map(cv -> ((DatasetField) cv.getRootBean()))
120+
.filter(f -> !f.getDatasetFieldType().isControlledVocabulary())
117121
.forEach(f -> f.setSingleValue(DatasetField.NA_VALUE));
118122

119123
} else {

0 commit comments

Comments
 (0)