diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/AbstractTransactionState.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/AbstractTransactionState.java index 1a0df5cfaf8bbe6342a4a64c1b2266cd7399fc58..3f1c33ce297f02a604961d0f952fbe8fe34304a6 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/AbstractTransactionState.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/AbstractTransactionState.java @@ -20,13 +20,12 @@ import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Queue; -import net.lemnik.eodsql.DynamicTransactionQuery; - import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel; import ch.systemsx.cisd.base.exceptions.IOExceptionUnchecked; import ch.systemsx.cisd.base.exceptions.InterruptedExceptionUnchecked; @@ -96,6 +95,8 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier; import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifierFactory; import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifierFactory; +import net.lemnik.eodsql.DynamicTransactionQuery; + /** * Abstract superclass for the states a DataSetRegistrationTransaction can be in. * @@ -183,6 +184,8 @@ public abstract class AbstractTransactionState<T extends DataSetInformation> private final List<ExperimentUpdatable> experimentsToBeUpdated = new ArrayList<ExperimentUpdatable>(); + private HashSet<String> registeredIdentifiers = new HashSet<>(); + private final List<Space> spacesToBeRegistered = new ArrayList<Space>(); private final List<Project> projectsToBeRegistered = new ArrayList<Project>(); @@ -571,6 +574,7 @@ public abstract class AbstractTransactionState<T extends DataSetInformation> Sample sample = new Sample(sampleIdentifierString, permId); sample.setSampleType(sampleTypeCode); samplesToBeRegistered.add(sample); + addIdentifier(sampleIdentifierString, "Sample"); return sample; } @@ -612,9 +616,19 @@ public abstract class AbstractTransactionState<T extends DataSetInformation> Sample sample = new Sample(sampleIdentifierString, permId); sample.setSampleType(sampleTypeCode); samplesToBeRegistered.add(sample); + addIdentifier(sampleIdentifierString, "Sample"); return sample; } + /// Asserts that given entity hasn't been yet created within this transaction + private void addIdentifier(String identifier, String entityKind) + { + String updatedId = entityKind + identifier.trim().toUpperCase(); + if (registeredIdentifiers.contains(updatedId)) + throw new IllegalArgumentException(entityKind + " with identifier " + identifier + " has already been created in this transaction"); + registeredIdentifiers.add(updatedId); + } + public IExperimentUpdatable getExperimentForUpdate(String experimentIdentifierString) { ExperimentIdentifier identifier = @@ -696,6 +710,7 @@ public abstract class AbstractTransactionState<T extends DataSetInformation> Experiment experiment = new Experiment(experimentIdentifierString, permId); experiment.setExperimentType(experimentTypeCode); experimentsToBeRegistered.add(experiment); + addIdentifier(experimentIdentifierString, "Experiment"); return experiment; } @@ -703,6 +718,7 @@ public abstract class AbstractTransactionState<T extends DataSetInformation> { Space space = new Space(spaceCode, spaceAdminUserIdOrNull); spacesToBeRegistered.add(space); + addIdentifier(spaceCode, "Space"); return space; } @@ -710,6 +726,7 @@ public abstract class AbstractTransactionState<T extends DataSetInformation> { Project project = new Project(projectIdentifier); projectsToBeRegistered.add(project); + addIdentifier(projectIdentifier, "Project"); return project; }