diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DefaultEntityOperationService.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DefaultEntityOperationService.java index ae6cacfd85436dc5181a55b820905b9d2b04a7ea..56329c9fcd46be4a036643726c21d37b963f9e87 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DefaultEntityOperationService.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DefaultEntityOperationService.java @@ -25,6 +25,7 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; import ch.systemsx.cisd.openbis.dss.generic.shared.dto.AtomicEntityOperationDetails; import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetRegistrationInformation; +import ch.systemsx.cisd.openbis.generic.server.business.bo.MaterialUpdateDTO; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewMaterial; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewProject; @@ -81,6 +82,7 @@ public class DefaultEntityOperationService<T extends DataSetInformation> impleme List<SampleUpdatesDTO> sampleUpdates = details.getSampleUpdates(); List<NewSample> sampleRegistrations = details.getSampleRegistrations(); Map<String, List<NewMaterial>> materialRegistrations = details.getMaterialRegistrations(); + List<MaterialUpdateDTO> materialUpdates = details.getMaterialUpdates(); List<DataSetBatchUpdatesDTO> dataSetUpdates = details.getDataSetUpdates(); List<NewExternalData> dataSetRegistrations = new ArrayList<NewExternalData>(); @@ -93,7 +95,7 @@ public class DefaultEntityOperationService<T extends DataSetInformation> impleme return new ch.systemsx.cisd.openbis.generic.shared.dto.AtomicEntityOperationDetails( details.getRegistrationId(), details.tryUserIdOrNull(), spaceRegistrations, projectRegistrations, experimentRegistrations, sampleUpdates, sampleRegistrations, - materialRegistrations, dataSetRegistrations, dataSetUpdates); + materialRegistrations, materialUpdates, dataSetRegistrations, dataSetUpdates); } } \ No newline at end of file diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/IDataSetRegistrationTransaction.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/IDataSetRegistrationTransaction.java index 75156ceae77c51cc5459fdcdae358cd299a834fc..48dd85ba877184d311b11864d3980095ce77e2e3 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/IDataSetRegistrationTransaction.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/IDataSetRegistrationTransaction.java @@ -172,6 +172,14 @@ public interface IDataSetRegistrationTransaction */ IMaterialImmutable getMaterial(String materialCode, String materialType); + /** + * Get a material from the openBIS AS for the purpose of modifying it. Returns null if the + * material does not exist. + * + * @return A material or null + */ + IMaterial getMaterialForUpdate(String materialCode, String materialType); + /** * Create a new material to register with the openBIS AS. * diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/AbstractTransactionState.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/AbstractTransactionState.java index 2842d473844f0686073948b59c80629f2def06e4..82fcd200321d7d94764f3bb02e547589ed70de45 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/AbstractTransactionState.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/AbstractTransactionState.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Map; 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; @@ -52,8 +53,10 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v1.ISampleImmuta import ch.systemsx.cisd.openbis.dss.generic.shared.dto.AtomicEntityOperationDetails; import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetRegistrationInformation; +import ch.systemsx.cisd.openbis.generic.server.business.bo.MaterialUpdateDTO; import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialIdentifier; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewMaterial; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewProject; @@ -162,6 +165,8 @@ public abstract class AbstractTransactionState<T extends DataSetInformation> private final List<Material> materialsToBeRegistered = new ArrayList<Material>(); + private final List<Material> materialsToBeUpdated = new ArrayList<Material>(); + private final Map<String, DynamicTransactionQuery> queriesToCommit = new HashMap<String, DynamicTransactionQuery>(); @@ -573,6 +578,24 @@ public abstract class AbstractTransactionState<T extends DataSetInformation> return material; } + public IMaterial getMaterialForUpdate(String materialCode, String materialType) + { + + MaterialIdentifier materialIdentifier = + new MaterialIdentifier(materialCode, materialType); + ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material materialOrNull = + openBisService.tryGetMaterial(materialIdentifier); + + Material result = null; + if (materialOrNull != null) + { + result = new Material(materialOrNull); + materialsToBeUpdated.add(result); + } + + return result; + } + public String moveFile(String src, IDataSet dst) { File srcFile = new File(src); @@ -822,6 +845,7 @@ public abstract class AbstractTransactionState<T extends DataSetInformation> List<SampleUpdatesDTO> sampleUpdates = convertSamplesToBeUpdated(); List<NewSample> sampleRegistrations = convertSamplesToBeRegistered(); Map<String, List<NewMaterial>> materialRegistrations = convertMaterialsToBeRegistered(); + List<MaterialUpdateDTO> materialUpdates = convertMaterialsToBeUpdated(); List<DataSetBatchUpdatesDTO> dataSetUpdates = convertDataSetsToBeUpdated(); // experiment updates not yet supported @@ -831,7 +855,8 @@ public abstract class AbstractTransactionState<T extends DataSetInformation> new AtomicEntityOperationDetails<T>(registrationId, getUserId(), spaceRegistrations, projectRegistrations, experimentUpdates, experimentRegistrations, sampleUpdates, sampleRegistrations, - materialRegistrations, dataSetRegistrations, dataSetUpdates); + materialRegistrations, materialUpdates, dataSetRegistrations, + dataSetUpdates); return registrationDetails; } @@ -913,6 +938,17 @@ public abstract class AbstractTransactionState<T extends DataSetInformation> return result; } + private List<MaterialUpdateDTO> convertMaterialsToBeUpdated() + { + List<MaterialUpdateDTO> result = new ArrayList<MaterialUpdateDTO>(); + for (Material material : materialsToBeUpdated) + { + MaterialUpdateDTO converted = ConversionUtils.convertToMaterialUpdateDTO(material); + result.add(converted); + } + return result; + } + @Override public boolean isCommitted() { diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/ConversionUtils.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/ConversionUtils.java index a6b60e9265cf0fbd436feeb070a111b5593e3fdd..cb5bfb7f1ce900e800f224b10f99e0e0e8fd23fa 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/ConversionUtils.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/ConversionUtils.java @@ -24,6 +24,7 @@ import ch.systemsx.cisd.common.exceptions.NotImplementedException; import ch.systemsx.cisd.common.types.BooleanOrUnknown; import ch.systemsx.cisd.etlserver.registrator.DataSetRegistrationDetails; import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; +import ch.systemsx.cisd.openbis.generic.server.business.bo.MaterialUpdateDTO; import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Code; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ContainerDataSet; @@ -355,4 +356,9 @@ public class ConversionUtils return newMaterial; } + public static MaterialUpdateDTO convertToMaterialUpdateDTO(Material material) + { + return new MaterialUpdateDTO(new TechId(material.getMaterial().getId()), material + .getMaterial().getProperties(), material.getMaterial().getModificationDate()); + } } diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransaction.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransaction.java index 354de43a9facc00ec1751021afbf64169a3a8bf0..c3cd6e828c89a3c8089777fa87e79d3bcbed10cb 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransaction.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransaction.java @@ -381,6 +381,12 @@ public class DataSetRegistrationTransaction<T extends DataSetInformation> implem return (null == materialOrNull) ? null : new MaterialImmutable(materialOrNull); } + @Override + public IMaterial getMaterialForUpdate(String materialCode, String materialType) + { + return getStateAsLiveState().getMaterialForUpdate(materialCode, materialType); + } + @Override public IMaterial createNewMaterial(String materialCode, String materialType) { diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/DataSetRegistrationTransactionV2Delegate.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/DataSetRegistrationTransactionV2Delegate.java index 24da50e4e04c56283bfd159507d73718af5e605d..b90833524e522cce6811ceb121aafd2a52081de3 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/DataSetRegistrationTransactionV2Delegate.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/DataSetRegistrationTransactionV2Delegate.java @@ -161,6 +161,12 @@ public class DataSetRegistrationTransactionV2Delegate implements IDataSetRegistr return transaction.getMaterial(materialCode, materialType); } + @Override + public IMaterial getMaterialForUpdate(String materialCode, String materialType) + { + return transaction.getMaterialForUpdate(materialCode, materialType); + } + @Override public IMaterial createNewMaterial(String materialCode, String materialType) { @@ -252,4 +258,5 @@ public class DataSetRegistrationTransactionV2Delegate implements IDataSetRegistr { return transaction.getExternalDataManagementSystem(externalDataManagementSystemCode); } + } diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/IDataSetRegistrationTransactionV2.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/IDataSetRegistrationTransactionV2.java index 29345b1546596aec918a78bb2aa95ee4f26c6f3c..2f104a258cb3dd3287e8a55e9ea8dcc9c0ebd9ad 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/IDataSetRegistrationTransactionV2.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/IDataSetRegistrationTransactionV2.java @@ -168,6 +168,13 @@ public interface IDataSetRegistrationTransactionV2 */ IMaterialImmutable getMaterial(String materialCode, String materialType); + /** + * Get a material from the openBIS AS. Returns null if the material does not exist. + * + * @return A material or null + */ + IMaterial getMaterialForUpdate(String materialCode, String materialType); + /** * Create a new material to register with the openBIS AS. * diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/dto/AtomicEntityOperationDetails.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/dto/AtomicEntityOperationDetails.java index 014d054dbb467a419f44ca0f64f27046d6443e28..2e57064d5a07c3bdf750334c25b15a0546828c61 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/dto/AtomicEntityOperationDetails.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/dto/AtomicEntityOperationDetails.java @@ -22,6 +22,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import ch.systemsx.cisd.openbis.generic.server.business.bo.MaterialUpdateDTO; import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewMaterial; @@ -62,6 +63,8 @@ public class AtomicEntityOperationDetails<T extends DataSetInformation> implemen private final Map<String /* material type */, List<NewMaterial>> materialRegistrations; + private final List<MaterialUpdateDTO> materialUpdates; + private final List<DataSetRegistrationInformation<T>> dataSetRegistrations; private final List<DataSetBatchUpdatesDTO> dataSetUpdates; @@ -72,6 +75,7 @@ public class AtomicEntityOperationDetails<T extends DataSetInformation> implemen List<NewExperiment> experimentRegistrations, List<SampleUpdatesDTO> sampleUpdates, List<NewSample> sampleRegistrations, Map<String, List<NewMaterial>> materialRegistrations, + List<MaterialUpdateDTO> materialUpdates, List<DataSetRegistrationInformation<T>> dataSetRegistrations, List<DataSetBatchUpdatesDTO> dataSetUpdates) { @@ -87,6 +91,7 @@ public class AtomicEntityOperationDetails<T extends DataSetInformation> implemen this.dataSetRegistrations = new ArrayList<DataSetRegistrationInformation<T>>(dataSetRegistrations); this.dataSetUpdates = new ArrayList<DataSetBatchUpdatesDTO>(dataSetUpdates); + this.materialUpdates = materialUpdates; } public TechId getRegistrationId() @@ -144,4 +149,8 @@ public class AtomicEntityOperationDetails<T extends DataSetInformation> implemen return materialRegistrations; } + public List<MaterialUpdateDTO> getMaterialUpdates() + { + return materialUpdates; + } }