diff --git a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/DataSetRegistrationIngestionService.java b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/DataSetRegistrationIngestionService.java index e94b1b60470c7eb0ade79ae654150e3a4169aa37..ff9501f12cffeb509ab1bb4772989792d31a15ff 100644 --- a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/DataSetRegistrationIngestionService.java +++ b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/DataSetRegistrationIngestionService.java @@ -138,6 +138,8 @@ class DataSetRegistrationIngestionService extends IngestionService<DataSetInform dataSetForUpdate.setSample(sample); dataSetForUpdate.setExperiment(experiment); dataSetForUpdate.setParentDatasets(dataSet.getParentDataSetCodes()); + + // synchronize property changes including properties that were set to empty values List<String> existingPropertyCodes = dataSetForUpdate.getAllPropertyCodes(); Set<String> newPropertyCodes = extractPropertyNames(dataSetProperties); for (NewProperty newProperty : dataSetProperties) diff --git a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/EntitySynchronizer.java b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/EntitySynchronizer.java index d95d501e8afcb724b271fd1c170e6e4f22d02d79..8574607bd5a1a3e46b3919e476ac19c65e88cd81 100644 --- a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/EntitySynchronizer.java +++ b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/EntitySynchronizer.java @@ -28,7 +28,6 @@ import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.HashSet; -import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Properties; @@ -745,8 +744,8 @@ public class EntitySynchronizer expUpdate.setProjectIdentifier(ExperimentIdentifierFactory.parse(incomingExp.getIdentifier())); expUpdate.setVersion(experiment.getVersion()); - List<IEntityProperty> newPropList = new LinkedList<IEntityProperty>(Arrays.asList(incomingExp.getProperties())); - appendRemovedProperties(newPropList, experiment.getProperties()); + List<IEntityProperty> newPropList = + prepareUpdatedPropertyList(incomingExp.getProperties(), experiment.getProperties()); expUpdate.setProperties(newPropList); expUpdate.setExperimentId(TechId.create(experiment)); @@ -771,8 +770,8 @@ public class EntitySynchronizer } else { - List<IEntityProperty> newPropList = new LinkedList<IEntityProperty>(Arrays.asList(incomingMaterial.getProperties())); - appendRemovedProperties(newPropList, material.getProperties()); + List<IEntityProperty> newPropList = + prepareUpdatedPropertyList(incomingMaterial.getProperties(), material.getProperties()); MaterialUpdateDTO update = new MaterialUpdateDTO(TechId.create(material), newPropList, @@ -962,8 +961,7 @@ public class EntitySynchronizer } String containerIdentifier = getContainerIdentifier(incomingSmp); - List<IEntityProperty> newPropList = new LinkedList<IEntityProperty>(Arrays.asList(incomingSmp.getProperties())); - appendRemovedProperties(newPropList, sample.getProperties()); + List<IEntityProperty> newPropList = prepareUpdatedPropertyList(incomingSmp.getProperties(), sample.getProperties()); SampleUpdatesDTO updates = new SampleUpdatesDTO(sampleId, newPropList, experimentIdentifier, @@ -974,10 +972,15 @@ public class EntitySynchronizer } } - private List<IEntityProperty> appendRemovedProperties(List<IEntityProperty> newPropList, List<IEntityProperty> existingProperties) + /** + * Pads out the incoming property lists with remaining properties set to "" This way any properties that were re-set (value removed) in the data + * source will be carried over to the harvester + */ + private List<IEntityProperty> prepareUpdatedPropertyList(IEntityProperty[] iEntityProperties, List<IEntityProperty> existingProperties) { + ArrayList<IEntityProperty> incomingProperties = new ArrayList<IEntityProperty>(Arrays.asList(iEntityProperties)); Set<String> existingPropertyNames = extractPropertyNames(existingProperties); - Set<String> newPropertyNames = extractPropertyNames(newPropList); + Set<String> newPropertyNames = extractPropertyNames(incomingProperties); existingPropertyNames.removeAll(newPropertyNames); for (String propName : existingPropertyNames) @@ -987,9 +990,9 @@ public class EntitySynchronizer propertyType.setCode(propName); property.setPropertyType(propertyType); property.setValue(""); - newPropList.add(property); + incomingProperties.add(property); } - return newPropList; + return incomingProperties; } private Set<String> extractPropertyNames(List<IEntityProperty> existingProperties)