diff --git a/fairchive-webapp/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/AbstractDatasetCommand.java b/fairchive-webapp/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/AbstractDatasetCommand.java index d30576cc73..68f7f6295c 100644 --- a/fairchive-webapp/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/AbstractDatasetCommand.java +++ b/fairchive-webapp/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/AbstractDatasetCommand.java @@ -1,5 +1,18 @@ package edu.harvard.iq.dataverse.engine.command.impl; +import static java.util.stream.Collectors.joining; + +import java.sql.Timestamp; +import java.util.Date; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.validation.ConstraintViolation; + import edu.harvard.iq.dataverse.common.BundleUtil; import edu.harvard.iq.dataverse.engine.command.AbstractCommand; import edu.harvard.iq.dataverse.engine.command.CommandContext; @@ -11,6 +24,7 @@ import edu.harvard.iq.dataverse.globalid.FakePidProviderServiceBean; import edu.harvard.iq.dataverse.globalid.GlobalIdServiceBean; import edu.harvard.iq.dataverse.persistence.datafile.FileMetadata; +import edu.harvard.iq.dataverse.persistence.dataset.ControlledVocabularyValue; import edu.harvard.iq.dataverse.persistence.dataset.Dataset; import edu.harvard.iq.dataverse.persistence.dataset.DatasetField; import edu.harvard.iq.dataverse.persistence.dataset.DatasetFieldUtil; @@ -22,17 +36,6 @@ import edu.harvard.iq.dataverse.validation.field.FieldValidationResult; import io.vavr.control.Try; -import javax.validation.ConstraintViolation; -import java.sql.Timestamp; -import java.util.Date; -import java.util.Iterator; -import java.util.List; -import java.util.Set; -import java.util.logging.Level; -import java.util.logging.Logger; - -import static java.util.stream.Collectors.joining; - /** * Base class for commands that deal with {@code Dataset}s.Mainly here as a code * re-use mechanism. @@ -142,10 +145,13 @@ protected void validateOrDie(DatasetVersion dsv, Boolean lenient, CommandContext */ protected void tidyUpFields(DatasetVersion dsv) { removeBlankDatasetFields(dsv.getDatasetFields()); + + removeControlledVocabularyDuplicates(dsv.getDatasetFields()); updateDisplayOrder(dsv.getDatasetFields()); dsv.getDatasetFields().forEach(field -> field.trimTrailingSpaces()); + } /** @@ -274,4 +280,16 @@ private void handlePidReservation(Dataset theDataset, GlobalIdServiceBean global theDataset.setIdentifierRegistered(true); } } + + /* In theory this function shouldn't be needed but */ + private void removeControlledVocabularyDuplicates(final List fields) { + + final HashSet alreadySeen = new HashSet<>(); + for(final DatasetField field : fields) { + field.getControlledVocabularyValues(). + removeIf(value -> !alreadySeen.add(value)); + alreadySeen.clear(); + removeControlledVocabularyDuplicates(field.getChildren()); + } + } }